目前我们有一个强大的MySQL数据库,运行一些高stream量的Django网站以及一些体面的电子商务网站。 因此,我们有相当数量的使用InnoDB和MyISAM表的大型数据库。
不幸的是,由于stream量太大,我们最近遇到了困难,所以我设置了另一台主服务器来帮助缓解读取/备份。
现在,我只是简单地使用mysqldump几个参数,它被certificate是好的..直到现在。 显然mysqldump是一个缓慢的方法,但我相信我们已经超出了它的使用。 我现在需要一个很好的select,并且正在研究利用Maatkits mk-parallel-dump实用程序或LVM快照解决scheme。
简洁短版:
任何build议或意见,将不胜感激 – 因为我必须重新做我们正在做的事情,我宁愿它做得很好/最有效率:)。
我在MySQL复制和夜间压缩包方面取得了很大的成功。 对于较小的数据库,mysql数据库和模式我使用了旨在使用mysqlhotcopy和mysqldump的脚本的组合。
InnoDB 热备份是一个很好的商业产品,但我不确定它是如何处理同一个数据库中的混合表。 pQd对XtraBackup的build议可能会比较好。
其他人喜欢LVM快照,我会说这绝对是要考虑的事情。 最终,解决scheme的组合可能是最好的。
这也是值得注意的,这是一个老话题。 在高性能MySQL书籍, MySQL手册和以前的ServerFault问题之间,这个问题已经被穷尽了。 看到:
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