溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么備份與恢復(fù)MongoDB數(shù)據(jù)庫(kù)

發(fā)布時(shí)間:2021-04-02 14:41:03 來(lái)源:億速云 閱讀:172 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)怎么備份與恢復(fù)MongoDB數(shù)據(jù)庫(kù),文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

Mongodump工具

在MongoDB中,mongodump工具通常用來(lái)做備份使用。它有如下特點(diǎn):

1、可以對(duì)mongos和mongod進(jìn)行操作

2、備份的是數(shù)據(jù)和數(shù)據(jù)結(jié)構(gòu),會(huì)以bson數(shù)據(jù)格式存儲(chǔ)

3、不會(huì)備份索引,只會(huì)備份索引的元數(shù)據(jù),只有在恢復(fù)的時(shí)候才會(huì)重建索引。

4、備份的過(guò)程中,mongodump會(huì)批量的將數(shù)據(jù)加載到內(nèi)存中,該方法在數(shù)據(jù)量比較大的時(shí)候,會(huì)持續(xù)占用內(nèi)存資源,會(huì)增加IO負(fù)載壓力。

5、可以備份整個(gè)數(shù)據(jù)庫(kù)、整個(gè)集合、部分集合內(nèi)容

該工具的缺點(diǎn):

1、僅僅適合備份小型的、或者單一數(shù)據(jù)庫(kù)的備份

2、數(shù)據(jù)量大的時(shí)候,備份時(shí)間較長(zhǎng)

關(guān)于Mongodump的命令使用方法,大家可以mongodump --help去查看,常用選項(xiàng)如下:

-p,--port:端口

-h,--host:IP地址

-d,--db:數(shù)據(jù)庫(kù)

-c,--collection:備份的集合名稱

-q,--query:備份數(shù)據(jù)的條件表達(dá)式

-o,--out:備份文件的存放位置

-u,--username:用戶名

-p,--password:密碼

--authenticationDataBase:認(rèn)證數(shù)據(jù)庫(kù)

具體的使用方法,下面有例子。

Mongorestore工具

   數(shù)據(jù)備份和數(shù)據(jù)恢復(fù)二者是不可分割的,因?yàn)閿?shù)據(jù)的備份,本質(zhì)上還是為了恢復(fù)準(zhǔn)備的,如果備份的數(shù)據(jù)不能恢復(fù),那么備份也就失去了意義。

    在MongoDB中,Mongorestore這個(gè)工具是用來(lái)做數(shù)據(jù)恢復(fù)的,數(shù)據(jù)恢復(fù)命令的常用參數(shù)如下:

與mongodump重復(fù)的部分不再贅述

-p,--port

-h,--host

-d,--db

-c,--collection

--dir:恢復(fù)文件存放的位置,如果指定了數(shù)據(jù)庫(kù)文件夾或者集合文件,則只恢復(fù)當(dāng)前數(shù)據(jù)庫(kù)或者當(dāng)前集合,如果沒(méi)有指定,則恢復(fù)當(dāng)前目錄下所有備份數(shù)據(jù)。

--drop:恢復(fù)前會(huì)刪除已有的數(shù)據(jù)庫(kù)

-u,--user

-p,--password

--authenticationDatabase

下面來(lái)看樣例:

數(shù)據(jù)備份舉例

備份所有數(shù)據(jù)庫(kù)
mongodump --port=27017 -h 127.0.0.1 -o /data/mongodb_backup -u root -p 123456 
2020-11-23T23:40:41.599+0800 writing admin.system.users to 
2020-11-23T23:40:41.626+0800 done dumping admin.system.users (3 documents)
2020-11-23T23:40:41.626+0800 writing admin.system.roles to 
2020-11-23T23:40:41.651+0800 done dumping admin.system.roles (1 document)
2020-11-23T23:40:41.651+0800 writing admin.system.version to 
2020-11-23T23:40:41.680+0800 done dumping admin.system.version (2 documents)
2020-11-23T23:40:41.680+0800 writing test.yeyz to 
2020-11-23T23:40:41.680+0800 writing yeyz.test to 
2020-11-23T23:40:41.726+0800 done dumping yeyz.test (2 documents)
2020-11-23T23:40:41.727+0800 done dumping test.yeyz (3 documents)

