MySQL 8.4 备份与恢复

本文说明 backup_script_8.4.ymlrestore_pitr_8.4.yml 的使用方式。

适用范围:

  • MySQL 8.4.x
  • 单实例、主从、MGR、InnoDB Cluster 元数据场景
  • 先做 clone 全备,再结合 binlog 做时间点恢复(PITR)

1. 相关剧本

/usr/local/dbbot/mysql_ansible/playbooks/backup_script_8.4.yml
/usr/local/dbbot/mysql_ansible/playbooks/restore_pitr_8.4.yml

2. 8.4 备份剧本

2.1 配置入口

文件:playbooks/vars/var_backup_script_8.4.yml

重点参数:

  • backup_topology
  • backup_scope
  • backup_preferred_host
  • backup_base_dir
  • backup_keep_full
  • backup_keep_binlog_days
  • backup_cron

默认配置示例:

backup_topology: auto
backup_scope: primary_only
backup_preferred_host: ""
backup_base_dir: "/backup"
backup_cron: "0 2 * * *"

2.2 backup_scope 说明

  • primary_only:当前默认值。适合单实例、测试环境和首次验证,开箱即用。
  • replica_one:推荐用于生产环境的主从或 MGR 场景,只让一台从库承担备份压力。
  • replica_all:所有副本都执行备份。
  • all:所有节点都执行备份。
  • selected:只在 backup_preferred_host 指定节点执行。

生产环境建议:

  • 如果你的架构存在副本,建议把 backup_scope 改为 replica_one
  • 原因是 clone 和 binlog 归档都会消耗磁盘 IO、网络和实例资源。
  • 将备份放到副本执行,可以减少对 primary 写入路径和业务响应时间的影响。
  • 保留 primary_only 更适合单实例或你明确希望在当前主节点保留备份的场景。

2.3 执行备份部署

cd /usr/local/dbbot/mysql_ansible/playbooks
ansible-playbook backup_script_8.4.yml

部署完成后,会生成:

  • {{ mysql_data_dir_base }}/scripts/backup_clone{{ mysql_port }}.sh
  • {{ mysql_data_dir_base }}/scripts/backup_schedule{{ mysql_port }}.sh
  • {{ mysql_data_dir_base }}/scripts/backup_purge{{ mysql_port }}.sh
  • {{ mysql_data_dir_base }}/scripts/backup_clone{{ mysql_port }}.conf
  • mysql 用户 crontab 中的定时任务

2.4 备份产物结构

3309 为例:

/backup/mysql3309/
├── 20260307_002415/
│   ├── clone/
│   └── meta/
├── binlog/
├── binlog.txt
└── backup_3309.log

其中:

  • clone/:clone 全量快照
  • meta/:快照元数据、my.cnf 备份、clone 明细
  • binlog/:增量回放所需的 binlog 文件
  • binlog.txt:binlog 清单
  • backup_3309.log:备份日志

2.5 手工执行一次备份

su - mysql
sh /database/mysql/scripts/backup_schedule3309.sh

3. 8.4 恢复剧本

3.1 配置入口

文件:playbooks/vars/var_restore_pitr_8.4.yml

重点参数:

  • restore_mode
  • backup_snapshot_id
  • backup_source_mysql_port
  • restore_target_mysql_port
  • backup_root_dir
  • enable_pitr
  • pitr_target_time
  • pitr_target_gtid
  • pitr_target_gtid_inclusive

典型示例:

restore_mode: "new_instance"
backup_snapshot_id: "20260307_002415"
backup_source_mysql_port: 3309
restore_target_mysql_port: 3388
backup_root_dir: "/backup"
enable_pitr: true
pitr_target_time: ""
pitr_target_gtid: "7318dfcb-1978-11f1-a779-000c292d7170:10"
pitr_target_gtid_inclusive: true

规则:

  • enable_pitr: true 时,pitr_target_timepitr_target_gtid 二选一。
  • restore_mode: new_instance 会先部署一个新实例,再执行恢复。
  • mysql_port 会自动对齐到 restore_target_mysql_port

3.2 执行恢复

如果只在恢复节点执行,建议加 --limit

cd /usr/local/dbbot/mysql_ansible/playbooks
ansible-playbook restore_pitr_8.4.yml --limit 192.0.2.131

3.3 恢复后验证

mysql -uadmin -h127.0.0.1 -P3388 -pDbbot_admin@8888 -e "show databases"
mysql -uadmin -h127.0.0.1 -P3388 -pDbbot_admin@8888 -e "select * from dbbot_pitr.t order by id"

4. 使用建议

  • 先部署备份剧本,再做一次手工备份演练。
  • 恢复时优先选择新的目标端口,不要直接覆盖生产实例。
  • 生产环境上线前,至少完成一次“备份 + 恢复 + 校验”的闭环演练。