繁体   English   中英

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

[英]mysqldump or mysqlhotcopy to backup large MySQL database?

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

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

mysqlhotcopy比mysqldump快,但不做InnoDB。

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

对于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。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM