pbm物理备份恢复

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.物理恢复

⚠️ 注意

  1. 禁用点式恢复功能。恢复操作和点式恢复的日志分段操作是相互冲突的,不能同时进行。
  2. 在进行数据备份和恢复操作时,Percona Server for MongoDB 的版本必须属于同一主要版本系列。
  3. 请确保集群中的所有节点状态正常(即报告"PRIMARY"或"SECONDARY"状态)。
  4. 对于2.1.0之前的PBM版本,不支持对带有仲裁节点的副本集进行物理恢复。
  5. pbm系统用户必须对mongod二进制文件有执行权限

2.1 恢复前的步骤

  1. 在恢复过程中,数据库不可用,因此请先关闭所有 mongos 节点。
  2. 关闭所有 pmm-agent(监控程序) 及其他能够对数据库执行写操作的客户端程序。
  3. 手动停止仲裁节点,因为这些节点上没有 pbm-agent 能够自动完成此操作。
  4. 检查 pbm-agent.service 和 mongod.service 进程的 systemctl 重启策略,确保其设置不为alwayson-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 恢复后的步骤

  1. 删除仲裁节点上的"datadir"目录中的内容
  2. 重启所有 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最终会重新创建它。这是一个正常的过程。您无需采取任何操作。

  1. 重启所有 pbm-agent 服务
  2. 运行以下命令以将备份列表与存储设备进行同步更新:

pbm config --force-resync -w

  1. 启动负载均衡器并启动 mongos 节点。
  2. 我们建议进行一次全新的备份,以便作为未来恢复操作的新基础。
  3. 如有需要,可启用点对点恢复功能。

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)
相关推荐
xmjd msup12 小时前
mysql的分区表
数据库·mysql
Lyyaoo.12 小时前
【JAVA Spring面经】Spring 事务失效情况
java·数据库·spring
MeAT ITEM12 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
dovens12 小时前
PostgreSQL 中进行数据导入和导出
大数据·数据库·postgresql
IOT.FIVE.NO.112 小时前
claude code desktop cowork报错解决和记录Workspace..The isolated Linux environment ...
linux·服务器·数据库
Rick199312 小时前
mysql 慢查询怎么快速定位
android·数据库·mysql
科技小花20 小时前
全球化深水区,数据治理成为企业出海 “核心竞争力”
大数据·数据库·人工智能·数据治理·数据中台·全球化
X566121 小时前
如何在 Laravel 中正确保存嵌套动态表单数据(主服务与子服务)
jvm·数据库·python
虹科网络安全1 天前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
2301_771717211 天前
解决mysql报错:1406, Data too long for column
android·数据库·mysql