对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

使用数据库转储备份自管理分片集群

Starting in MongoDB 7.1 (also available starting in 7.0.2, 6.0.11, and 5.0.22), you can back up data on sharded clusters using mongodump.

mongodump is a utility that creates a binary export of database content. You can use the mongodump utility to take self-managed backups of a sharded cluster.

要使用 mongodump 备份分片集群,您必须停止负载均衡器、停止写入并停止集群上的任何架构转换操作。这有助于降低备份中出现不一致的可能性。

MongoDB 提供的备份和恢复操作可以与负载均衡器一起运行,并通过以下服务运行事务:

备份提供数据库当前状态的快照。从备份中恢复时,恢复的数据库不包括备份后所做的任何更改,这可能会导致数据丢失。

This task uses mongodump to back up a sharded cluster. Ensure that you have a cluster running that contains data in sharded collections.

此过程需要支持 mongos 的 fsync 锁定 MongoDB 版本。

从 MongoDB 7.0.2 开始(也可以从 6.0.11 和 5.0.22 开始使用),fsync 和 fsyncUnlock 命令可以在 mongos 上运行,以锁定和解锁分片集群。

要使用此操作步骤,MongoDB 用户必须拥有 fsync 授权,可通过自定义角色或使用内置的 hostManager 角色来获得此授权。

通过此授权,您可以运行 fsync 和 fsyncUnlock 命令。

要对分片集群进行自我管理备份,请完成以下步骤:

1

要找到执行备份的好时机,请监控应用程序和数据库的使用情况,以找到不太可能发生数据块迁移、重分片和模式转换操作的时间。

注意

只有完全按照这些步骤操作,并且开始时没有任何操作正在进行,才能生成一致的备份。

有关更多信息,请参阅为自管理分片集群安排备份窗口。

2

为防止数据块迁移干扰备份,请连接到 mongos 并使用 sh.stopBalancer() 方法停止负载均衡器:

sh.stopBalancer()

如果正在进行均衡轮次,则操作会等待均衡完成后再继续执行。

要验证负载均衡器是否已停止,请使用 sh.getBalancerState() 方法:

use config
while( sh.isBalancerRunning().mode != "off" ) {
print( "Waiting for Balancer to stop..." );
sleep( 1000 );
}
3

在备份过程中,分片集群必须保持锁定状态,以保护数据库不会被写入,因为写入可能会导致备份不一致。

要锁定分片集群,请连接到 mongos 并使用 db.fsyncLock() 方法:

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

要确认锁定,请在配置服务器的 mongos 和主服务器 mongod 上运行以下聚合管道,并确保所有分片都已锁定:

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 ] }
} }
] )
[ { fsyncLocked: true }, { fsyncUnlocked: false } ]
4

要备份分片集群,请使用 mongodump 连接到 mongos 并执行备份:

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

备份完成后,您可以解锁集群以允许恢复写入。

要解锁集群,请使用 db.fsyncUnlock() 方法:

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

要确认解锁,请在配置服务器的 mongos 和主节点 mongod 上运行以下聚合管道,并确保所有分片都已解锁:

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 ] }
} }
] )
[ { fsyncLocked: false }, { fsyncUnlocked: true } ]
6

要重新启动负载均衡器,请使用 sh.startBalancer() 方法:

sh.startBalancer()

要确认负载均衡器正在运行,请使用 sh.getBalancerState() 方法:

sh.getBalancerState()
true

当负载均衡器运行时,该命令返回 true。

要恢复备份:

  • 对于分片集群,请参阅从数据库转储恢复自管理分片集群。

  • To a replica set or standalone, run mongorestore directly against mongod:

    mongorestore --nsExclude='config.*' /path/to/backup

有关更多信息,请参阅使用 MongoDB 工具进行备份和恢复。