MySQL Xtrabackup 备份期间会阻塞 DDL 吗?

MySQL 通常使用开源工具 Xtrabackup 进行物理备份,备份过程中不会影响正常业务的写入,但是是否会阻塞 DDL 操作呢?或者 DDL 操作是否会导致 Xtrabackup 备份失败?下面通过实例测试来看一下。

  • MySQL 版本:Percona Server for MySQL 5.7.19
  • Xtrabackup 版本:2.4.3

1. 先执行 DDL,然后执行备份

步骤:

  1. 创建一张表,该表磁盘占用约 5G,对该表进行 DDL,增加一个字段。
  2. 在 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

步骤:

  1. 创建一张表,该表磁盘占用约 5G。
  2. 使用 xtrabackup 对数据库进行备份。
  3. 在 xtrabackup 拷贝 ibd 文件时,执行 DDL 语句,给表添加字段。
  4. 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 存在的原因导致失败。

文章评论

0条评论