MySQL 通常使用开源工具 Xtrabackup 进行物理备份,备份过程中不会影响正常业务的写入,但是是否会阻塞 DDL 操作呢?或者 DDL 操作是否会导致 Xtrabackup 备份失败?下面通过实例测试来看一下。
- MySQL 版本:Percona Server for MySQL 5.7.19
- Xtrabackup 版本:2.4.3
1. 先执行 DDL,然后执行备份
步骤:
- 创建一张表,该表磁盘占用约 5G,对该表进行 DDL,增加一个字段。
- 在 DDL 执行过程中,启动 xtrabackup 进行备份,观察备份的输出日志,其中拷贝 ibd 文件正常,最后执行 lock tables for backup 被阻塞,显示 Waiting for backup lock。备份过程会一直等待,直到 DDL 执行完成之后,xtrabackup 会报错退出,报错信息如下:
[FATAL] InnoDB: An optimized(without redo logging)
DDLoperation has been performed. All modified pages may
not have been flushed to the disk yet.
PXB will not be able take a consistent backup. Retry
the backup operation
...
2. 先执行备份,然后执行 DDL
步骤:
- 创建一张表,该表磁盘占用约 5G。
- 使用 xtrabackup 对数据库进行备份。
- 在 xtrabackup 拷贝 ibd 文件时,执行 DDL 语句,给表添加字段。
- DDL 执行正常,备份进程在最后阶段执行 lock tables for backup 被阻塞,一直等待 DDL 执行完成之后,xtrabackup 会报错失败,报错信息与先执行 DDL 的场景相同。
3. 结论
DDL 操作 与 xtrabackup 备份是冲突的,DDL 的优先级比备份要高,不管是先执行 DDL,还是先执行备份,最后失败的总是备份,备份不会阻塞 DDL。
注意:
Xtrabackup 8.0 版本(目前最新版本 8.0.13)针对备份与 DDL 同时执行时,总是备份失败的问题,增加了新的参数 --lock-ddl,来避免该问题。使用 --lock-ddl 参数进行备份时,能够阻塞 DDL 操作,避免备份因为 DDL 存在的原因导致失败。