一 MongoDB備份
1.1 備份概述
mongodb數據備份和還原主要分爲二種,一種是針對於庫的mongodump和mongorestore,一種是針對庫中表的mongoexport和mongoimport。
mongodump備份的原理是經過一次查詢獲取當前服務器快照,並將快照寫入磁盤中,所以這種方式保存的也不是實時的。在獲取快照後,服務器還會有數據寫入,爲了保證備份的安全,能夠利用fsync鎖使服務器數據暫時寫入緩存中。
mongodb備份恢復方式一般有如下三種:
- 文件快照方式
- 複製數據文件方式
- 使用mongodump和mongorestore方式
1.2 文件快照方式
此方式相對簡單,須要系統文件支持快照和mongod必須啓用journal。能夠在任什麼時候刻建立快照。
恢復時,確保沒有運行mongod,執行快照恢復操做命令,而後啓動mongod進程,mongod將重放journal日誌。
1.3 複製數據文件方式
直接拷貝數據目錄下的一切文件,可是在拷貝過程當中必須阻止數據文件發生更改。所以須要對數據庫加鎖,以防止數據寫入。
1 > db.fsyncLock() #鎖定,將阻塞寫入操做,並將髒數據刷新到磁盤上,確保數據一致。
2 # cp -R /data/db/* /backup #拷貝數據文件到備份目錄下
3 > db.fsyncUnlock() #文件複製完成後,對數據庫進行解鎖,容許寫操做
注意: 在執行db.fsyncLock()和db.fsyncUnlock()時,不能關閉當前的shell窗口,不然可能沒法鏈接而須要從新啓動mongod服務。
恢復時,確保mongod沒有運行,清空數據目錄,將備份的數據拷貝到數據目錄下,而後啓動mongod
1 # cp -R /backup/* /data/db/
2 # mongod -f mongod.conf
1.4 mongodump數據備份
在Mongodb中咱們使用mongodump命令來備份MongoDB數據。該命令能夠導出全部數據到指定目錄中。
mongodump命令能夠經過參數指定導出的數據量級轉存的服務器。
語法格式:
1 > mongodump -h IP --port 端口 -u 用戶名 -p 密碼 -d 數據庫 -o 文件存在路徑
參數解釋:
參數
|
全稱
|
默認值
|
參考釋義
|
|
--help
|
|
查看mongodump命令的使用幫助
|
|
--version
|
|
返回mongodump的版本號
|
-h
|
--host <hostname><:port>
|
localhost:27017
|
指定mongod要鏈接的主機名及端口號
|
-u
|
--username <username>
|
|
指定用於向開啓認證的MongoDB數據庫的用戶名,與--password和--authenticationDatabase結合使用。
|
-p
|
--password <password>
|
|
指定用於向使用認證的MongoDB數據庫的密碼,與--username和 --authenticationDatabase選項結合使用。
|
-d
|
--db <database>
|
|
指定要備份的數據庫。若是不指定,mongodump會將此實例中的全部數據庫備份。
|
-c
|
--collection <collection>
|
|
指定要備份的集合。若是不指定,則會將指定數據庫或實例中的全部集合備份。
|
|
--gzip
|
|
壓縮輸出,若是mongodump指定導出到目錄,則該選項會將每一個文件都壓縮,並添加.gz後綴;
若是mongodump指定導出到文檔或標準輸出流,則該選項會壓縮到文檔或輸出流中。
|
-o
|
--out <path>
|
|
指定導出數據的目錄路徑,如不指定,則mongodump默認將文件輸出到dump所在的工做目錄中。該選項不能和--archive一塊兒使用
|
提示:
若是沒有用戶誰,能夠去掉-u和-p;
若是導出本機的數據庫,能夠去掉-h;
若是是默認端口,能夠去掉--port;
若是想導出全部數據庫,能夠去掉-d。
fsyncLock與mongodump不能一塊兒使用,若是數據庫被鎖定了,mongodump將永遠掛起。使用mongodump備份比較慢。一般mongodump用來備份單個數據庫、集合、子集合。
1.5 mongorestore數據恢復
在Mongodb中咱們使用mongorestore命令來恢復MongoDB數據。該命令能夠從指定目錄恢復相應數據。
語法格式:
1 > mongorestore -h IP --port 端口 -u 用戶名 -p 密碼 -d 數據庫 <path> --dir 文件存在路徑
參數解釋:
參數
|
全稱
|
默認值
|
參考釋義
|
|
--help
|
|
查看mongorestore命令的使用幫助
|
|
--version
|
|
返回mongorestore的版本號
|
-h
|
--host <hostname><:port>
|
localhost:27017
|
指定mongod要鏈接的主機名及端口號
|
-u
|
--username <username>
|
|
指定用於向開啓認證的MongoDB數據庫的用戶名,與--password和--authenticationDatabase結合使用。
|
-p
|
--password <password>
|
|
指定用於向使用認證的MongoDB數據庫的密碼,與--username和 --authenticationDatabase選項結合使用。
|
-d
|
--db <database>
|
|
指定須要恢復的數據庫實例。能夠和備份時的數據庫名稱不同。
|
-c
|
--collection <collection>
|
|
指定要備份的集合。若是不指定,則會將指定數據庫或實例中的全部集合備份。
|
|
<path>
|
|
mongorestore 最後的一個參數,設置備份數據實例所在位置。
|
|
--dir <path>
|
|
指定備份數據所在的目錄路徑。
|
|
--drop
|
|
恢復的時候,先刪除當前數據,而後恢復備份的數據。就是說,備份後至恢復操做中間時間段添加修改的數據都會被刪除,慎用!
|
注意:不能同時指定 <path> 和 --dir 選項。
二 mongodump備份實例
2.1 模擬插入數據
1 [root@client ~]# mongo --host 172.24.8.71 -u admin -p admin
2 > use admin
3 > db.grantRolesToUser( "admin",[{ role: "dbOwner",db:"mydb" }])
4 > db.grantRolesToUser( "admin",[{ role: "restore",db:"admin" }])
5 > db.grantRolesToUser( "admin",[{ role: "backup",db:"admin" }])
6 > use mydb
7 > for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})}
2.2 備份全部數據
1 [root@client ~]# mongodump --host 172.24.8.71 -u admin -p admin -o allbackup/
2.3 備份指定數據
1 [root@client ~]# mongodump --host 172.24.8.71 -d mydb -u admin -p admin -o mydbbackup/ --authenticationDatabase admin
2.4 備份指定集合
1 [root@client ~]# mongodump --host 172.24.8.71 -d mydb -c user -u admin -p admin -o usercobackup/ --authenticationDatabase admin
提示:嚴格來講,備份只須要讀權限便可。
三 mongorestore還原實例
3.1 恢復全部數據庫
1 [root@client ~]# mongorestore --host 172.24.8.71 -u admin -p admin --dir allbackup/
3.2 恢復指定數據
1 [root@client ~]# mongorestore --host 172.24.8.71 -d mydb -u admin -p admin --dir mydbbackup/mydb/ --authenticationDatabase admin
3.3 恢復指定集合
1 [root@client ~]# mongorestore --host 172.24.8.71 -d mydb -c user -u admin -p admin --dir usercobackup/mydb/user.bson --authenticationDatabase admin
提示:嚴格來講,恢復只須要讀寫權限便可。
四 mongoexport導出
4.1 mongoexport導出
參數
|
全稱
|
默認值
|
參考釋義
|
|
--help
|
|
查看mongoexport命令的使用幫助
|
|
--version
|
|
返回mongoexport的版本號
|
-h
|
--host <hostname><:port>
|
localhost:27017
|
指定mongod要鏈接的主機名及端口號
|
-u
|
--username <username>
|
|
指定用於向開啓認證的MongoDB數據庫的用戶名,與--password和--authenticationDatabase結合使用。
|
-p
|
--password <password>
|
|
指定用於向使用認證的MongoDB數據庫的密碼,與--username和 --authenticationDatabase選項結合使用。
|
-d
|
--db <database>
|
|
指定須要導出的數據庫實例。
|
-c
|
--collection <collection>
|
|
指定要導出的集合。
|
-f
|
--fields <field1[,field2]>
|
|
指定導出時只導出一個或多個字段,導出多個時,須要使用逗號分隔;
|
-q
|
--query <JSON>
|
|
提供查詢文檔做爲導出數據源
|
|
--type<string>
|
json
|
指定要導出的文件類型,可選值:json,csv
|
-o
|
--out <file>
|
|
指定要導出的文件路徑(含文件名),若是不指定,則會導出爲標準輸出(例如stdout)
|
4.2 導出指定數據庫集合
1 [root@client ~]# mongoexport --host 172.24.8.71 -d mydb -c user -u admin -p admin -o allexport/myuser.json --authenticationDatabase admin
五 mongoimport導入
5.1 mongoimport導出
參數
|
全稱
|
可選值
|
參考釋義
|
|
--help
|
|
查看mongoimport命令的使用幫助
|
|
--version
|
|
返回mongoimport的版本號
|
-h
|
--host <hostname><:port>
|
localhost:27017(默認值)
|
指定mongod要鏈接的主機名及端口號
|
-u
|
--username <username>
|
|
指定用於向開啓認證的MongoDB數據庫的用戶名,與--password和--authenticationDatabase結合使用。
|
-p
|
--password <password>
|
|
指定用於向使用認證的MongoDB數據庫的密碼,與--username和 --authenticationDatabase選項結合使用。
|
-d
|
--db <database>
|
|
指定須要導入的數據庫實例。
|
-c
|
--collection <collection>
|
|
指定要導入的集合。
|
|
--file <path>
|
|
指定導入數據所在的目錄路徑。
|
|
--drop
|
|
恢復的時候,先刪除當前數據,而後恢復備份的數據。就是說,恢復後,備份後添加修改的數據都會被刪除,慎用!
|
|
--headerline
|
|
使用第一行做爲字段名稱
|
|
--ignoreBlanks
|
|
忽略要導入文件中的空字段,若是不指定該參數,則默認會讀取空字段並建立
|
|
--type <json|csv|tsv>
|
json(默認值),csv,tsv
|
要導入的文件類型,另外支持tsv
|
|
--mode <insert|upsert|merge>
|
insert(插入),
upsert(替換數據庫中的文檔),
merge(合併)
|
指定導入過程當中,如何應對數據庫文檔與導入文件中的文檔匹配
(默認會使用_id字段對比)的狀況
|
5.2 導入指定數據庫集合
1 [root@client ~]# mongoimport --host 172.24.8.71 -d mydb -c user -u admin -p admin --file allexport/myuser.json --authenticationDatabase admin
六 複製集和分片備份恢復
參考:https://blog.csdn.net/zhu_tianwei/article/details/44514673
七 其餘備份方式
7.1 腳本備份
1 #!/bin/sh
2 DUMP=mongodump
3 OUT_DIR=/data/backup/mongod/tmp // 備份文件臨時目錄
4 TAR_DIR=/data/backup/mongod // 備份文件正式目錄
5 DATE=`date +%Y_%m_%d_%H_%M_%S` // 備份文件將以備份時間保存
6 DB_USER=<USER> // 數據庫操做員
7 DB_PASS=<PASSWORD> // 數據庫操做員密碼
8 DAYS=14 // 保留最新14天的備份
9 TAR_BAK="mongod_bak_$DATE.tar.gz" // 備份文件命名格式
10 cd $OUT_DIR // 建立文件夾
11 rm -rf $OUT_DIR/* // 清空臨時目錄
12 mkdir -p $OUT_DIR/$DATE // 建立本次備份文件夾
13 $DUMP -u $DB_USER -p $DB_PASS -o $OUT_DIR/$DATE // 執行備份命令
14 tar -zcvf $TAR_DIR/$TAR_BAK $OUT_DIR/$DATE // 將備份文件打包放入正式目錄
15 find $TAR_DIR/ -mtime +$DAYS -delete // 刪除14天前的舊備份
16 chmod +x ~/crontab/mongod_bak.sh
17 vi /etc/crontab
18 0 2 * * * root ~/crontab/mongod_bak.sh
參考連接:https://blog.csdn.net/zhu_tianwei/article/details/44514673
https://brickyang.github.io/2017/03/02/Linux-%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BD-MongoDB/
https://segmentfault.com/a/1190000006236494