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 set
、sharded
都有特別參數,可以查看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 |
|
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. |
這個通常是
- 連線資訊錯誤:請檢查你的 ip, port 是否正確
- 帳號密碼錯誤
- Auth db 是否為 admin:加上
--authenticationDatabase=admin
常見錯誤2
1 | 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 |
這個通常是來源路徑錯了,請檢查 /tmp/mongodump
底下是否有 bso n 以及 json 檔案,匯出時通常會多一層 database 資料夾,以我上面的例子,完整路境應該是 /tmp/mongodump/xxx
Reference: