備份和恢復

wongchaofan發表於2024-07-09

mongodump從 MongoDB 資料庫讀取資料並建立高保真 BSON 檔案,該mongorestore 工具可以使用該檔案填充 MongoDB 資料庫。 mongodump並且mongorestore是用於備份和恢復小型 MongoDB 部署的簡單有效的工具,但並不適合捕獲大型系統的備份。

mongodump只捕獲資料庫中的文件。生成的備份節省了空間,但mongorestore或mongod必須在恢復資料後重建索引。

當連線到MongoDB例項時,mongodump可能會對mongod效能產生不利影響。如果資料大於系統記憶體,則查詢會將工作集擠出記憶體,從而導致頁面錯誤。

當mongodump捕獲輸出時,應用程式可以繼續修改資料。對於副本集,mongodump提供了--oplog選項,以便在其輸出中包含mongodump操作期間出現的oplog條目。這允許相應的mongorestore操作重放捕獲的oplog。要恢復使用--oplog建立的備份,請將mongorestore與--oplogReplay選項一起使用。

使用檔案系統快照備份和恢復

這些檔案系統快照或“塊級”備份方法使用系統級工具來建立儲存 MongoDB 資料檔案的裝置的副本。這些方法完成速度快且可靠,但需要在 MongoDB 之外進行額外的系統配置。

快照的工作原理是在實時資料和特殊快照卷之間建立指標。這些指標在理論上相當於“硬連結”。由於工作資料與快照不同,快照過程使用寫時複製策略。因此,快照僅儲存已修改的資料。

製作快照後,將快照映像掛載到檔案系統上並從快照中複製資料。生成的備份包含所有資料的完整副本。

照恢復不太實用,不做過多解釋

使用 MongoDB 工具進行備份和恢復

要指定 MongoDB 例項的主機和埠,您可以:

使用SRV或標準連線字串,在--uri字串中指定主機名和埠:

mongodump --uri="mongodb+srv://username:password@cluster0.example.mongodb.net" <additional_options>

在字串中指定主機名和埠--host

mongodump --host="mongodb0.example.com:27017" <additional_options>

--host在和中指定主機名和埠--port

mongodump --host="mongodb0.example.com" --port=27017 <additional_options>

mongodump將寫入BSON檔案,其中包含可透過mongod.example.net主機的27017埠上的mongod偵聽訪問的資料副本。有關詳細資訊,請參閱從非本地mongod例項建立備份。

要指定不同的輸出目錄,您可以使用以下--out or -o選項:

mongodump --out=/opt/backup/mongodump-1

要限制資料庫轉儲中包含的資料量,可以指定--db和--collection作為mongodump的選項。例如

mongodump --collection=myCollection --db=test

mongodump的--oplog選項收集oplog條目,並允許您在實時資料庫上執行備份。如果以後從備份中恢復資料庫,則資料庫將與備份過程完成時相同。

使用--oplog,mongodump可以複製源資料庫中的所有資料以及備份過程開始到結束的所有oplog條目。此操作與mongorestore--oplogReplay結合使用,可以還原反映mongodump完成建立轉儲檔案時對應的特定時刻的備份。

使用--oplog引數,會把從開始執行mongodump至結束期間生成的oplog也轉儲

mongodump \
   --host=mongodb1.example.net \
   --port=3017 \
   --username=user \
   --password="pass" \
   --out=/opt/backup/mongodump-1
mongorestore \
   --host=mongodb1.example.net \
   --port=3017 \
   --username=user \
   --authenticationDatabase=admin \
   /opt/backup/mongodump-1

mongorestore --drop #刪除選項

從 MongoDB 備份恢復副本集

1、用一個例項已備份檔案作為資料目錄 啟動,連線至資料庫,刪除local資料庫,

mongod --dbpath /data/db <startup options>
use local
db.dropDatabase()

2、關閉後,緊接著作為副本集啟動

mongod --dbpath /data/db --replSet <replName> <startup options>

3、連線到副本集,執行副本集初始化,此時初始化成員只有目前一個節點

rs.initiate( {
   _id : <replName>,
   members: [ { _id : 0, host : <host:port> } ]
})

4、將其他節點新增入副本集rs.add()

初始同步可能需要很長時間才能完成。對於大型資料庫,最好將資料庫檔案複製到每臺主機上。

備份和恢復分片叢集

要使用檔案系統快照進行備份,您必須首先停止平衡器、停止寫入並停止叢集上的任何模式轉換操作。

在此過程中,您將停止叢集平衡器並備份配置資料庫,然後使用檔案系統快照工具備份叢集中的每個分片。如果您需要系統的精確時刻快照,則需要在拍攝檔案系統快照之前停止所有寫入;否則快照只會近似於某個時刻。

要備份分片叢集,您必須使用fsync命令或 db.fsyncLock()方法停止對叢集的寫入。這有助於降低備份中出現不一致的可能性。
sh.stopBalancer()

如果平衡輪次目前正在進行中,則操作會等待平衡完成。

要驗證平衡器是否已停止,請使用以下 sh.getBalancerState()命令:

