在mongodb中多中導入導出數據的方式,需要針對不同的應用進行選擇。本文主要講mongoexport,import及dump,restore這兩種方式
這是一種導成json格式的方式。Json可以導入多種數據庫,也可以在mongodb的不同版本之間進行操作 mongoexport 可以導成json及csv格式,但是csv格式必須使用-f 來表明需要導出的字段,如果是一個比較大的集合,那么需要指明每一個字段,針對這點,json還是比較方便,不過csv格式可以直接導入SQLServe.在mongodb中導出含有中文的字符可能會出現亂碼,如果文檔不是很大,可以使用txt然后指定編碼格式另存為新的一份csv會破解這種亂碼的情況。 Mongoexport -d test -c name - name.dat -h 127.0.0.1:5000 –u xxx –p xxx –authenticationDatabase=admin 其中dat的格式是數據庫將自己格式的數據文件轉換成文本格式,dat是其中一種純文本的,沒有任何數據屬性結構方面的信息,可以使用記事本打開。
導出包括.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相對來說是比較好的方式。
新聞熱點
疑難解答