此流程會將來源資料庫完整備份,再還原到目標 MongoDB,並可改成新的資料庫名稱。

設定環境變數

請依實際環境替換以下的內容,參考 production.env

export SOURCE_MONGODB_URI='mongodb://<username>:<password>@<source-host>:27017/?authSource=<auth-database>'

export TARGET_MONGODB_URI='mongodb://<username>:<password>@<target-host>:27017/?authSource=<auth-database>'

export SOURCE_DATABASE='tams'
export TARGET_DATABASE='tams'
export BACKUP_DIRECTORY="$HOME/db/backup"
  • SOURCE_MONGODB_URI:來源 MongoDB 的連線字串。
  • TARGET_MONGODB_URI:目標 MongoDB 的連線字串。
  • authSource:帳號建立所在的驗證資料庫,通常是 admin 或應用資料庫本身。
  • 密碼如包含 @:/?# 等特殊字元,必須先進行 URL encoding。

不要把真實帳密提交到 Git;若使用 .env 檔,請將它加入 .gitignore

備份來源資料庫

mongodump \
  --uri="$SOURCE_MONGODB_URI" \
  --db="$SOURCE_DATABASE" \
  --out="$BACKUP_DIRECTORY"

完成後,備份會位於:

$HOME/db/backup/tams/

其中通常包含各 collection 的 .bson 資料檔與 .metadata.json 索引/設定檔。

還原成新資料庫

mongorestore \
  --uri="$TARGET_MONGODB_URI" \
  --nsInclude="$SOURCE_DATABASE.*" \
  --nsFrom="$SOURCE_DATABASE.*" \
  --nsTo="$TARGET_DATABASE.*" \
  --drop \
  "$BACKUP_DIRECTORY"
  • --nsFrom:指定備份中的來源資料庫及所有 collections。
  • --nsTo:將資料還原到目標資料庫。
  • --drop:先刪除目標資料庫內同名的 collection,再進行還原。
  • --nsInclude:只還原哪些 namespace。

若不希望覆蓋目標資料庫既有的同名 collection,請移除 --drop

驗證還原結果

查看目標資料庫的 collections:

mongosh "$TARGET_MONGODB_URI" \
  --eval "db.getSiblingDB('$TARGET_DATABASE').getCollectionNames()"

比對特定 collection 的筆數,例如 device

mongosh "$SOURCE_MONGODB_URI" \
  --eval "db.getSiblingDB('$SOURCE_DATABASE').device.countDocuments()"

mongosh "$TARGET_MONGODB_URI" \
  --eval "db.getSiblingDB('$TARGET_DATABASE').device.countDocuments()"

兩邊筆數相同,即表示該 collection 已成功還原。