MongoDB實(shí)現(xiàn)自動(dòng)備份的全過程記錄
前言
前段時(shí)間,個(gè)人小程序 因服務(wù)器磁盤空間被占滿,導(dǎo)致MongoDB掛了。清理了一些無(wú)用的數(shù)據(jù)后,重啟MongoDB,竟然無(wú)法啟動(dòng),一番折騰(20分鐘)后,總算修復(fù)了。這讓我意識(shí)到:雖然是個(gè)人小項(xiàng)目,但也必須定期備份啊,否則數(shù)據(jù)丟了很尷尬的說(shuō)。
碎碎念
我不是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ù)庫(kù)名稱} -o {存儲(chǔ)路徑}
然而,筆者為MongoDB設(shè)置的密碼是帶有特殊字符的,例如 @#$\ 之類,直接以如上形式執(zhí)行命令,會(huì)報(bào)錯(cuò)!
所以筆者選擇不帶 -p 參數(shù)執(zhí)行命令,即:
mongodump -h {mongodb主機(jī)名}:{端口} -u {賬號(hào)} -d {數(shù)據(jù)庫(kù)名稱} -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)備份
正常來(lái)說(shuō),自動(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語(yǔ)法非常簡(jiǎn)單,和Shell幾乎一樣。筆者的腳本編寫如下:
#!/bin/expect # spawn是expect的語(yǔ)句,執(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
注釋很全面了,聰明的你閱讀肯定沒有壓力。最終備份出來(lái)的文件會(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í)行了,然而卻無(wú)法正常執(zhí)行。
百度后,將腳本修改為如下,終于可以正常執(zhí)行了。
#!/bin/expect # spawn是expect的語(yǔ)句,執(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
寫出來(lái)主要是總結(jié)下踩到的坑,另外,expect是一款通用的提供自動(dòng)交互的工具,用來(lái)實(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ì)腳本之家的支持。
相關(guān)文章
mongodb replica set 添加刪除節(jié)點(diǎn)的2種方法
replica set多服務(wù)器主從,添加,刪除節(jié)點(diǎn),肯定會(huì)經(jīng)常遇到的。下面詳細(xì)說(shuō)明一下,添加,刪除節(jié)點(diǎn)的2種方法。2014-07-07mongodb數(shù)據(jù)庫(kù)實(shí)驗(yàn)之增刪查改
這篇文章主要介紹了mongodb數(shù)據(jù)庫(kù)實(shí)驗(yàn)之增刪查改的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11SpringBoot?整合mongoDB并自定義連接池的示例代碼
這篇文章主要介紹了SpringBoot?整合mongoDB并自定義連接池?,整合mongoDB的目的就是想用它給我們提供的mongoTemplate,它可以很容易的操作mongoDB數(shù)據(jù)庫(kù),對(duì)整合過程及實(shí)例代碼感興趣的朋友跟隨小編一起看看吧2022-02-02Mongodb解決不能連接到服務(wù)器的錯(cuò)誤問題
這篇文章主要介紹了Mongodb解決不能連接到服務(wù)器的錯(cuò)誤問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01利用MongoDB中oplog機(jī)制實(shí)現(xiàn)準(zhǔn)實(shí)時(shí)數(shù)據(jù)的操作監(jiān)控
MongoDB 的Replication是通過一個(gè)日志來(lái)存儲(chǔ)寫操作的,這個(gè)日志就叫做oplog,而下面這篇文章主要給大家介紹了利用MongoDB中oplog機(jī)制實(shí)現(xiàn)準(zhǔn)實(shí)時(shí)數(shù)據(jù)的操作監(jiān)控的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-05-05MongoDB快速入門筆記(一)之windows下安裝MongoDB方法
MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)。由 C++ 語(yǔ)言編寫。本文重點(diǎn)給大家介紹MongoDB快速入門筆記(一)之windows下安裝MongoDB方法,非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起看下吧2016-06-06MongoDB教程之?dāng)?shù)據(jù)操作實(shí)例
這篇文章主要介紹了MongoDB教程之?dāng)?shù)據(jù)操作實(shí)例,本文講解了批量插入、數(shù)據(jù)庫(kù)清除、數(shù)據(jù)更新、修改器、數(shù)組修改器、upsert等內(nèi)容,需要的朋友可以參考下2015-05-05MongoDB數(shù)據(jù)庫(kù)安裝配置、基本操作實(shí)例詳解
這篇文章主要介紹了MongoDB數(shù)據(jù)庫(kù)安裝配置、基本操作,結(jié)合實(shí)例形式詳細(xì)分析了MongoDB數(shù)據(jù)庫(kù)安裝配置具體步驟、相關(guān)命令與基本操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2020-01-01