
一个生产环境模拟了1TB的InnoDB实例,使用了NVMe SSD作为存储介质,有32个CPU核心和64GB内存,运行的是MySQL 5.7版本,所有的备份数据都保存在本地的快速硬盘上。
mysqldump 使用单事务导出 SQL 文本,通过执行 mysql < dump.sql 来恢复数据。在没有并发优化的情况下,1TB 的数据导入大约需要 12 个小时;即使分表并行导入,仍然会受到 SQL 解析、索引重建和 redo 写入的限制,无法将恢复时间缩短到 3 小时以内。
xtrabackup 采用物理复制的方式,即先进行 copy-back 操作然后再执行 prepare(回放 redo 日志)步骤。对于1TB的数据来说,copy-back 大约需要18分钟左右的时间来完成,在 NVMe 环境下做prepare 大约要50分钟左右的时长,整个恢复过程大概70分钟左右;如果提前完成了prepare的话那么紧急切换就可以更短一些了。
主要的区别不是备份速度快慢的问题,而是恢复方式不同:逻辑备份需要重新执行所有的行级INSERT语句来重建索引,而物理备份则直接把页面文件还原出来进行崩溃恢复对齐。
跨版本迁移、单表抽取、结构审计等情况下,mysqldump依然无法替代;TB级别的数据备份和RTO要求高的业务中,xtrabackup成为了硬性标准。
总结
在TB级别的数据量下,xtrabackup的恢复速度要比mysqldump快很多倍,但是prepare这一步不能省略;逻辑备份的优势在于其灵活性,而物理备份则更侧重于时效性。因此应该根据数据大小和RTO来制定不同的备份方案,并不是非此即彼的关系。