可以在活服务器上执行以下命令
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应用程序(依赖于服务器的数据库)挂起?
一些可能性:
MyISAM表只支持表级locking,所以当mysqldump正在读表时,任何写操作都会排队等待完成。 如果写入排队,则任何其他读取将在写入后排队,从而有效地locking应用程序。 在这个意义上, mysqldump没有什么特别之处,它只是一个SELECT * FROM table ,足够长的时间才能发生写入并排队。
InnoDB表支持行级locking,这意味着读写操作只要不触及相同的行就可以交错。 有一些查询types可以locking整个表(例如ALTER table ... ),但是如果您经常运行这些查询types,那么在mysqldump发生之前就会造成很多麻烦。
一个mysqldump也可以导致比平常更多的磁盘访问。 它可以有效地读取整个数据库并将其重新写回,可能是写入同一个物理磁盘。 从相同的物理磁盘读取和写入将导致额外的延迟(除非它们是SSD),因为正在读取和写入的磁盘部分必须是不同的,因此将会有更多的search需要时间。 这将提高您的盒子的平均负载,并会导致需要磁盘访问的任何其他操作变慢。
大多数数据库存储更多的数据比他们有RAM。 你的mysqldump可能已经刷新了你的文件系统caching,并且填充了大部分无用的数据,这意味着其他磁盘访问请求将不得不来自实际的磁盘(当时具有过多延迟),而不是来自更快的caching。 它也可能会在MySQL中刷新caching,这取决于您为每个caching设置的限制。
根据您的MySQLconfiguration,触摸每个表的mysqldump可能会导致MySQL使用比您可用的更多的RAM。 这会导致一些活动RAM被换出到磁盘,进一步增加磁盘利用率,并对性能产生巨大的影响。
在你的系统上运行mysqltuner.pl来帮助你调整你的configuration,如果你正在使用MyISAM,考虑切换到InnoDB而不是MyISAM。 尝试将备份直接传输到备份服务器,而不是将它们写入同一磁盘。 (这可以通过很多方法实现,但是这个方法mysqldump [OPTIONS] | gzip | ssh "cat - > database_backup.$(date +%F).sql.gz" <BACKUPHOST> : mysqldump [OPTIONS] | gzip | ssh "cat - > database_backup.$(date +%F).sql.gz" <BACKUPHOST> ,您可以使用Percona的XtraBackup作为更好的备份工具,其效率与纯文件副本大致相同,可用于初始化复制。 XtraBackup也可以直接stream到另一台服务器。