自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MongoDB自動(dòng)備份全過(guò)程實(shí)錄

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

MongoDB自動(dòng)備份全過(guò)程實(shí)錄

前段時(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)景的開(kāi)發(fā)。

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

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

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

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

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

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

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

  1. # 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

  1. yum install -y expect 

編寫expect腳本

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

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

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

自動(dòng)備份

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

  1. crontab -e 

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

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

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

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

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

總結(jié)

本文沒(méi)什么難點(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)基本類似。 

責(zé)任編輯:龐桂玉 來(lái)源: 數(shù)據(jù)庫(kù)開(kāi)發(fā)
相關(guān)推薦

2011-02-22 10:46:02

Samba配置

2009-12-08 17:56:16

WCF配置

2011-04-18 15:56:10

軟件測(cè)試

2011-09-06 15:38:20

QT安裝

2011-01-21 17:51:52

2009-04-13 12:37:18

2011-08-15 09:19:22

2009-06-10 16:55:42

cygwin netb安裝

2010-03-01 17:01:03

Python編程技巧

2010-03-10 13:24:45

Zend Debugg

2010-06-17 13:10:09

Linux Grub修

2010-11-19 10:11:49

Oracle物化視圖

2012-11-06 10:19:18

Java自定義加載Java類

2011-03-11 10:39:02

YUM安裝LAMP

2010-07-21 14:51:19

telnet-serv

2010-06-12 10:03:20

Ubuntu Grub

2009-12-15 16:51:32

2010-02-23 11:35:38

Python 項(xiàng)目測(cè)試

2010-06-11 13:15:07

UML軟件

2011-06-24 13:08:34

Qt Qt 4.5.3 移植
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)