mysqldump或mysqlhotcopy备份大型MySQL数据库?

时间:2009-06-03 04:18:00

标签: mysql backup mysqldump

我有一些NAS存储要与我的专用托管服务提供商进行备份。我使用WHM设置自动每日备份以备份数据库和帐户。服务器托管一个站点。当它进行备份时,它执行一个mysql转储,并且实际上在整个备份过程中将站点关闭,因为在转储发生时没有人可以连接到数据库。该网站通常会停机约30秒到一分钟(这可能看起来不多,但对于这种网站来说这是一个真正的问题)。

是否有更好的方法进行备份以便不会发生这种情况(mysqlhotcopy或Maatkit会更好吗?),无论是备份到NAS的不同方法,还是根本不使用NAS并使用它其他方法。

4 个答案:

答案 0 :(得分:8)

mysqlhotcopy比mysqldump快,但不做InnoDB。

要进行备份,我使用复制并对从属进行转储。在备份过程中,您可以获得0停机时间和无负载峰值。

答案 1 :(得分:2)

对于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也有高效的快照,但仍然是BETA。

答案 2 :(得分:0)

您不需要另一台服务器,只需将另一台MySQL安装在同一台机器上的沙盒中。负载可能会略微增加,但您不会遇到任何锁定问题。

答案 3 :(得分:0)

好吧,还有另一个相当有效的快照技术:mdraid1 - Linux softraid level 1.如果你在mdraid1上运行MySQL,只需插入另一个磁盘,让它同步,停止mysql,进行同步,删除第三个和同步raid组件,重启mysql。如果您对raid1使用位图,重新同步以拍摄另一张快照通常会非常快......