为相当大的数据库(MyISAM / InnoDB)进行MySQL备份的最佳方法


8

当前,我们拥有一个强大的MySQL数据库,该数据库运行两个基于Django的高流量网站以及一些规模合适的电子商务网站。结果,我们有大量使用InnoDB和MyISAM表的大型数据库。

不幸的是,由于流量大,我们最近遇到了麻烦,所以我设置了另一个主服务器来帮助减少读取/备份。

现在,我只是简单地使用带有一些参数的mysqldump,事实证明它是好的。显然,mysqldump是一种缓慢的快速方法,但是我相信我们已经不再使用它了。我现在需要一个很好的选择,并且一直在研究利用Maatkits mk-parallel-dump实用程序或LVM快照解决方案。

简洁的简短版本:

  • 我有一个相当大的MySQL数据库需要备份
  • 当前使用mysqldump的方法效率低下且缓慢(导致问题)
  • 调查诸如mk-parallel-dump或LVM快照之类的内容

任何建议或想法将不胜感激-因为我必须重新做我们的工作方式,所以我宁愿正确/最有效地完成它:)。

Answers:


5

我在MySQL复制和夜间tarball方面都取得了成功。对于较小的数据库,mysql数据库和架构,我使用了旨在使用mysqlhotcopy和mysqldump的脚本的组合。

InnoDB 热备份是一个很好的商业产品,但是我不确定它如何处理同一数据库中的混合表。pQd对XtraBackup的建议可能与此比较。

其他人喜欢LVM快照,我想肯定是要考虑的事情。最终,解决方案的组合可能是最好的。

同样值得注意的是,这是一个古老的话题。在《高性能MySQL》一书,MySQL手册和以前的ServerFault问题之间-一般而言,这已经用尽了。看到:


+1; 使用myisam,您永远不会知道您是否具有逻辑上一致的备份[由lvm / mysqldump /从lave进行]。也许如果您的应用程序仅在工作时间进行更改-您可以在晚上安全地将其丢弃,否则-您不确定并且没有任何方法会有所帮助。
pQd 2010年

我认为您对混合解决方案是正确的。如pQd的答复中所述,我可能会拍摄LVM快照,并查看xtrabackup实用程序(例如它可以处理混合表)。我调查了InnoDB的热备份,但是我始终是开源项目的一员。感谢您提供的参考资料,我调查了其中的2个,但答复是非常通用的/不能解决我遇到的问题/他们在引用更多的“普通”和“普通”数据库。
WinkyWolly

4

xtrabackup-至少对于innodb。


但是有趣的是,我希望有一个更优雅的解决方案,不要担心我的InnoDB / MyISAM表混合使用。
WinkyWolly 2010年

xtrabackup带有脚本,该脚本也可以帮助您备份myisams,但请查看我在Warner帖子下的评论
pQd 2010年

谢谢,看来我可能会朝这个方向发展,并混合使用LVM快照以取得良好的效果。它确实声明它也可以通过“ innobackupex”脚本“处理” MyISAM表。我想我会旋转一下,看看会发生什么。
WinkyWolly

3

解决此问题的最常见方法是设置另一个MySQL服务器,该服务器甚至可以位于同一台计算机上,并运行主/从复制。然后,您可以在从站上执行备份,而对主站的影响为零。


0

在EC2 EBS上,我现在正在使用xfs_freeze。我正在考虑可能在某个时候切换到xtrabackup,但是当我进行第一次测试运行时,它非常非常占用CPU。


不幸的是,我现在仅在媒体服务器上使用XFS,因此这不是一种选择。您对xtrabackup有什么样的经验(除了CPU饥饿,也许还有更多细节?)?您是在备份纯InnoDB表还是混合表?
WinkyWolly 2010年

我最大的犹豫是它完成时消耗了CPU 30分钟(备份了约35GB数据的数据库),从而使DB服务器仅能正常工作-肯定不是我可能会在生产主服务器上运行的东西。为此,我实际上已经将剩余的少数MyISAM表转换为InnoDB了。我认为只要在从属服务器上运行,只要它不会导致复制严重落后就可以。
user5336 2010年

0

如果您正在运行跨应用程序共享的数据库的复制,则似乎存在一个明显的问题,即是否可以通过将数据库服务器专用于应用程序来提高许多性能,包括备份。共享很不错,直到不是。


0

如果您仅出于遗留原因保留MyISAM表(您不必费心更改它们),这就是我用来轻松修复的原因:

    mysql -u root --password=<password> --database=db_name -B -N -e "SHOW TABLES" | awk '!/not_this_db/ && !/or_this_one/ && /^[a-z]/ {print "ALTER TABLE", $1, "ENGINE=INNODB;"}' | mysql -u root --password=<password> --database=db_name

您可以在awk正则表达式中排除和包括数据库,例如,在上面的示例中,仅以小写字母开头的dbs这样的数据库。当然,这将在更改期间锁定表。

然后使用xtrabackup将整个数据库直接复制到另一台服务器,而无需锁定任何表或使用过多的磁盘IO(在设置ssh rsa密钥之后):

innobackupex --throttle=500 --compress --stream=xbstream /doesntneedtoexist | ssh user@otherhost "xbstream -x -C /root/backup/"

然后您可以完全分开执行应用日志步骤,并节省生产服务器上的磁盘空间,IO和CPU。

Percona的使用Xtrabackup的HowTO

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.