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)
相关推荐
小陈工1 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
科技小花5 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸5 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain5 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希6 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神6 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员6 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java6 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿6 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴7 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存