非阻塞 MySQL 备份

Ger*_*ald 5 mysql replication mysqldump performance backup

我正在运行带有几个客户数据库的 MySQL 服务器,其中一些数据库非常大。我们每天进行一次完整的 mysql 转储。大约需要半个小时才能完成。

在这段时间内,对 MySQL 服务器的每个请求都会得到非常缓慢的响应(有时大约 1 秒而不是 10 毫秒)。即使没有超时错误,我也希望看到查询在相当长的时间内完成,因此客户网站不会因挂起 MySQL 查询而减慢速度。

我研究了很多,了解了数据复制、LVM 快照、各种mysqldump标志选项和其他变通方法,但没有什么能真正改善这种情况。

是否有任何选项可以在 MySQL 中设置查询优先级?

如果有一种方法可以定义查询优先级,我可以给备份进程一个较低的优先级,以确保所有其他查询执行得更快。该mysqldump过程可能会SIGTSTP在受到另一个请求的挑战时暂时暂停 ( ),并SIGCONT在查询完成后继续 ( )。但是,我在 MySQL 中找不到这样的特性。

mysqldump进程一个更高的nice值是行不通的,因为它只会增加备份进程和表锁存在的时间。(我正在锁定每个表。)此外,限制 IO 写入速率只会导致更长的痛苦。

除了 LVM 和复制之外,还有没有我错过的解决方案?

Ger*_*ald 7

确实瓶颈是 IO。因为我是tar -czf用来压缩文件的,而且 CPU 的性能非常好,所以驱动器根本无法处理如此快的所有数据(尽管我们使用了镜像 RAID 卷)。

mysqldump本身是完全没有问题的,但是tar 却极大地拖慢整个系统

我现在pv用来塑造管道流:

tar -czf - ./ | pv -q -L 10m > output.tgz
Run Code Online (Sandbox Code Playgroud)
  • -q禁用pv.
  • -L 10m将写入操作限制为每秒 10 MB。只需gzip通过top. 我希望它有大约 50% 的 CPU 使用率,因此 IO 影响也降低到 50%。
  • CPU 影响被隐式降低,因为它pv会减慢一切(转储本身除外,它在压缩之前完成)。

非常感谢@Michael - sqlbot 和其他人将我推向正确的方向。