问题概述
xtrabackup备份失败,日志中有这样的信息
InnoDB: An optimized (without redo logging) DDLoperation has been performed. All modified pages may not have been flushed to the disk yet.
问题原因
redo logs会跳过一些DDL,Percona XtraBackup 监测到redo log 有跳过时,它会中止备份以防止创建一个损坏的备份,所以上面的问题也就出现了。
解决方案
为了避免该问题官方提供的解决方案就是加上–lock-ddl
根据官方说明–lock-ddl只适用于Percona Server的MySQL服务器,如果像MariaDB是不适用的。产生的报错如下:
LOCK TABLES FOR BACKUP is not supported.
所以官方更推荐使用–lock-ddl-per-table,这个参数使用任何server。
总结
Sorted Index Builds不会写redo记录,而是用一个检查点来将脏页刷到磁盘。而页清理线程会及时地将索引脏页刷到磁盘,以减少执行检查点所花时间和开销。
同时也是由于创建索引不记录redo,所以在xtrabackup备份期间,如果执行了创建索引操作,备份将会终止,因为xtrabackup无法从redo中获取创建索引的操作,在利用备份apply-log时也就无法重现创建索引的操作。
所以备份的时候加上–lock-ddl-per-table就能够解决相关问题了。