備份yeyz這一個(gè)數(shù)據(jù)庫(kù)
[root@VM-0-14-centos ~]# mongodump -d yeyz --port=27017 -h 127.0.0.1 -o /data/mongodb_backup -u root -p 123456 --authenticationDatabase admin   
2020-11-23T23:41:58.991+0800 writing yeyz.test to 
2020-11-23T23:41:59.050+0800 done dumping yeyz.test (2 documents)

備份yeyz數(shù)據(jù)庫(kù)中的test集合中的name=ccc的記錄
[root@VM-0-14-centos ~]# mongodump -d yeyz -c test -q '{name:{$eq:"ccc"}}' --port=27017 -h 127.0.0.1 -o /data/mongodb_backup -u root -p 123456 --authenticationDatabase admin
2020-11-23T23:43:24.473+0800 writing yeyz.test to 
2020-11-23T23:43:24.501+0800 done dumping yeyz.test (1 document)

數(shù)據(jù)恢復(fù)舉例

恢復(fù)前
> use yeyz
switched to db yeyz
> show tables;
test
> db.test.find()
{ "_id" : ObjectId("5fa7eae2515b814f18f2d474"), "name" : "ccc" }
{ "_id" : ObjectId("5fa7f00e523d80402cdfa326"), "name" : "bbb" }

恢復(fù)后
> show tables;
test
test_recover
> db.test_recover.find()
{ "_id" : ObjectId("5fa7eae2515b814f18f2d474"), "name" : "ccc" }

我們成功的將上面的yeyz數(shù)據(jù)庫(kù)中的test集合中的name=ccc的記錄恢復(fù)到了test_recover這個(gè)集合當(dāng)中。

物理備份

    物理備份的概念大家應(yīng)該都理解,常用的方法是復(fù)制物理硬盤(pán)上的數(shù)據(jù)庫(kù)文件。

    想要保證復(fù)制的物理文件和真實(shí)的數(shù)據(jù)庫(kù)文件一致,需要保證當(dāng)前數(shù)據(jù)庫(kù)沒(méi)有寫(xiě)入。如果數(shù)據(jù)庫(kù)有寫(xiě)入,則復(fù)制的數(shù)據(jù)是不準(zhǔn)確的。所以,物理復(fù)制必須在MongoDB實(shí)例停機(jī)狀態(tài)或者鎖定狀態(tài)下進(jìn)行。一般來(lái)講,在MongoDB集群中,我們會(huì)使用鎖定從庫(kù)的辦法來(lái)進(jìn)行備份。

    通常情況下,使用:

db.fsyncLock()  鎖定從數(shù)據(jù)庫(kù)。

db.fsyncUnlock() 解鎖數(shù)據(jù)庫(kù)

    鎖定從節(jié)點(diǎn)的數(shù)據(jù)庫(kù)之后,在從節(jié)點(diǎn)上使用物理文件拷貝的方式進(jìn)行備份即可。

    備份完成即可解鎖數(shù)據(jù)庫(kù)。

最后,數(shù)據(jù)備份的時(shí)候,如果有寫(xiě)入,那么備份的數(shù)據(jù)是否會(huì)不準(zhǔn)確?例如下面這樣:

怎么備份與恢復(fù)MongoDB數(shù)據(jù)庫(kù)

如果我們的備份進(jìn)度處在中間位置,即:

    A庫(kù)備份完成的時(shí)候,B庫(kù)沒(méi)有開(kāi)始備份

此時(shí)分別寫(xiě)入A庫(kù)和B庫(kù)兩個(gè)文檔,則最終的備份結(jié)果中,A庫(kù)的數(shù)據(jù)沒(méi)有新增的數(shù)據(jù),B庫(kù)的數(shù)據(jù)有新增的數(shù)據(jù),就會(huì)產(chǎn)生數(shù)據(jù)的不一致。為了解決這個(gè)問(wèn)題,備份一般都使用鎖定數(shù)據(jù)庫(kù)或者停止實(shí)例的方法來(lái)解決。

    在MongoDB中,可以在從庫(kù)上進(jìn)行鎖定或者停止實(shí)例的備份操作,不建議在線上環(huán)境使用MongoDB單庫(kù),因?yàn)檫@種情況,備份恢復(fù)將會(huì)成為一個(gè)瓶頸問(wèn)題。

上述就是小編為大家分享的怎么備份與恢復(fù)MongoDB數(shù)據(jù)庫(kù)了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI