mongodb備份和恢復:mongodump/mongorestore ( 一)


網絡上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小時)。

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM