此流程會將來源資料庫完整備份,再還原到目標 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 已成功還原。