use config
while( sh.isBalancerRunning().mode != "off" ) {
   print("waiting...");
   sleep(1000);
}

要鎖定分片叢集,請使用以下db.fsyncLock()命令:

db.getSiblingDB("admin").fsyncLock()

在mongos和配置伺服器的主mongod上執行以下聚合管道。要確認鎖定,請確保fysncLocked欄位返回true,fsyncUnlocked欄位返回false。

db.getSiblingDB("admin").aggregate( [
   {  $currentOp: { } },
   {  $facet: {
      "locked": [
         { $match: { $and: [
            { fsyncLock: { $exists: true } }
         ] } }],
       "unlocked": [
         { $match: { fsyncLock: { $exists: false } } }
       ]
   } },
   {  $project: {
      "fsyncLocked": { $gt: [ { $size: "$locked" }, 0 ] },
      "fsyncUnlocked": { $gt: [ { $size: "$unlocked" }, 0 ] }
   } }
 ] )

備份配置伺服器會備份分片叢集的後設資料。您只需備份一個配置伺服器,因為它們都儲存相同的資料

使用檔案系統快照備份和恢復中介紹的步驟,對每個分片的主成員執行檔案系統快照

備份完成後,您必須解鎖叢集以允許恢復寫入。

要解鎖叢集,請使用以下db.fsyncUnlock()命令:

db.getSibling("admin").fsyncUnlock()

要重新啟動平衡器,請使用以下sh.startBalancer()命令:

要確認平衡器正在執行,請使用以下 sh.getBalancerState()命令:

使用資料庫轉儲備份分片叢集

過程和上述檔案系統級備份相似,差別在於備份方式:

mongodump \
   --host mongos.example.net \
   --port 27017 \
   --username user \
   --password "passwd" \
   --out /opt/backups/example-cluster-1

恢復分片叢集

關閉正在執行的 MongoDB 程序

use admin
db.shutdownServer()

準備資料目錄

sudo mkdir /path/to/mongodb
sudo chown -R mongodb:mongodb /path/to/mongodb
sudo chmod -R 770 /path/to/mongodb

準備日誌目錄

sudo mkdir /path/to/mongodb/logs
sudo chown -R mongodb:mongodb /path/to/mongodb/logs
sudo chmod -R 770 /path/to/mongodb/logs

建立配置檔案

sudo touch /path/to/mongod.conf
sudo chown mongodb:mongodb /path/to/mongodb/mongod.conf
sudo chmod 644 /path/to/mongodb/mongod.conf

將資料檔案從備份資料位置 複製到B 中建立的資料目錄。準備目標主機進行恢復

cp -a /backup/mongodb/path/to/mongodb /path/to/mongodb

註釋掉或者省略以下 配置檔案設定:

#replication
#  replSetName: myCSRSName
#sharding
#  clusterRole: configsvr

啟動mongod使用配置檔案,

mongod --config /path/to/mongodb/mongod.conf
use local
db.dropDatabase()

更改副本集主機名,在配置伺服器上更改

use config
db.shards.find( { "_id" : "<shardName>" } )

此操作返回類似於以下內容的文件:

{
   "_id" : "shard1",
   "host" : "myShardName/alpha.example.net:27018,beta.example.net:27018,charlie.example.net:27018",
   "state" : 1
}

使用updateOne()方法更新 hosts字串以反映分片的計劃副本集名稱和主機名列表。例如,以下操作使用 更新 host分片的連線字串"_id" : "shard1"

db.shards.updateOne(
  { "_id" : "shard1" },
  { $set : { "host" : "myNewShardName/repl1.example.net:27018,repl2.example.net:27018,repl3.example.net:27018" } }
)
replication
  replSetName: myNewCSRSName
sharding
  clusterRole: configsvr
mongod --config /path/to/mongodb/mongod.conf
rs.initiate()
rs.add("config2.example.net:27019")
rs.add("config3.example.net:27019")

更新分片

每個分片都有其連線配置檔案的資訊,需要修改這些資訊,這就是和配置伺服器恢復相比,多出來的步驟

為了安全考慮,新建一個具有系統許可權的臨時使用者,去更改,更改完後刪除臨時使用者。

use admin
db.auth("myUserAdmin","mySecurePassword")
db.createUser(
  {
    user: "mySystemUser",
    pwd: "<replaceMeWithAStrongPassword>",
    roles: [ "__system" ]
  }
)
db.auth("mySystemUser","<replaceMeWithAStrongPassword>")
use local
db.dropDatabase()
use admin
db.system.version.deleteOne( { _id: "minOpTimeRecovery" } )
db.system.version.find( {"_id" : "shardIdentity" } )
db.system.version.updateOne(
  { "_id" : "shardIdentity" },
  { $set :
    { "configsvrConnectionString" : "myNewCSRSName/config1.example.net:27019,config2.example.net:27019,config3.example.net:27019"}
  }
)

重新啟動

replication
  replSetName: myNewShardName
sharding
  clusterRole: shardsvr
mongod --config /path/to/mongodb/mongod.conf
rs.initiate()
rs.add("repl2.example.net:27018")
rs.add("repl3.example.net:27018")

相關文章