对于 InnoDB,没有复制的最佳解决方案似乎是:
mysqldump mydbname --result-file=mydbname.sql --verbose --single-transaction
它使用 InnoDB 的事务快照功能,并允许正常(写入!)数据库操作而不会中断。用--master-data=1
你甚至应该能够自动记录快照的二进制日志位置。但是,在同一台服务器上的多个数据库上单独执行此操作时,二进制日志位置似乎毫无价值。
一个缺点是当你有一些 MyISAM 表时,这不能正常工作。我自己使用 MySQL 的全文索引,它需要未分区的 MyISAM 表。但是,可以这样安排,MyISAM 表只是辅助数据集,将 InnoDB 表中已经存在的文本转储到其中,以便在需要时可以从头开始重建 MyISAM 表。我有一个脚本可以检查数据库的表类型并使用--single-transaction
,而不是--lock-tables
在一个数据库中只有 InnoDB 表时使用。
另一种解决方案是使用一些磁盘或文件系统快照功能,例如 LVM。但是,由于 LVM 极其愚蠢的写时备份机制(这被错误地声称是 COW,这不是常识),当存在快照时写入时,这将是一个相当大的性能损失。因此,一个非常好的解决方案似乎是 Solaris ZFS 或 FreeBSD UFS 上的 MySQL。两者都支持高效的快照,并且由于它们的年龄而相对稳定。Btrfs 也有高效的快照,但仍然是 BETA。