运行中MySQL服务器上用FLUSH TABLES复制整个数据库的疑问
InnoDB数据库文件系统备份的常见问题解答
首先直接给结论:只直接复制datadir目录完全不安全,绝对不能用来备份运行中的InnoDB数据库。InnoDB依赖内存缓冲池、redo/undo日志来保证事务一致性,直接复制文件时,很多脏数据还在内存里没刷盘,日志和数据文件也可能处于不一致状态,恢复时轻则数据丢失,重则整个库损坏无法启动。
接下来聊聊你提到的FLUSH TABLES ... FOR EXPORT——这确实是官方认可的、不用停服就能安全备份InnoDB表的方案,它的核心作用是:
- 把指定表的缓冲池脏页强制刷到磁盘,确保数据文件和内存状态一致
- 生成对应的.cfg元数据文件,记录表的结构和空间信息,恢复时能正确识别表
- 给目标表加上只读锁,防止备份期间有写入操作破坏数据一致性
然后解答你最关心的:如果对整个数据库执行(比如FLUSH TABLES IN my_database FOR EXPORT)会发生什么?
- 这个语法是完全支持的!它会对目标数据库里所有InnoDB表批量执行上面提到的刷盘、生成.cfg、加只读锁操作
- 执行后,该库下所有InnoDB表都会进入只读状态,所有写入请求(INSERT/UPDATE/DELETE等)都会被阻塞,直到你执行
UNLOCK TABLES释放锁 - 划重点:这个操作只作用于InnoDB表,如果你库中有MyISAM等其他引擎的表,得额外执行
FLUSH TABLES WITH READ LOCK来保证它们的一致性 - 此时你就可以放心复制该数据库对应的目录下的所有相关文件(.ibd、.cfg,MySQL 5.7及更早还有.frm),复制完成后一定要立刻执行
UNLOCK TABLES,不然业务会一直卡着
最后补充几个实操注意事项:
- 执行这个语句需要
RELOAD和LOCK TABLES权限,提前确认你的账号有对应权限 - MySQL 8.0及以上版本已经移除了.frm文件,只需要关注.ibd和.cfg文件即可
- 如果备份过程中出了意外,哪怕复制没完成,也一定要手动执行
UNLOCK TABLES解锁,别让锁一直挂着影响业务 - 如果你的数据库规模很大,锁表时间太长会影响业务连续性,这种情况下更推荐用Percona XtraBackup这类热备份工具,它能在不锁表的情况下完成一致性备份
内容的提问来源于stack exchange,提问作者Omn
相关产品推荐
相关产品推荐

