中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

MongoDB如何備份以及導(dǎo)出導(dǎo)入數(shù)據(jù)

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)

外貿(mào)網(wǎng)站建設(shè)
宜宾市| 新干县| 永德县| 石首市| 塔河县| 称多县| 石门县| 简阳市| 武穴市| 启东市| 金平| 恩平市| 大方县| 饶河县| 格尔木市| 丹寨县| 和静县| 宝坻区| 尼勒克县| 安阳县| 四平市| 汝阳县| 合水县| 南投县| 梁河县| 顺昌县| 田阳县| 吉木乃县| 宣汉县| 鸡泽县| 鹤山市| 马山县| 饶阳县| 沙坪坝区| 汕尾市| 东安县| 图木舒克市| 克东县| 临高县| 青河县| 平乡县|