MongoDB 匯入與匯出資料 完整版

MongoDB 匯入匯出資料其實才鐵人賽的文章當中就寫過了,不過一直覺得不太完整,特別是匯出 json 這塊,所以還是重新發一次。

MongoDB 總共有兩組指令,分別是能夠匯出 bson 的 mongodump 以及匯出 json 的 mongoexport。前者顧名思義就是匯出完整的 bson 以及 index 完整集合資料,後者只能夠匯出 json 格式,所以會有資料型態遺失的問題,唯一優點就是能夠閱讀。

  • mongodump / mongorestore

    • 格式 bson
    • 包含 index
    • 資料型態不會遺失
    • 匯出後人類無法閱讀
    • 匯出速度較快
    • 匯入資料不會有資料型別遺失問題
    • 僅適合維運備份資料使用
  • mongoexport / mongoimport

    • 格式 json
    • 不包含 index
    • 匯出速度較慢
    • 資料型別會遺失,所以無法用來匯入匯出
    • 僅適合人類閱讀

以上兩組指令是成對使用的,雖然我不太能理解為什麼要設計兩套….


mongodump

常用的參數設定有:

  • host: DB位址
  • u: User,登入帳號
  • p: Password,登入密碼
  • authenticationDatabase: 預設的唯一DB
  • d: database,要匯出資料的DB
  • c: collection,要匯出資料的Collection
  • query: 要用來查詢/過濾資料的語法
  • o: output,匯出資料的路徑

指令範例

1
mongodump --host "127.0.0.1:27017" -u root -p pass --authenticationDatabase admin -d dbname -c 'collection.name' -o "/Users/pattri.chou/mongodump" --query='{"_id": {"$in":["AAA","BBB"]}}'

壓縮

1
--gzip

針對次要節點操作

通常操作這個動作,目的是盡量不要影響線上運行的資料庫,所以會針對次要節點去操作,不去影響主節點的寫入效能。

1
--readPreference=secondary

其他參數

針對 replica setsharded 都有特別參數,可以查看help 或官網,這邊就不再一一描述。

1
mongodump --help

mongorestore

匯入就簡單多了,設定好帳密、目標以及資料來源即可啦~

1
mongorestore --host "127.0.0.1:27017" -u root -p pass --authenticationDatabase admin -d dbname /tmp/mongodump

覺得指令版本不好用,也有 bash 版本


批次匯出多個 Collection

因為 dump 指令只能一次一個 collection,加上如果有定期備份特定 collection 的需求,因此寫了個 bash 來省事:

也順便放上 gist

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

host=127.0.0.1
port=27017
authDB=admin
db=[YourDB]
user=root
pwd=[YourPassword]
collections="[Collection1] [Collection2]"
output_folder="./export/"

for collection in $collections; do
echo $collection
mongodump --host $host --port $port -u $user -p $pwd --authenticationDatabase $authDB --collection $collection --db $db --out ${output_folder}
done

mongoexport 與 mongoimport 就更為簡單了,參數也幾乎與上面相同,我就不多做解釋了

mongoexport

1
mongodump --host "127.0.0.1:27017" -u root -p pass --authenticationDatabase admin -d dbname -c 'collection.name' -o "/Users/pattri.chou/mongodump/export.json" --query='{"_id": {"$in":["AAA","BBB"]}}'

mongoimport

1
mongoimport --host "127.0.0.1:27000" --authenticationDatabase admin -u root -p pass --file '/export/products.json' -d dbname -c 'collection.name'

常見錯誤1

1
error connecting to host: could not connect to server: connection() : auth error: sasl conversation error: unable to authenticate using mechanism "SCRAM-SHA-1": (AuthenticationFailed) Authentication failed.

這個通常是

  1. 連線資訊錯誤:請檢查你的 ip, port 是否正確
  2. 帳號密碼錯誤
  3. Auth db 是否為 admin:加上--authenticationDatabase=admin

常見錯誤2

1
2
3
4
5
6
7
the --db and --collection args should only be used when restoring from a BSON file. Other uses are deprecated and will not exist in the future; use --nsInclude instead

building a list of collections to restore from /tmp/mongodump dir

don't know what to do with subdirectory "mongodump/xxx", skipping...

0 document(s) restored successfully. 0 document(s) failed to restore.

這個通常是來源路徑錯了,請檢查 /tmp/mongodump 底下是否有 bso n 以及 json 檔案,匯出時通常會多一層 database 資料夾,以我上面的例子,完整路境應該是 /tmp/mongodump/xxx


Reference:

mongodump 指令官方連結

mongorestore 指令官方連結

  • 作者: MingYi Chou
  • 版權聲明: 轉載不用問,但請註明出處!本網誌均採用 BY-NC-SA 許可協議。