mysql如何使用物理备份_mysql文件级备份方式

2次阅读

物理备份不一定需停库,但多数场景需停库;唯一热备方案是percona xtrabackup或mysqlbackup,通过监听redo log与拷贝脏页实现一致性,备份时加全局读锁仅阻塞写操作。

mysql如何使用物理备份_mysql文件级备份方式

物理备份必须停库吗?

不一定,但绝大多数场景下需要停库。MySQL 的物理备份本质是直接复制数据文件(如 ibdata1.ibdmysql-bin.* 等),如果实例正在运行且有未刷盘的脏页、未提交事务或正在写入的 redo log,直接拷贝会导致文件状态不一致,恢复后大概率报错 tablespace is missing for table 或启动失败。

唯一可不停机的物理备份方式是使用 mysqlbackup(MySQL Enterprise Backup)或 Percona XtraBackup —— 它们通过监听 redo log 流 + 拷贝内存中脏页的方式实现一致性热备。开源环境基本只用后者。

  • mysqld 进程必须可访问,且用户需有 RELOADPROCESSSUPER 权限
  • 备份期间会加全局读锁(FLUSH TABLES WITH READ LOCK),只阻塞写,不影响读,所以“热”是相对的
  • 备份完成后会自动释放锁,但锁持有时间取决于数据量和 IO 速度

用 Percona XtraBackup 做一次完整备份

这是目前最主流、最可靠的 MySQL 物理备份方案,支持 MySQL 5.7/8.0、Percona Server、mariadb。注意:XtraBackup 8.0+ 只兼容 MySQL 8.0,若用 MySQL 5.7 必须用 XtraBackup 2.4。

安装后执行:

xbbackup --user=root --password=xxx --backup --target-dir=/backup/full_$(date +%F)

关键点:

  • --backup 表示执行备份(不是还原);--prepare 才是还原前的恢复准备步骤
  • --target-dir 必须是空目录,不能是已存在的备份路径
  • 默认会备份所有数据库,加 --databases="db1 db2" 可指定库
  • 备份过程生成 xtrabackup_binlog_infoxtrabackup_checkpoints,记录 binlog 位置和 LSN,用于后续增备或搭建从库

如何验证物理备份是否可用?

不能只看文件有没有拷出来,必须走完「恢复流程」并验证能启动、能查数据。常见误判是备份成功了,但没做 --prepare 就直接复制到 datadir 启动,结果报 InnoDB: Operating system Error number 2 in a file operation

正确验证步骤:

  • 先执行 xbbackup --prepare --target-dir=/backup/full_2024-06-01(该操作不依赖 MySQL 实例)
  • 停止目标 MySQL:systemctl stop mysqld
  • 清空原 datadir(如 /var/lib/mysql),再用 rsync -av /backup/full_2024-06-01/ /var/lib/mysql/
  • 改权限:chown -R mysql:mysql /var/lib/mysql
  • 启动:systemctl start mysqld,观察错误日志是否有 InnoDB: Starting crash recoveryready for connections

如果启动成功,连上去执行 select count(*) FROM some_table,确认数据行数与备份前一致。

增量备份怎么接在全量后面?

增量备份依赖全量备份的 to_lsn 值,这个值存在 xtrabackup_checkpoints 文件里。每次增备都必须基于上一次(全量或上次增备)的 prepared 状态目录来打。

实操顺序:

  • 全备后先 --prepare(此时 backup_type = full-prepared
  • 等一段时间后,执行增备:xbbackup --incremental --incremental-basedir=/backup/full_2024-06-01 --target-dir=/backup/inc_2024-06-02
  • 增备也必须 --prepare,但命令稍不同:xbbackup --prepare --apply-log-only --target-dir=/backup/full_2024-06-01(先合并全备),再 xbbackup --prepare --apply-log-only --target-dir=/backup/full_2024-06-01 --incremental-dir=/backup/inc_2024-06-02
  • 最后去掉 --apply-log-only 再跑一次 --prepare,得到最终可恢复的全量目录

漏掉 --apply-log-only 会导致后续增量无法合并,报错 lsn is higher than the last checkpoint

物理备份真正难的不是执行命令,而是理解每个环节的 LSN 链路、锁行为和 prepare 时机。很多故障不是备份失败,而是跳过了验证或混淆了 prepare 阶段——比如把未 prepare 的增备目录直接当全量用了。

text=ZqhQzanResources