使用myisamchk进行崩溃恢复
本节描述了如何检查和处理MySQL数据库中的数据损坏问题。如果您的表经常出现损坏,应尽量找出原因。
如果您使用禁用外部锁定(默认设置)运行mysqld,您不能可靠地使用myisamchk检查正在使用相同表格的mysqld表。如果您确定在运行myisamchk时没有人可以使用mysqld访问表格,您只需在开始检查表格之前执行mysqladmin flush-tables命令即可。如果无法保证这一点,您必须在检查表格时停止mysqld。如果您在mysqld正在更新的同时运行myisamchk来检查表格,即使表格没有损坏,您也可能会收到损坏表格的警告。
如果服务器以启用外部锁定的方式运行,您可以随时使用myisamchk来检查表格。在这种情况下,如果服务器尝试更新myisamchk正在使用的表格,服务器会等待myisamchk完成后继续执行。
如果您使用myisamchk来修复或优化表格,您必须始终确保mysqld服务器没有使用该表格(如果禁用外部锁定也适用)。如果您不停止mysqld,您至少应该在运行myisamchk之前执行mysqladmin flush-tables命令。如果服务器和myisamchk同时访问表格,可能会导致表格损坏。
在进行崩溃恢复时,重要的是要理解数据库目录中每个MyISAM表tbl_name对应于以下表中显示的文件。
文件 | 目的 |
tbl_name.MYD | 数据文件 |
tbl_name.MYI | 索引文件 |
myisamchk的工作原理是逐行创建.MYD数据文件的副本。在修复阶段结束时,它会删除旧的.MYD文件并将新文件重命名为原始文件名。如果您使用--quick选项,myisamchk不会创建临时的.MYD文件,而是假设.MYD文件是正确的,并且仅生成新的索引文件而不触及.MYD文件。这是安全的,因为myisamchk会自动检测.MYD文件是否损坏,并在损坏时中止修复。您还可以向myisamchk指定两次--quick选项。在这种情况下,myisamchk不会在某些错误(如重复键错误)上中止,而是尝试通过修改.MYD文件来解决这些错误。通常,只有在磁盘空间不足以执行正常修复时,使用两个--quick选项才有用。在这种情况下,在运行myisamchk之前,您至少应该备份表格。