a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 數(shù)據(jù)庫 > MongoDB > 正文

MongoDB實(shí)現(xiàn)自動(dòng)備份的全過程記錄

2020-10-29 18:41:55
字體:
供稿:網(wǎng)友

前言

前段時(shí)間,個(gè)人小程序 因服務(wù)器磁盤空間被占滿,導(dǎo)致MongoDB掛了。清理了一些無用的數(shù)據(jù)后,重啟MongoDB,竟然無法啟動(dòng),一番折騰(20分鐘)后,總算修復(fù)了。這讓我意識(shí)到:雖然是個(gè)人小項(xiàng)目,但也必須定期備份啊,否則數(shù)據(jù)丟了很尷尬的說。

碎碎念

我不是MongoDB高手,之所以選擇MongoDB,是因?yàn)樾枨蟛幻鞔_――MongoDB很適合不明確需求場(chǎng)景的開發(fā)。

個(gè)人對(duì)Elasticsearch更熟悉,Elasticsearch也很適合不定需求的業(yè)務(wù)開發(fā);但個(gè)人服務(wù)器只有1G內(nèi)存,用Elasticsearch得升級(jí)服務(wù)器,得花好多錢啊啊啊。

MongoDB備份比較簡(jiǎn)單,只需用內(nèi)置的 mongodump 即可,命令格式如下:

mongodump -h {mongodb主機(jī)名}:{端口} -u {賬號(hào)} -p {密碼} -d {數(shù)據(jù)庫名稱} -o {存儲(chǔ)路徑}

然而,筆者為MongoDB設(shè)置的密碼是帶有特殊字符的,例如 @#$/ 之類,直接以如上形式執(zhí)行命令,會(huì)報(bào)錯(cuò)!

所以筆者選擇不帶 -p 參數(shù)執(zhí)行命令,即:

mongodump -h {mongodb主機(jī)名}:{端口} -u {賬號(hào)} -d {數(shù)據(jù)庫名稱} -o {存儲(chǔ)路徑}

然后,命令提示符會(huì)提示輸入密碼。例如

# mongodump -h 127.0.0.1 -u user -d itmuch -o /tmp/somepathEnter password: 

至此已實(shí)現(xiàn)MongoDB的備份。然而,手動(dòng)備份還是挺麻煩的,怎么實(shí)現(xiàn)備份的自動(dòng)化呢?

自動(dòng)備份

正常來說,自動(dòng)備份是比較簡(jiǎn)單的――只需將手動(dòng)備份的命令做成Shell腳本,并設(shè)置定時(shí)任務(wù)即可。然而,筆者的場(chǎng)景,命令是需要交互式輸入密碼的啊!

怎么才能自動(dòng)輸入密碼呢?expect 登場(chǎng)了――一款提供自動(dòng)交互的工具。

安裝expect

yum install -y expect 

編寫expect腳本

expect語法非常簡(jiǎn)單,和Shell幾乎一樣。筆者的腳本編寫如下:

#!/bin/expect # spawn是expect的語句,執(zhí)行命令前需添加該字眼 set DATE [exec date "+%Y-%m-%d"] set DIR /xxxxx/dbbak-$DATE spawn rm -rf $DIR spawn echo 'removing...$DIR' spawn mongodump -h {host:port} -u {user} -d {dbname} -o $DIR # 交互獲取是否返回password:關(guān)鍵字 expect "password:" # 將密碼發(fā)送過去,注意最后的換行不能少,否則得人工輸入回車。 send "密碼/r" # 停留在遠(yuǎn)程控制臺(tái),沒有這行就會(huì)直接返回本地控制臺(tái),而不等shell執(zhí)行完 interact 

注釋很全面了,聰明的你閱讀肯定沒有壓力。最終備份出來的文件會(huì)存放在 /xxxxx/dbbak-備份日期 目錄中。

自動(dòng)備份

筆者利用Linux定時(shí)任務(wù)實(shí)現(xiàn)自動(dòng)執(zhí)行。

crontab -e 

在新窗口中添加如下內(nèi)容:

0 0 1 * * ? /usr/bin/expect 上面expect shell的完整路徑 

原本以為這樣就可以定時(shí)執(zhí)行了,然而卻無法正常執(zhí)行。

百度后,將腳本修改為如下,終于可以正常執(zhí)行了。

#!/bin/expect # spawn是expect的語句,執(zhí)行命令前需添加該字眼 set DATE [exec date "+%Y-%m-%d"] set DIR /xxxxx/dbbak-$DATE spawn rm -rf $DIR spawn echo 'removing...$DIR' spawn mongodump -h {host:port} -u {user} -d {dbname} -o $DIR # 交互獲取是否返回password:關(guān)鍵字 expect "password:" # 將密碼發(fā)送過去,注意最后的換行不能少,否則得人工輸入回車。 send "密碼/r"  set timeout 120 expect eof  exit 

總結(jié)

本文沒什么難點(diǎn),都是一些細(xì)節(jié)――

  • 因?yàn)槊艽a含有特殊字符,所以需要交互式輸入密碼;
  • 因?yàn)橐换ナ捷斎朊艽a,所以使用了expect

寫出來主要是總結(jié)下踩到的坑,另外,expect是一款通用的提供自動(dòng)交互的工具,用來實(shí)現(xiàn)ssh的自動(dòng)登錄、sftp的自動(dòng)登錄、mysql的自動(dòng)登錄等。腳本的套路都和本文展示的結(jié)構(gòu)基本類似。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)武林網(wǎng)的支持。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 性色av一二三杏吧传媒 | 国产1区在线观看 | 免费黄色片一区二区 | 精品国产乱码久久久久久蜜柚 | 国产成人免费视频网站高清观看视频 | 日韩一区二区三区精品 | 久久精品视 | 国产一区二区影院 | 3bmm在线观看视频免费 | 日中文字幕在线 | 婷婷色婷婷 | 欧美精品在线视频 | 国产小视频在线播放 | 国产一级毛片国语一级 | 97视频在线免费观看 | 国产精品久久久视频 | 亚洲自拍一区在线观看在线观看 | 国产精品福利久久 | 色花av| 精品毛片 | 欧美激情自拍偷拍 | 在线观看一级片 | 国产一级中文字幕 | 不卡三区 | 国产成人精品一区二区三区四区 | av电影手机在线看 | 亚洲成人在线视频观看 | 免费av在线网站 | 91精品一区二区三区久久久久久 | 亚洲二区在线 | 红色av社区 | 日韩中文字幕一区 | 一区二区三区四区在线视频 | 国产精品久久久久久久久久久久冷 | 国产女人高潮大叫a毛片 | 91欧美| 欧美不卡二区 | 成人性大片免费观看网站 | 91麻豆精品国产91久久久久 | 国产精品久久久久久av公交车 | 91精品国产欧美一区二区成人 |