进行 mysql 转储会导致 Web 应用程序挂起。

进行 mysql 转储会导致 Web 应用程序挂起。

可以在实时服务器上执行以下命令

mysqldump -h XXXX -u root -pXXXXX --skip-opt --flush-privileges 
    --flush-logs --routines --triggers --allow-keywords 
    --create-options --add-locks --quick --single-transaction 
    --extended-insert --all-databases

导致 Web 应用程序(依赖于服务器的数据库)挂起?

答案1

一些可能性:

  • MyISAM 表仅支持表级锁定,因此当您mysqldump读取表时,任何写入都将排队,直到完成。如果写入排队,任何其他然后会在写入之后排队,从而有效地锁定应用程序。mysqldump从这个意义上讲,没有什么特别的,它只是一个SELECT * FROM table需要足够长的时间才能完成写入并排队的单一操作。

  • InnoDB 表支持行级锁定,这意味着只要不触及同一行,读取和写入就可以交错进行。有些查询类型确实会锁定整个表(例如ALTER table ...),但如果您频繁运行这些查询,它们早就会引起麻烦了mysqldump

  • Amysqldump还会导致比平常更多的磁盘访问。它实际上是读取整个数据库并将其再次写出,可能写到同一个物理磁盘。从同一个物理磁盘读取和写入将导致额外的延迟(除非它们是 SSD),因为您读取和写入的磁盘部分必须不同,因此会有更多的寻道,这需要时间。这将提高您的机器上的平均负载,并导致任何其他需要磁盘访问的操作变慢。

  • 大多数数据库存储的数据量都超过其 RAM 容量。您mysqldump可能已经刷新了文件系统缓存,并用大多数无用的数据填充了缓存,这意味着其他磁盘访问请求将不得不来自实际磁盘(此时具有过多的延迟),而不是来自速度更快的缓存。它还可能刷新了 MySQL 中的缓存,具体取决于您为每个缓存设置的限制。

  • 根据您的 MySQL 配置,mysqldump触及每个表的 可能会导致 MySQL 使用比您可用的更多的 RAM。这将导致您的部分活动 RAM 被交换到磁盘,进一步增加磁盘利用率并对性能产生巨大影响。

跑步mysqltuner.pl在您的系统上帮助调整配置,并考虑切换到 InnoDB 而不是 MyISAM(如果您当前正在使用 MyISAM)。尝试将备份直接流式传输到备份服务器,而不是将它们写入同一磁盘。(这可以通过多种方式实现,但这种方法有效:)mysqldump [OPTIONS] | gzip | ssh "cat - > database_backup.$(date +%F).sql.gz" <BACKUPHOST>如果(或一旦)您使用 InnoDB,您可以使用Percona 的 XtraBackup作为一种更好的备份工具,其效率大致与纯文件复制一样高,并且可用于初始化复制。XtraBackup 也可以直接流式传输到另一台服务器。

相关内容