iT邦幫忙

2021 iThome 鐵人賽

DAY 26
0
Software Development

MongoDB披荊斬棘之路系列 第 26

DAY26 MongoDB 匯入與匯出資料

DAY26 MongoDB 匯入與匯出資料

系統運作時常發生在特定環境才會出錯的問題,其他環境又沒發生,我們通常會需要該環境的資料來想辦法重現問題。

有這需求時,第一時間當然是想直接透過 GUI 方式(環境允許的話)進行匯入匯出。於是我試了 MongoDB Compass,點選上方的 Collection -> Export Collection 就能夠有方便的操作囉!
https://ithelp.ithome.com.tw/upload/images/20210926/20140504FZ6LnKQu4q.jpg

你以為事情結束就太簡單了,因為 MongoDB 儲存的資料格式終究是 bson 而非羅盤提供的 jsoncsv,有經驗的人已經想到會發生什麼事情了,沒錯,就是 Import(restore)。
在某些欄位型別會發生不可預期的轉型錯誤,反正你就是匯不進去了、也沒輒了。

所以一切還是回到原點,使用官方提供的指令來吧


mongodump

  • mongodump 資料匯出的指令。

常用的參數設定有:

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

指令範例

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 setsharded 都有特別參數,可以查看help 或官網,這邊就不再一一描述。

mongodump --help

同步資料與鎖定

通常是停止對外服務的時候(也就是maintenance啦~)會這樣操作,避免匯入匯出資料會有問題,例如同時寫入、效能等。

鎖定:

db.fsyncLock()

解鎖:

db.fsyncUnlock()

這邊比較特別的是上鎖有次數的概念,可以看到下圖我連續輸入兩次指令,回應的lockCount 內變化。
https://ithelp.ithome.com.tw/upload/images/20210926/20140504sAUGRKFta3.jpg

而解鎖也是需要有相同的解鎖次數,如果我只輸入一次,lockCount 仍然還有 1 喔!所以該值要等於 0 才會完全解鎖
https://ithelp.ithome.com.tw/upload/images/20210926/20140504vZ9ccjbsYj.jpg


mongorestore

  • mongorestore 資料匯入的指令。

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

mongorestore --host="127.0.0.1:27017" -u root -p pass.123 --authenticationDatabase=admin -d=i18n /tmp/mongodump

dump、restore 還有其他相關的參數,我就不再一一講述了,文末會放上官網連結,或者可以使用 --help 查看。

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


批次匯出多個 Collection

因為 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

常見錯誤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

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 指令官方連結


本系列文章會同步發表於我個人的部落格 Pie Note


上一篇
DAY25 MongoDB 自訂角色與使用者
下一篇
DAY27 MongoDB Time Series Collection
系列文
MongoDB披荊斬棘之路30

尚未有邦友留言

立即登入留言