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

目前我们有一个强大的MySQL数据库,运行一些高stream量的Django网站以及一些体面的电子商务网站。 因此,我们有相当数量的使用InnoDB和MyISAM表的大型数据库。

不幸的是,由于stream量太大,我们最近遇到了困难,所以我设置了另一台主服务器来帮助缓解读取/备份

现在,我只是简单地使用mysqldump几个参数,它被certificate是好的..直到现在。 显然mysqldump是一个缓慢的方法,但我相信我们已经超出了它的使用。 我现在需要一个很好的select,并且正在研究利用Maatkits mk-parallel-dump实用程序或LVM快照解决scheme。

简洁短版:

  • 我有一个相当大的MySQL数据库,我需要备份
  • 目前使用mysqldump的方法效率低,速度慢(造成问题)
  • 研究诸如mk-parallel-dump或LVM快照之类的东西

任何build议或意见,将不胜感激 – 因为我必须重新做我们正在做的事情,我宁愿它做得很好/最有效率:)。

我在MySQL复制和夜间压缩包方面取得了很大的成功。 对于较小的数据库,mysql数据库和模式我使用了旨在使用mysqlhotcopy和mysqldump的脚本的组合。

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

其他人喜欢LVM快照,我会说这绝对是要考虑的事情。 最终,解决scheme的组合可能是最好的。

这也是值得注意的,这是一个老话题。 在高性能MySQL书籍, MySQL手册和以前的ServerFault问题之间,这个问题已经被穷尽了。 看到:

  • InnoDB有没有等价的mysqlhotcopy?
  • 备份MySQL服务器
  • 你通常如何备份你的数据库?

xtrabackup – 至less为innodb。

解决这个问题的最常用的方法是build立另一台MySQL服务器,甚至可以在同一台机器上运行主/从复制。 然后,您可以在从属设备上执行备份,而不会对主设备造成影响。

在EC2 EBS上,我现在正在使用xfs_freeze。 我正在考虑在某些时候可能切换到xtrabackup,但是当我第一次testing运行时,它非常非常需要CPU。

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

如果你只是为了遗留的原因保留你的MyISAM表(你没有改变它们),下面是我用来轻松解决这个问题的方法:

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

您可以使用awk正则expression式排除和包含数据库,例如上面的示例中只有以小写字母开头的dbs。 这当然会在更改期间locking表格。

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

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

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

Percona的HowTO使用xtrabackup