如何减慢MySQL转储速度以免影响服务器上的当前负载?

z33*_*k3r 59 mysql backup replication mysqldump backup-strategies

虽然做一个MySQL转储很容易,但我有一个实时专用的MySQL服务器,我想设置复制.为此,我需要转储数据库以导入到我的复制从站.

问题发生在我进行转储时,MySQL会全力以赴,并将资源绑定到连接它的站点.我想知道是否有办法将转储查询限制为低优先级状态,优先级为实时连接?这个想法是来自外部站点的负载不受MySQL进行完全转储的努力的影响......

CA3*_*3LE 142

我有非常大的数据库,有数万个表,其中一些表在10百万条目中有多达5GB的数据.(我运行一个受欢迎的服务)...在备份这些数据库时,我总是头疼.使用默认的mysqldump,它会迅速使服务器负载失控并锁定一切......影响我的用户.尝试停止进程可能会导致崩溃的表以及恢复这些表期间的大量停机时间.

我现在用...

mysqldump -u USER -p --single-transaction --quick --lock-tables=false DATABASE | gzip > OUTPUT.gz
Run Code Online (Sandbox Code Playgroud)

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

要转储大型表,您应该将--single-transaction选项与--quick结合使用.

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

  • 这对我来说效果很好,并且在mysqldump发生时减半了我的页面加载时间. (5认同)
  • 由于MyISAM不支持事务,我不确定您的备份是否一致,特别是如果您有一个大型数据库.我会推荐它只用于InnoDB数据库. (4认同)

小智 40

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

  • 哇 - 带有1M条目的InnoDb表有什么区别.而不是阻止整个服务器10分钟,一切都保持顺利运行这些选项.应该早点发现这篇帖子~~~ (3认同)

Jul*_*aar 5

除了已经提到的使用--single-transactionand的解决方案之外--quick,我不会直接将结果通过管道传输到 gzip 中,而是首先将其转储为 .sql 文件,然后对其进行 gzip。(使用 && 而不是 | )

转储本身会更快,因此停机时间会更少。(根据我的测试,速度是原来的两倍

所以我会选择“&& gzip”而不是“| gzip”

df -h重要提示:首先使用!检查可用磁盘空间 因为您需要的不仅仅是管道| gzip。

mysqldump --single-transaction --quick -u user -p my_db_name > dump_name.sql && gzip dump_name.sql
Run Code Online (Sandbox Code Playgroud)

-> 这也会产生 1 个名为 dump_name.sql.gz 的文件


Dar*_*ted -3

您可以在 mysqldump 命令前加上以下前缀:

ionice -c3 nice -n19 mysqldump ...
Run Code Online (Sandbox Code Playgroud)

这将以低 IO 和 CPU 优先级运行它,因此应该限制它的影响。

注意,这只会延迟 MySQL 执行之间的时间。剧本本身仍将像以前一样密集,只是剧本之间的休息时间更长。

  • 这只会降低 mysqldump 进程的优先级。然而,mysqldump 进程只是查询数据库,查询本身以通常的优先级在 mysql 服务器上运行,并对服务器造成(几乎)相同的影响。mysqldump 不是瓶颈。 (13认同)