網絡上mongorestore都寫成mongorerstore抄襲成性
1 備份(mongodump)
該命令能夠導出全部數據到指定文件夾中。
-h:指明數據庫宿主機的IP
-u:指明數據庫的用戶名
-p:指明數據庫的密碼
-d:指明數據庫的名字
-c:指明collection的名字
-o:指明到要導出的文件名
-q:指明導出數據的過濾條件
2 恢復(mongorestore)
參數說明:
-h:指明數據庫宿主機的IP
-u:指明數據庫的用戶名
-p:指明數據庫的密碼
-d:指明數據庫的名字
-c:指明collection的名字
-o:指明到要備份的文件名
-q:指明備份數據的過濾條件
3 基本例子
3.0之前例子
備份指定數據庫(之前文件夾要自己創建):
備份本地的annosys數據庫到/data/backup/dump文件,會自動出現annosys文件夾
mongodump -h localhost:27017 -d annosys -o /data/backup/dump
從指定目錄恢復數據庫annosys,注意目錄是否包含數據庫名
mongorestore -h localhost:27017 -d annosys --directoryperdb /data/backup/dump
mongorestore -h localhost:27017 -d annosys --drop data/backup/test/
3.0之后例子
mongodb3.0后mongorestore的--directoryperdb被砍了
mongodump -h localhost:27017 -d annosys -o /data/backup/dump
mongorestore -h localhost:27017 /data/backup/dump
4 備份全庫的重要選項是--oplog:
mongodump有一個值得一提的選項是--oplog,注意這是replica set或者master/slave模式專用,standalone模式運行mongodb並不推薦。
來看看mongodump的選項:
--oplog選項只對全庫導出有效,所以不能指定-d選項
--oplog的作用:oplog的冪等性:已存在的數據,重做oplog不會重復;不存在的數據重做oplog就可以進入數據庫。所以當做完截止到某個時間點的oplog時,數據庫就恢復到了截止那個時間點的狀態。
來看看mongorestore的選項。
--oplogReplay:可以重放oplog.bson中的操作內容
--oplogLimit:回放的時間節點,即此時間之前的數據恢復,假設你后面有誤操作,誤操作的不回復
mongodump -h localhost:27017 -o /data/backup/dump --oplog
mongorestore -h localhost:27017 --drop data/backup/db/
mongorestore -h localhost:27017 --oplogReplay dump
查詢誤操作的最后時間
bsondump oplog.bson | grep "\"op\":\"d\"" | head
mongorestore -h localhost:27017 --oplogReplay --oplogLimit "1443024507:1" dump/
5 mongodb的mongodump/mongorestore和是mongoexport/mongoimport區別
mongodump/mongorestore之外還有一對組合是mongoexport/mongoimport,他們本質是存儲BSON格式和JSON格式,所以BSON格式和JSON格式區別在哪里?
(1)mongodump/mongorestore導入/導出的是BSON格式, mongoexport/mongoimport導入/導出的是JSON格式。
(2)BSON則是二進制文件,體積小但對人類幾乎沒有可讀性,JSON可讀性強但體積較大。
(3)跨版本的mongodump/mongorestore要做請先檢查文檔看兩個版本是否兼容(大部分時候)。在一些mongodb版本之間,BSON格式可能會隨版本不同而有所不同,所以不同版本之間用mongodump/mongorestore可能不會成功,具體要看版本之間的兼容性。當無法使用BSON進行跨版本的數據遷移的時候,使用JSON格式即mongoexport/mongoimport是一個可選項。。
(4)JSON雖然具有較好的跨版本通用性,但其只保留了數據部分,不保留索引,賬戶等其他基礎信息。使用時應該注意。
總結:
如果使用mongodump/mongorestore,可以保留索引和數據和賬戶信息,省心省力。
如果使用mongodump/mongorestore, 要檢查mongo文檔版本是否兼容。記得把mongodb的版本記好,尤其是使用docker/mongo鏡像,很容易出現版本問題,版本要寫在配置文件中。
如果使用mongoexport/mongoimport,不能保留索引和數據和賬戶信息等。
如果使用mongoexport/mongoimport, 不用檢查mongo文檔版本是否兼容,有跨版本通用性。
但嚴格地說,mongoexport/mongoimport的主要作用還是導入/導出數據時使用,並不是一個真正意義上的備份工具,因此還是檢查mongo版本,采用mongodump/mongorestore。
6 用shell腳本實現MongoDB數據庫自動備份,沒有pymongo腳本實現備份
一、創建MongoDB備份目錄 mkdir -p /data/www/backup/temp mkdir -p /data/www/backup/final /data/backup/mongo_backup.sh 二、創建MongoDB數據庫備份腳本mongo_backup.sh #!/bin/bash # 將版本信息寫入文件 mongo --version > mongo_version.txt # mac DUMP=mongodump #mongodump命令路徑 # linux # DUMP=/usr/local/mongodb/bin/mongodump #mongodump命令路徑 OUT_DIR=/data/backup/temp #臨時備份目錄 TAR_DIR=/data/backup/final #備份存放路徑 DATE=`date +%Y_%m_%d` #獲取當前系統時間 TAR_BAK="mongodb_backup_$DATE.tar.gz" #最終保存的數據庫備份文件 DB_HOST=localhost:27017 DB_USER= #數據庫賬號 DB_PASS= #數據庫密碼 DAYS=15 #DAYS=15代表刪除15天前的備份,即只保留近15天的備份 # 進入臨時目錄刪空文件夾內容,根據當前時間重建文件 cd $OUT_DIR rm -rf $OUT_DIR/* mkdir -p $OUT_DIR/$DATE # 備份全部數據庫,並壓縮 echo "backup start" # $DUMP -h $DB_HOST -u $DB_USER -p $DB_PASS --authenticationDatabase "admin" -o # $OUT_DIR/$DATE $DUMP -h $DB_HOST --authenticationDatabase "admin" -o $OUT_DIR/$DATE # 壓縮為.tar.gz格式 tar -czvf $TAR_DIR/$TAR_BAK $OUT_DIR/$DATE # 解壓 tar -xzvf $OUT_DIR/$DATE 竟然解壓不了 #刪除DAYS天前的備份文件 find $TAR_DIR/ -mtime +$DAYS -delete echo "backup end" exit 三、sudo chmod +x mongo_backup.sh 四、運行 sh mongo_backup.sh 五、目錄查看 六、數據恢復 備份時間下的文件有:annosys,admin,mydb mongorestore -h 127.0.0.1:27017 -d annosys /data/backup/temp/2019_01_09 七:進入數據庫查看 show dbs use annoys db.annosys.find() 八、添加定時任務: crontab -e 1 0 * * * /bin/bash /data/backup/mongo_backup.sh >> m.log
7 crontab
Cron 各項的描述 以下是 crontab 文件的格式: 分時日月周 {minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script} (1)minute: 區間為 0 – 59分 (2)hour: 區間為0 – 23 時 (3)day-of-month: 區間為0 – 31日 (4)month: 區間為1 – 12月 (5)Day-of-week: 區間為0 – 7,周日可以是0或7 (6)* 代表全部 crontab -e (1)每天凌晨1分開始備份,這是一個恰當的進行備份的時間,因為此時系統負載不大。 1 0 * * * /data/backup/monbp.sh (2)每個工作日(Mon – Fri) 11:59 p.m 都進行備份作業。 59 11 * * 1,2,3,4,5 /data/backup/mongo_backup.sh 59 11 * * 1-5 /data/backup/mongo_backup.sh (3)每5分鍾運行一次命令 */5 * * * * /data/backup/monbp.sh (4)每個月的第一天 13:10 p.m 運行 10 13 1 * * /root/bin/full-backup.sh (5)每個工作日 11 p.m 運行。 0 23 * * 1-5 /root/bin/incremental-backup.sh crontab -l #查看你的任務 crontab -e#編輯你的任務 crontab -r#刪除用戶的crontab的內容
假如要每4個小時的第1分鍾備份一次,那么應該是
1 */4 * * * /bin/bash /data/www/backup/monbp.sh >> /data/www/backup/bp.log 2>&1
如果寫成那么每4個小時的那一個小時的0-59分鍾都備份一次也就是60次:
* */4 * * * /bin/bash /data/www/backup/monbp.sh >> /data/www/backup/bp.log 2>&1
8 刪除之前的日志文件find -mtime
find $TAR_DIR/ -mtime +$DAYS -delete #mtime參數的理解應該如下: -mtime n 按照文件的更改時間來找文件,n為整數。 n表示文件更改時間距離為n天, -n表示文件更改時間距離在n天以內,+n表示文件更改時間距離在n天以前。 例如: -mtime 0 表示文件修改時間距離當前為0天的文件,即距離當前時間不到1天(24小時)以內的文件。 -mtime 1 表示文件修改時間距離當前為1天的文件,即距離當前時間1天(24小時-48小時)的文件。 -mtime+1 表示文件修改時間為大於1天的文件,即距離當前時間2天(48小時)之外的文件 -mtime -1 表示文件修改時間為小於1天的文件,即距離當前時間1天(24小時)之內的文件 為什么-mtime+1 表示文件修改時間為大於1天的文件,即距離當前時間48小時之外的文件,而不是24小時之外的呢? 因為n值只能是整數,即比1大的最近的整數是2,所有-mtime+1不是比當前時間大於1天(24小時),而是比當前時間大於2天(48小時)。