我正在运行一个带有几个客户数据库的MySQL服务器,其中一些数据库非常庞大.我们每天都在做一次完整的mysql转储.完成大约需要半个小时.
在此期间,对MySQL服务器的每个请求都会得到一个非常慢的响应(有时大约1秒而不是10毫秒).即使没有超时错误,我也希望看到查询在相当长的时间内完成,因此客户网站不会因挂起MySQL查询而变慢.
我研究了很多,并了解了数据复制,LVM快照,各种mysqldump标志选项和其他解决方法,但没有什么能真正改善这种情况.
有什么选项可以在MySQL中设置查询优先级吗?
如果有一种方法可以定义查询优先级,我可以为备份进程提供较低的优先级,以确保更快地执行所有其他查询.当mysqldump进程受到另一个请求的挑战时,可以暂时暂停(SIGTSTP),并在查询完成时继续(SIGCONT).但是,我在MySQL本身找不到像这样的功能.
为mysqldump进程提供更高的nice值不起作用,因为它只会增加备份进程和表锁定的时间. (我正在锁定每个表.)此外,限制IO写入速率只会导致更长的痛苦.
除了LVM和复制之外,还有我错过的任何解决方案吗?
解决方法:
您很可能需要使用–single-transaction选项,以便每个表的转储都在一个巨大的读取事务中.这将允许您的数据的一致快照.
尽管可以在实时系统上执行mysqldumps,但最好不要在实时系统上执行mysqldumps,因为InnoDB缓冲池基本上会消除其最常用的数据.
即使您使用XtraBackup,如果您在上午12:00开始备份并且备份需要30分钟,请记住XtraBackup和mysqldump在备份时间点之间的区别:
>使用mysqldump –single-transaction创建备份,其时间点是备份的开始(12:00 AM,即使在30分钟后)
>使用XtraBackup创建数据和日志的快照,其时间点是备份的结束(12:30 AM)
建议
这听起来像你真的需要设置MySQL复制.这将使实时数据库成为主数据库.您的Slave可以作为备份的来源.
建立MySQL Replication后,您可以在Slave上执行各种备份(mysqldump),而不会干扰Master.您不再需要担心设置查询优先级或担心与mysqldump竞争的慢查询或者mysqldump消除缓冲池导致更频繁地从磁盘读取数据.
在那个奴隶身上,你可以在午夜时做以下事情
STOP SLAVE;
FLUSH TABLES;
<< Run your backup with whatever method you choose >>
START SLAVE;
或者你可以对奴隶更具侵略性
STOP SLAVE;
SET GLOBAL innodb_fast_shutdown = 0;
service mysql stop
Copy /var/lib/mysql to a backup folder
service mysql start
START SLAVE;
请回答以下帖子以获得更多建议
> 2011年4月17日:How can I optimize a mysqldump of a large database?
> 2012年6月20日:Safest way to perform mysqldump on a live system with active reads and writes?