MongoDB如何備份以及導(dǎo)出導(dǎo)入數(shù)據(jù),相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、盤錦ssl等。為1000+企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的盤錦網(wǎng)站制作公司
周二有同學(xué)問(wèn),MONGODB怎么備份,怎么數(shù)據(jù)遷移,正好最近要做一個(gè)項(xiàng)目的數(shù)據(jù)遷移,其中就有MONGODB ,正好以一個(gè)項(xiàng)目的觀念來(lái)看看MongoDb的數(shù)據(jù)遷移和備份的觀點(diǎn),如果有遺漏或三觀不正,還是請(qǐng)大家來(lái)指正。
做這個(gè)事情,其實(shí)要先有一個(gè)測(cè)試環(huán)節(jié),或者生產(chǎn)環(huán)境,這里就以兩個(gè)單機(jī)的MOGNODB4.0 來(lái)進(jìn)行操作。本身MONGODB 是支持兩種數(shù)據(jù)的遷出和導(dǎo)入的方式,當(dāng)然后面也會(huì)有兩個(gè)復(fù)制集合之間的數(shù)據(jù)遷移的東西。
一般小型系統(tǒng)使用mongodump 和 mongorestore 來(lái)進(jìn)行系統(tǒng)的備份和恢復(fù)mongodump可以用來(lái)轉(zhuǎn)儲(chǔ)整個(gè)數(shù)據(jù)庫(kù)、集合或查詢結(jié)果。mongodump可以通過(guò)轉(zhuǎn)儲(chǔ)oplog來(lái)生成一致的數(shù)據(jù)快照。mongorestore實(shí)用程序?qū)?shù)據(jù)恢復(fù)到新的或現(xiàn)有的數(shù)據(jù)庫(kù)。mongorestore將從mongodump生成的BSON數(shù)據(jù)庫(kù)轉(zhuǎn)儲(chǔ)中導(dǎo)入內(nèi)容,并重播oplog。
mongodump只捕獲數(shù)據(jù)庫(kù)中的文檔。產(chǎn)生的備份是空間有效的,但是mongorestore或mongod必須在恢復(fù)數(shù)據(jù)后重建索引。
但實(shí)際上,很多線上的MONGODB 系統(tǒng)可能并不是這樣備份和恢復(fù)的。
但我們還是先看看相關(guān)的命令,對(duì)于小型的系統(tǒng)來(lái)說(shuō)還是使用這樣的方式來(lái)備份。
備份(J 為操作使用的線程, --gzip 是壓縮)
mongodump --host=192.168.198.180 --port=27027 --username=admin --password=1234.com --authenticationDatabase=admin --gzip --db test -v -j 8 -o /mongodata/backup
數(shù)據(jù)的恢復(fù)
mongorestore --host=192.168.198.181 --port=27027 --username=admin --password=1234.com --authenticationDatabase=admin --db test -v --drop -j 8 --gzip --dir='/mongodata/backup/test'
對(duì)于單機(jī)來(lái)說(shuō)上面的備份和恢復(fù)的方式基本上就滿足了。當(dāng)然可以寫一個(gè)腳本,然后在rsync 到對(duì)應(yīng)的備份存儲(chǔ)的地方就可以。
但實(shí)際上很多MONGODB 的使用的方式都是復(fù)制集,那具體的復(fù)制replica set 是怎么備份的。
mongodump --uri="mongodb://backup:1234.com@10.5.1.114:27027,10.5.1.115:27027,10.5.1.116:27027/DB_AAP_LOG?replicaSet=repl&readPreference=secondary" --gzip -v -j 8 -o /wu
上面的命令就是從MONGODB3.46引入了 uri的方式連接MONGODB ,通過(guò)這樣的方式來(lái)針對(duì)復(fù)制集合來(lái)進(jìn)行備份 其中 -j 的方式對(duì)數(shù)量較多的數(shù)據(jù)進(jìn)行備份。由于和--db 命令有沖突,直接可以在備份的指定的認(rèn)證數(shù)據(jù)庫(kù)就是要備份的數(shù)據(jù)塊即可。(如有問(wèn)題請(qǐng)指出)
實(shí)際上這里有一個(gè)點(diǎn),就是MONGODB 是不是也需要類似傳統(tǒng)數(shù)據(jù)庫(kù)的鎖,來(lái)將備份的數(shù)據(jù)的一致性進(jìn)行一個(gè)限制,實(shí)際上這里是有選擇的如果你選擇了 mongodb 備份的時(shí)候增加了 --oplog 則會(huì)從備份開(kāi)始添加相關(guān)的oplog日志,在恢復(fù)的時(shí)候可以使用,這里我個(gè)人認(rèn)為就類型與 MySQLdump 里面的 --single-transaction 有類似的功效。但需要的是,要對(duì)數(shù)據(jù)庫(kù)進(jìn)行FULL備份的時(shí)候才能應(yīng)用,而不能對(duì)數(shù)據(jù)庫(kù)中個(gè)別的庫(kù)進(jìn)行備份使用,這是理所當(dāng)然的數(shù)據(jù)恢復(fù)后,是否需要對(duì)索引進(jìn)行一個(gè)確認(rèn)
下面的腳本可以在MONGODB 中直接運(yùn)行,并獲取當(dāng)前數(shù)據(jù)庫(kù)的索引信息
var collectionList = db.getCollectionNames();
for(var index in collectionList){
var collection = collectionList[index];
var cur = db.getCollection(collection).getIndexes();
if(cur.length == 1){
continue;
}
for(var index1 in cur){
var next = cur[index1];
if(next["key"]["_id"] == '1'){
continue;
}
print(
"try{ db.getCollection(\""+collection+"\").ensureIndex("+JSON.stringify(next.key)+",{background:1, unique:" + (next.unique || false) + "" + (next.expireAfterSeconds > 0 ? ", expireAfterSeconds :" + next.expireAfterSeconds : "") + " })}catch(e){print(e)}")}}
另外還有一個(gè)問(wèn)題,就是如果我不備份整個(gè)MONGODB 我只備份一個(gè)庫(kù),然后想增量怎么辦,可能就需要你的collection有相關(guān)的時(shí)間字段,然后export import 根據(jù)時(shí)間來(lái)進(jìn)行,可能操作會(huì)稍微有點(diǎn)復(fù)雜。
例如下面的數(shù)據(jù)中,我們只想根據(jù)date 界限將一些數(shù)據(jù)導(dǎo)出
mongoexport -uXXX -pXXXXX --host 192.168.198.180:27027 -d test -c testData -q '{ date: { $lte: { "$date": "2020-03-30T02:23:25Z" } } }' --out /mongodata/backup/testData.json
這樣我們就導(dǎo)出了你需要的數(shù)據(jù)
實(shí)際上如果用備份的方式,數(shù)據(jù)是可以壓縮的比較小,但靈活性就相對(duì)差一些,導(dǎo)入導(dǎo)出數(shù)據(jù)的特點(diǎn)就是靈活,但占用的時(shí)間和空間會(huì)大。
mongoimport -uXXX -pXXXXX --host 192.168.198.181:27027 -d test -c testData --type json --file='/mongodata/backup/testData.json'
我們用上面的命令就將對(duì)應(yīng)的數(shù)據(jù)導(dǎo)入
這里估計(jì)很多同學(xué)都會(huì)有疑問(wèn),mongodump mongorestore 和 mongoimport mongexport 比較后者靈活性在哪里,
舉一個(gè)例子,當(dāng)數(shù)據(jù)從一個(gè)表,要進(jìn)入另一個(gè)表,并且有些字段還有取舍,同時(shí)由于數(shù)據(jù)可能有重復(fù)性,也就是_id 可能有重復(fù)的可能,這時(shí)你能選擇的大概率是 mongoimport mongoexport , 通過(guò)下圖的選項(xiàng)你可以讓那些重復(fù)可能有沖突的數(shù)據(jù)“安安靜靜”的聽(tīng)你的指揮,至少你可以有選擇,如果你使用dump resotre 那就........
在回到備份,如果你的數(shù)據(jù)庫(kù)比較大,通過(guò)這樣的方法來(lái)進(jìn)行備份,那就.... 比較慢,是不是有更好的方式來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行備份,由于MONGODB 本身不具有強(qiáng)事務(wù)性,所以在MONGODB 備份中會(huì)經(jīng)常用到這樣一個(gè)命令,從MONGODB 3.2開(kāi)始,就支持卷備份了。
就是下面這個(gè)命令了,在db.fsyncLock() 將你的MONGODB 的寫鎖住,然后就可以開(kāi)始拷貝你的文件了,將你的文件都拷貝走,當(dāng)然你可以LVM 等方式,具體的按你心愿,
在拷貝完畢后,在直接,鍵入db.fsyncUnlock() 解鎖,數(shù)據(jù)就可以繼續(xù)寫入了。
實(shí)際上大部分的MONOGDB的數(shù)據(jù)庫(kù)的(大容量)的備份都是這樣的方式,尤其集群的方式中將從庫(kù)鎖定,然后拷貝從庫(kù)的數(shù)據(jù)到備份位置,然后解開(kāi)鎖,但需要注意的是,你在操作的過(guò)程中的時(shí)間,和不要忘記你的數(shù)據(jù)庫(kù)在被鎖定,以及報(bào)警等方方面面的問(wèn)題,你都需要去處理。
實(shí)際上對(duì)于MONGODB 的備份還有一種想法,就是直接在復(fù)制集的基礎(chǔ)上,建立一個(gè)備份節(jié)點(diǎn),我知道這樣的想法可能做傳統(tǒng)數(shù)據(jù)庫(kù)的DB們不是很認(rèn)同,如果人家的數(shù)據(jù)要回滾怎么辦,如果數(shù)據(jù)要存檔怎么辦。當(dāng)然也可以有延遲庫(kù)(使用過(guò)MYSQL的小伙伴應(yīng)該對(duì)這個(gè)概念不會(huì)陌生)
說(shuō)到這里還是一個(gè)我的口頭禪,任何事情都要看你的業(yè)務(wù)邏輯,如果你的MONGODB 僅僅是一個(gè)流水賬,和一些日志的話,是否對(duì)這些東西必須要進(jìn)行備份,另外備份的意義在哪里,例如如果你的數(shù)據(jù)庫(kù)是 cassandra 那上百個(gè)節(jié)點(diǎn)的時(shí)候,怎么備份呢???? 所以不同的數(shù)據(jù)庫(kù)可能會(huì)顛覆你長(zhǎng)久以來(lái)的一些對(duì)數(shù)據(jù)庫(kù)的操作的方法和態(tài)度,這世界變化快,follow it . (如果在生產(chǎn)時(shí)間備份,強(qiáng)烈建議全部在復(fù)制集合的從庫(kù)上進(jìn)行備份)
本文標(biāo)題:MongoDB如何備份以及導(dǎo)出導(dǎo)入數(shù)據(jù)
轉(zhuǎn)載來(lái)于:http://www.rwnh.cn/article16/ippigg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、網(wǎng)站制作、網(wǎng)站設(shè)計(jì)公司、全網(wǎng)營(yíng)銷推廣、Google、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)