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)
相关推荐
星梦清河2 小时前
MySQL--常见函数
数据库·mysql
l1t2 小时前
对clickhouse给出的二分法求解Advent of Code 2025第10题 电子工厂 第二部分的算法理解
数据库·算法·clickhouse
IT大白2 小时前
6、数据库优化
数据库·sql
努力学习的小廉2 小时前
【QT(九)】—— 窗口
数据库·qt·系统架构
程序员敲代码吗2 小时前
用Python监控系统日志并发送警报
jvm·数据库·python
m5655bj2 小时前
使用 C# 将 Excel 表格转换为 DataTable
数据库·c#
丁丁点灯o2 小时前
帆软指定某个列连续相同的数值合并单元格
数据库
DBA小马哥2 小时前
文档型数据库MongoDB迁移替换至金仓数据库在电商商品信息存储中的应用
数据库·mongodb
周公挚友2 小时前
2026年单服务器 Ubuntu 24.04 无公网离线部署 MongoDB 8.0.17 三节点副本集(主 / 从 / 仲裁)保姆级教程
linux·mongodb·ubuntu