pbm的部署请参考Percona Backup for MongoDB安装部署
从Percona Server for MongoDB的 4.2.15-16 版本、4.4.6-8 版本、5.0 版本及更高版本开始支持物理备份恢复
bash
# Percona Server for MongoDB下载地址
curl -O https://downloads.percona.com/downloads/percona-server-mongodb-7.0/percona-server-mongodb-7.0.28-15/binary/tarball/percona-server-mongodb-7.0.28-15-x86_64.ol9.tar.gz
curl -O https://downloads.percona.com/downloads/percona-server-mongodb-7.0/percona-server-mongodb-7.0.28-15/binary/tarball/percona-mongodb-mongosh-2.5.10-x86_64.tar.gz
# 以上版本的Percona Server for MongoDB需要Redhat9及其衍生版的操作系统
https://mirrors.tuna.tsinghua.edu.cn/centos-stream/9-stream/BaseOS/x86_64/iso/CentOS-Stream-9-latest-x86_64-dvd1.iso
1.物理备份
⚠️ 重要警告
在备份游标打开期间,数据库检查点可以被创建,但无法被删除。这可能导致文件显著增长。
这意味着在物理备份过程中,WiredTiger 存储引擎的旧数据文件可能无法被及时清理,从而导致磁盘使用量临时增加。备份完成后,这些空间会被回收。

持续生成测试数据
json
[root@PMongoDB-01 data]# vi /data/insert.sh
#!/bin/bash
# MongoDB连接信息
HOST="localhost"
PORT="27017"
USERNAME="root"
PASSWORD="123"
DATABASE="product"
COLLECTION="order"
INSERT_LOG="/data/insert.log"
> $INSERT_LOG
# 插入数据
for i in {1..10000000}; do
# 生成随机数据
customer_id=$(( (i-1) % 50 + 1 ))
amount=$(( RANDOM % 1000 + 100 ))
status_index=$(( RANDOM % 5 ))
statuses=("待付款" "已付款" "已发货" "已完成" "已取消")
status=${statuses[$status_index]}
# 插入数据到MongoDB
mongosh "mongodb://$USERNAME:$PASSWORD@$HOST:$PORT/$DATABASE?authSource=admin" --quiet --eval "
db.$COLLECTION.insertOne({
order_id: 'ORD$i',
customer: '用户$customer_id',
amount: $amount,
status: '$status',
create_time: new Date()
})
" > /dev/null
# 等待0.01秒
sleep 0.01
# 显示进度(每1000条显示一次)
if (( i % 1000 == 0 )); then
echo "已插入 $i 条数据" >> $INSERT_LOG
fi
done
1.1 全量备份
json
[root@PMongoDB-02 ~]# pbm backup --type=physical
Starting backup '2026-01-21T01:24:03Z'....Backup '2026-01-21T01:24:03Z' to remote store '/backup/mongodb/replica_set/myrs'
1.2 备份日志

1.3 备份内容

2.物理恢复
⚠️ 注意
- 禁用点式恢复功能。恢复操作和点式恢复的日志分段操作是相互冲突的,不能同时进行。
- 在进行数据备份和恢复操作时,Percona Server for MongoDB 的版本必须属于同一主要版本系列。
- 请确保集群中的所有节点状态正常(即报告"PRIMARY"或"SECONDARY"状态)。
- 对于2.1.0之前的PBM版本,不支持对带有仲裁节点的副本集进行物理恢复。
- pbm系统用户必须对mongod二进制文件有执行权限
2.1 恢复前的步骤
- 在恢复过程中,数据库不可用,因此请先关闭所有 mongos 节点。
- 关闭所有 pmm-agent(监控程序) 及其他能够对数据库执行写操作的客户端程序。
- 手动停止仲裁节点,因为这些节点上没有 pbm-agent 能够自动完成此操作。
- 检查 pbm-agent.service 和 mongod.service 进程的 systemctl 重启策略,确保其设置不为
always或on-success
2.2 开始恢复
json
(1)检查mongod和pbm-agent服务,确保重启策略不是 always 或 on-success
systemctl show mongod.service | grep Restart
systemctl show pbm-agent.service | grep Restart
(2)关闭点式恢复功能
[root@PMongoDB-02 ~]# pbm config --set pitr.enabled=false
[pitr.enabled=false]
(3)查看备份列表
[root@PMongoDB-02 ~]# pbm list
Backup snapshots:
2026-01-21T00:35:35Z <physical> [restore_to_time: 2026-01-21T00:35:38]
2026-01-21T01:24:03Z <physical> [restore_to_time: 2026-01-21T01:24:06]
PITR <on>:
2026-01-21T00:35:39 - 2026-01-21T01:41:07
(4)恢复备份
[root@PMongoDB-02 ~]# pbm restore 2026-01-21T01:24:03Z
Starting restore 2026-01-21T01:48:10.427140885Z from '2026-01-21T01:24:03Z'..............................................Restore of the snapshot from '2026-01-21T01:24:03Z' has started.
Check restore status with: pbm describe-restore 2026-01-21T01:48:10.427140885Z -c </path/to/pbm.conf.yaml>
No other pbm command is available while the restore is running!
(5)查看恢复状态
[root@PMongoDB-02 ~]# pbm describe-restore 2026-01-21T01:48:10.427140885Z -c /data/mongod/conf/pbm_config.yaml

2.3 恢复后的步骤
- 删除仲裁节点上的"datadir"目录中的内容
- 重启所有 mongod 节点
⚠️ 注意
在集群重启后,您可能会在 mongod 日志中看到以下消息:
"s":"I", "c":"CONTROL", "id":20712, "ctx":"LogicalSessionCacheReap","msg":"Sessions collection is not set up; waiting until next sessions reap interval","attr":{"error":"NamespaceNotFound: config.system.sessions does not exist"}}}}
这是数据库启动时定期检查的预期行为。在恢复过程中,config.system.sessions 集合将被删除,但Percona Server for MongoDB最终会重新创建它。这是一个正常的过程。您无需采取任何操作。
- 重启所有 pbm-agent 服务
- 运行以下命令以将备份列表与存储设备进行同步更新:
pbm config --force-resync -w
- 启动负载均衡器并启动 mongos 节点。
- 我们建议进行一次全新的备份,以便作为未来恢复操作的新基础。
- 如有需要,可启用点对点恢复功能。
3.时间点恢复
3.1 恢复前的步骤与全量备份恢复一致
3.2 开始恢复
json
[root@PMongoDB-02 ~]# pbm restore --time 2026-01-21T01:30:06
Starting restore 2026-01-21T02:17:18.32245124Z to point-in-time 2026-01-21T01:30:06 from '2026-01-21T01:24:03Z'.........................................
# 关注pbm-agent日志,直到出现"recovery successfully finished"
[root@PMongoDB-03 ~]# tail -f /data/mongod/logs/pbm-agent.log
{"ts":1768961974,"s":3,"rs":"myrs","node":"10.0.0.103:27017","e":"restore","eobj":"2026-01-21T02:17:18.32245124Z","ep":{"T":1768961838,"I":6},"opid":"6970372e317e20e3e94e7b6e","msg":"recovery successfully finished"}

3.3 恢复后的步骤与全量备份恢复一致
3.4 查看恢复后的数据
json
# 查看恢复后的集群,数据时间恢复到了指定时间点
myrs [direct: primary] admin> use product
switched to db product
myrs [direct: primary] product> db.order.find().sort({ create_time: -1 }).limit(1)
