![进行 mysql 转储会导致 Web 应用程序挂起。](https://linux22.com/image/604744/%E8%BF%9B%E8%A1%8C%20mysql%20%E8%BD%AC%E5%82%A8%E4%BC%9A%E5%AF%BC%E8%87%B4%20Web%20%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%8C%82%E8%B5%B7%E3%80%82.png)
可以在实时服务器上执行以下命令
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
。A
mysqldump
还会导致比平常更多的磁盘访问。它实际上是读取整个数据库并将其再次写出,可能写到同一个物理磁盘。从同一个物理磁盘读取和写入将导致额外的延迟(除非它们是 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 也可以直接流式传输到另一台服务器。