mongodump
备份
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
使用 Oplog 创建备份
mongodump的--oplog选项收集oplog条目,并允许您在实时数据库上执行备份。如果以后从备份中恢复数据库,则数据库将与备份过程完成时相同。
使用--oplog,mongodump可以复制源数据库中的所有数据以及备份过程开始到结束的所有oplog条目。此操作与mongorestore--oplogReplay结合使用,可以还原反映mongodump完成创建转储文件时对应的特定时刻的备份。
使用--oplog参数,会把从开始执行mongodump至结束期间生成的oplog也转储
从非本地mongod
实例创建备份
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
删除local
数据库。
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" } } )
重新启动mongod
作为新的单节点副本集。
replicationreplSetName: myNewCSRSName
shardingclusterRole: 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"}} )
重新启动
replicationreplSetName: myNewShardName
shardingclusterRole: shardsvr
mongod --config /path/to/mongodb/mongod.conf
rs.initiate()
rs.add("repl2.example.net:27018") rs.add("repl3.example.net:27018")