2009-06-03 64 views
2

我有一些NAS存储与我的专用主机提供商进行备份。我使用WHM设置自动每日备份来备份数据库和帐户。服务器托管一个站点。当它执行备份时,它会执行一次mysql转储,并且基本上会将该站点停留在它正在进行备份的整个时间,因为在转储发生时没有人可以连接到数据库。该网站通常会下降约30秒到一分钟(这可能看起来并不多,但对于这类网站来说这是一个真正的问题)。mysqldump或mysqlhotcopy备份大型MySQL数据库?

有没有更好的方法来做备份,这样不会发生(mysqlhotcopy或Maatkit会更好吗?),无论是备份到NAS的不同方法,还是根本不使用NAS,使用其他方法。

回答

8

mysqlhotcopy比mysqldump快,但不做InnoDB。

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

+0

我并不想为整个额外的服务器付费,只是做备份。我刚才读到的一些东西是Maatkit,它的并行mysqldump听起来很有趣。我的服务器有16个CPU,所以这基本上是让从服务器做备份的下一个最好的事情? – 2009-06-03 04:26:48

0

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

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也有高效的快照,但仍然是测试版。

0

好吧,还有另一个相当有效的快照技术:mdraid1 - Linux软件限制级别1.如果你在mdraid1上运行MySQL,只需插入另一个磁盘,让它同步,停止mysql,执行同步,删除第三个和synced raid组件,重新启动mysql。如果你使用你的raid1的位图,重新同步拍摄另一个快照通常是相当快的......