系統運作時常發生在特定環境才會出錯的問題,其他環境又沒發生,我們通常會需要該環境的資料來想辦法重現問題。
有這需求時,第一時間當然是想直接透過 GUI 方式(環境允許的話)進行匯入匯出。於是我試了 MongoDB Compass
,點選上方的 Collection
-> Export Collection
就能夠有方便的操作囉!
你以為事情結束就太簡單了,因為 MongoDB 儲存的資料格式終究是 bson
而非羅盤提供的 json
、csv
,有經驗的人已經想到會發生什麼事情了,沒錯,就是 Import(restore)。
在某些欄位型別會發生不可預期的轉型錯誤,反正你就是匯不進去了、也沒輒了。
所以一切還是回到原點,使用官方提供的指令來吧
mongodump
資料匯出的指令。常用的參數設定有:
mongodump --host="127.0.0.1:27017" -u root -p pass.123 --authenticationDatabase=admin -d=i18n -c=localization --query "{ \"Data.DateCreated.0\": { \"\$gte\": 637501248000000000 \"\$lt\": 637502112000000000 }}" -o="/tmp/mongodump/"
我指令通常還會加上壓縮,比較方便傳輸
--gzip
通常操作這個動作,目的是盡量不要影響線上運行的資料庫,所以會針對次要節點去操作,不去影響主節點的寫入效能。
--readPreference=secondary
針對 replica set
、sharded
都有特別參數,可以查看help 或官網,這邊就不再一一描述。
mongodump --help
通常是停止對外服務的時候(也就是maintenance啦~)會這樣操作,避免匯入匯出資料會有問題,例如同時寫入、效能等。
鎖定:
db.fsyncLock()
解鎖:
db.fsyncUnlock()
這邊比較特別的是上鎖有次數的概念,可以看到下圖我連續輸入兩次指令,回應的lockCount
內變化。
而解鎖也是需要有相同的解鎖次數,如果我只輸入一次,lockCount
仍然還有 1
喔!所以該值要等於 0
才會完全解鎖
mongorestore
資料匯入的指令。匯入就簡單多了,設定好帳密、目標以及資料來源即可啦~
mongorestore --host="127.0.0.1:27017" -u root -p pass.123 --authenticationDatabase=admin -d=i18n /tmp/mongodump
dump、restore 還有其他相關的參數,我就不再一一講述了,文末會放上官網連結,或者可以使用 --help
查看。
覺得指令版本不好用,也有 bash 版本
因為 dump 指令只能一次一個 collection,加上如果有定期備份特定 collection 的需求,因此寫了個 bash 來省事:
也順便放上 gist
#!/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
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.
這個通常是
--authenticationDatabase=admin
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:
本系列文章會同步發表於我個人的部落格 Pie Note