对于InnoDB,没有复制的最佳解决方案似乎是:
mysqldump mydbname --result-file=mydbname.sql --verbose --single-transaction
使用InnoDB的交易快照功能,并允许正常(写!)在所有数据库操作,而不会中断。使用--master-data=1
,您甚至应该能够自动记录快照的二进制日志位置。但是,在同一服务器上的多个数据库上单独执行此操作时,二进制日志位置似乎毫无价值。
缺点是,当你有一些MyISAM表时,这不起作用。我自己使用MySQL的全文索引,它需要未分区的MyISAM表。但是,我们可以按照MyISAM表格仅作为辅助数据集的方式进行排列,其中一个转储已存在于InnoDB表中的文本,从而可以在需要时从头开始重新构建MyISAM表。我有一个脚本,用于检查数据库的表类型,并且每当在一个数据库中只有InnoDB表时,将使用--single-transaction
而不是--lock-tables
。
另一种解决方案是使用一些磁盘或文件系统快照功能,例如LVM。但是,由于LVM非常笨拙的备份写入机制(这被错误地声称是COW,它不是常识),因此在写快照时存在相当大的性能影响。因此,一个很好的解决方案似乎是Solaris ZFS或FreeBSD UFS上的MySQL。两者都支持高效的快照,并且由于年龄的原因相对稳定。 Btrfs也有高效的快照,但仍然是测试版。
我并不想为整个额外的服务器付费,只是做备份。我刚才读到的一些东西是Maatkit,它的并行mysqldump听起来很有趣。我的服务器有16个CPU,所以这基本上是让从服务器做备份的下一个最好的事情? – 2009-06-03 04:26:48