1. 程式人生 > >mongodb_匯入匯出資料

mongodb_匯入匯出資料

Mongodb 匯入匯出資料

在mongodb中多中匯入匯出資料的方式,需要針對不同的應用進行選擇。本文主要講mongoexport,import及dump,restore這兩種方式

1.mongoexport,mongoimport

這是一種導成json格式的方式。Json可以匯入多種資料庫,也可以在mongodb的不同版本之間進行操作
mongoexport 可以導成json及csv格式,但是csv格式必須使用-f 來表明需要匯出的欄位,如果是一個比較大的集合,那麼需要指明每一個欄位,針對這點,json還是比較方便,不過csv格式可以直接匯入SQLServe.在mongodb中匯出含有中文的字元可能會出現亂碼,如果文件不是很大,可以使用txt然後指定編碼格式另存為新的一份csv會破解這種亂碼的情況。
Mongoexport -d test -c name -o name.dat -h 127.0.0.1:5000 –u xxx –p xxx –authenticationDatabase=admin
其中dat的格式是資料庫將自己格式的資料檔案轉換成文字格式,dat是其中一種純文字的,沒有任何資料屬性結構方面的資訊,可以使用記事本開啟。

2. mongodump,mongorstore

匯出包括.metadata,.bson兩個檔案,包含索引等資訊,應該說相對是比較完整的資訊。但是很可能在不同版本之間匯入匯出會出現問題。Mongodump備份的例子為:
mongodump -h 127.0.0.1:5000 -u xxx -p xxx –authenticationDatabase=admin -d test -c name -o /home/dump
其中:h:ip與埠,u:使用者名稱,-p 密碼,–authenticationDatabase授權資料庫,d 需要備份的資料庫名稱,-c 備份的集合,-o 備份的目錄。所以這就相當於可以將遠端的資料庫備份到本地。只要指定了對應的ip及埠號。
Mongorestore –h 127.0.0.1:5000 -u xxx -p xxx –authenticationDatabase=admin -d test -c name /home/dump/test/name.json
在還原資料庫的時候,不需要寫出-o選項。最後一個引數預設為資料的路徑,我們需要寫明哪個json. 如果沒有-c指定集合,預設的是整個資料庫。對應的在mongorstore中不需要指定某個特定的集合,但必須指定資料庫備份的目錄。

問題集錦
1.在Mongoexport及mongodump中均可以使用-q來指定需要備份還原的符合條件的結果集。需要注意的是如果使用了ISODate型別的欄位作為查詢,-q後面的查詢不能直接寫成ISODate(“2017-02-12T08:00:00Z”),需要轉換成時間戳格式。並使用Date時間進行查詢。在shell中使用ISODate(“2017-02-12T08:00:00Z”).valueOf()得到數值。所以,查詢條件應為:new Date(1486886400000)
2.今天在備份資料的時候很長一段時間都是%0的進度,當然這個集合有一點大,資料量上億。好容易到了121條資料,突然報錯:error reading collection: invalid cursor。
原因:mongodb的備份資料可能會出現問題,來自於遊標。網址為:

https://jira.mongodb.org/browse/TOOLS-902,於是按照所述的方案:db.runCommand({setParameter: 1, cursorTimeoutMillis: 60000}),再次執行dump果然是生效了。
3.Mongorestore在匯入資料是遇到:invalid BSONSize使用—batchSize=1000來解決
連線為: https://jira.mongodb.org/browse/TOOLS-939
4.在mongodb寫入資料庫時會使用壓縮演算法,但是使用dump之後將會還原到原始大小,所以在備份前應該檢視的是size大小而不是storageSize大小來權衡硬碟的容量

還有幾種其它的資料庫複製策略
3. db.cloneCollection
存在的問題有:1.不支援授權的原資料庫;2.如果集合已經存在則會報錯;3.只能從mongod中進行復制,不支援mongos.所以如果是分片的情況下,是不適合使用該方式。
4. db.cloneDatabase
在3.2版本中,克隆整個資料庫,會將目標資料庫鎖住,如果當前資料庫正在使用,無疑非常的危險。
5. db. collection.CopyTo
是一個全域性鎖,阻止所有的讀寫操作。需要anyAction,anyResource許可權,使用的是js命令。
6. db.copyDatabase
目標資料庫不能存在相同的集合,mongod之間的操作,在分片的情況下,不可使用copyDatabase

總結:所以如果是希望從一個數據庫中還原資料至另一個數據庫,且資料庫還原過程必須不能影響現有的操作,使用dump與restore相對來說是比較好的方式。