前言
前段時間,個人小程序 因服務器磁盤空間被占滿,導致MongoDB掛了。清理了一些無用的數(shù)據(jù)后,重啟MongoDB,竟然無法啟動,一番折騰(20分鐘)后,總算修復了。這讓我意識到:雖然是個人小項目,但也必須定期備份啊,否則數(shù)據(jù)丟了很尷尬的說。
碎碎念
我不是MongoDB高手,之所以選擇MongoDB,是因為需求不明確——MongoDB很適合不明確需求場景的開發(fā)。
個人對Elasticsearch更熟悉,Elasticsearch也很適合不定需求的業(yè)務開發(fā);但個人服務器只有1G內(nèi)存,用Elasticsearch得升級服務器,得花好多錢啊啊啊。
MongoDB備份比較簡單,只需用內(nèi)置的 mongodump 即可,命令格式如下:
mongodump -h {mongodb主機名}:{端口} -u {賬號} -p {密碼} -d {數(shù)據(jù)庫名稱} -o {存儲路徑}
然而,筆者為MongoDB設置的密碼是帶有特殊字符的,例如 @#$\ 之類,直接以如上形式執(zhí)行命令,會報錯!
所以筆者選擇不帶 -p 參數(shù)執(zhí)行命令,即:
mongodump -h {mongodb主機名}:{端口} -u {賬號} -d {數(shù)據(jù)庫名稱} -o {存儲路徑}
然后,命令提示符會提示輸入密碼。例如
# mongodump -h 127.0.0.1 -u user -d itmuch -o /tmp/somepathEnter password:
至此已實現(xiàn)MongoDB的備份。然而,手動備份還是挺麻煩的,怎么實現(xiàn)備份的自動化呢?
自動備份
正常來說,自動備份是比較簡單的——只需將手動備份的命令做成Shell腳本,并設置定時任務即可。然而,筆者的場景,命令是需要交互式輸入密碼的啊!
怎么才能自動輸入密碼呢?expect 登場了——一款提供自動交互的工具。
安裝expect
編寫expect腳本
expect語法非常簡單,和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:關鍵字
expect "password:"
# 將密碼發(fā)送過去,注意最后的換行不能少,否則得人工輸入回車。
send "密碼\r"
# 停留在遠程控制臺,沒有這行就會直接返回本地控制臺,而不等shell執(zhí)行完
interact
注釋很全面了,聰明的你閱讀肯定沒有壓力。最終備份出來的文件會存放在 /xxxxx/dbbak-備份日期 目錄中。
自動備份
筆者利用Linux定時任務實現(xiàn)自動執(zhí)行。
在新窗口中添加如下內(nèi)容:
0 0 1 * * ? /usr/bin/expect 上面expect shell的完整路徑
原本以為這樣就可以定時執(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:關鍵字
expect "password:"
# 將密碼發(fā)送過去,注意最后的換行不能少,否則得人工輸入回車。
send "密碼\r"
set timeout 120
expect eof
exit
總結
本文沒什么難點,都是一些細節(jié)——
- 因為密碼含有特殊字符,所以需要交互式輸入密碼;
- 因為要交互式輸入密碼,所以使用了expect
寫出來主要是總結下踩到的坑,另外,expect是一款通用的提供自動交互的工具,用來實現(xiàn)ssh的自動登錄、sftp的自動登錄、mysql的自動登錄等。腳本的套路都和本文展示的結構基本類似。
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
您可能感興趣的文章:- Windows下自動備份MongoDB的批處理腳本
- Linux下MongoDB數(shù)據(jù)庫實現(xiàn)自動備份詳解
- Linux中MongoDB如何實現(xiàn)遠程自動備份詳解