我怎样才能减慢MySQL转储,以不影响服务器上的当前负载?

虽然做一个MySQL转储很容易,我有一个现场专用的MySQL服务器,我想要设置复制。 要做到这一点,我需要转储的数据库导入到我的复制奴隶。

问题出现在我做转储的时候,MySQL对它充满了强制性,并将资源绑定到连接到它的站点上。 我想知道是否有一种方法来限制转储查询到一个低优先级的状态,哪个偏好给活连接? 这个想法是,来自外部网站的负载不受MySQL完成转储工作的影响。

我有非常大的数据库,有数以万计的表,其中一些数据库在数以十万计的条目中有高达5GB的数据。 (我运行一个stream行的服务)…备份这些数据库时,我总是头痛。 使用默认的mysqldump,它会使服务器负载快速失去控制并locking一切…影响我的用户。 试图停止这个过程可能会导致崩溃的表和大量的恢复这些表中的停机时间。

我现在用…

mysqldump -u USER -p --single-transaction --quick --lock-tables=false DATABASE | gzip > OUTPUT.gz 

dev.mysql.com上的mysqldump引用甚至说…

要转储大型表,您应该将–single-transaction选项和–quick结合起来。

说什么依赖于数据库是InnoDB,我的myISAM,这对我来说工作得很好。 服务器负载几乎完全不受影响,我的服务在整个过程中像劳力士一样运行。 如果您有大型数据库,并且备份它们会影响您的最终用户…这就是解决scheme。 ;)

如果使用InnoDB表,使用mysqldump的–single-transaction和–quick选项

使用nice和gzip命令以最低优先级执行命令。

 nice -n 10 ionice -c2 -n 7 mysqldump db-name | gzip > db-name.sql.gz 

您可以在mysqldump命令前添加以下内容:

 ionice -c3 nice -n19 mysqldump ... 

哪个会以较低的IO和CPU优​​先级来运行,所以应该限制它的影响。

注意,这只会延迟MySQL执行之间的时间。 脚本本身仍然像以前一样密集,只是脚本之间有较长的间隔。