MySQL 8.4 备份与恢复
本文说明 backup_script_8.4.yml 与 restore_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_topologybackup_scopebackup_preferred_hostbackup_base_dirbackup_keep_fullbackup_keep_binlog_daysbackup_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 }}.confmysql用户 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_modebackup_snapshot_idbackup_source_mysql_portrestore_target_mysql_portbackup_root_direnable_pitrpitr_target_timepitr_target_gtidpitr_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_time和pitr_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. 使用建议
- 先部署备份剧本,再做一次手工备份演练。
- 恢复时优先选择新的目标端口,不要直接覆盖生产实例。
- 生产环境上线前,至少完成一次“备份 + 恢复 + 校验”的闭环演练。