本文地址:https://www.askmac.cn/archives/mysql-innodb-myisam-recoveryinfo.html
10.4 修复InnoDB表
在之前的章节中,我们已经了解了可以通过执行CHECK TABLE语句或使用客户端工具来发出此语句,来对InnoDB表进行检查。不过,如果InnoDB表存在问题,那么你并不能使用REPAIR TABLE来对表进行维修,因为这个命令仅对MyISAM可用。
如果检查不InnoDB表有问题,那么你应该使用mysqldump来将表恢复到一个一致性状态,即删除表,并通过dump文件进行重建:
shell> mysqldump db_name table_name > dump_file shell> mysql db_name < dump_file
在遇到MySQL服务端奔溃或数据库运行的主机奔溃后,一些InnoDB表可能会需要进行修复。正常情况下,简单的进行服务端重启就行了,因为InnoDB存储引擎在启动时会进行自动恢复作业。少数情况下,可能由于InnoDB自动恢复失败而导致服务端无法启动。如果碰到这样的情况,请按以下步骤进行操作:
- 使用带有
--innodb-force-recovery
(值范围为1~6)的命令项来重启服务端。这个值用于提高警告屏蔽级别以避免启动崩溃,对于被恢复的表,允许更高不一致容忍度。较好是值使用从4开始。 - 当你启动服务端并使用
--innodb-force-recovery
设为一个非0值,InnoDB会将表空间作为只读处理(从7.3版本开始,值为4或更大时,将使得InnoDB置于只读模式)。之后,你应该使用mysqldump工具来倒出InnoDB表数据,并在导出后,在此命令项有效的情况下将InnoDB表删除。然后在不使用--innodb-force-recovery
项的情况下重启服务端。当服务端起来后,再从导出的dump文件来恢复InnoDB表。 - 如果之前的步骤都失败了,那就有必要从之前的备份来恢复InnoDB表了。
10.5 启用MyISAM自动修复
MySQL服务端会被引导来对MyISAM进行自动检查和修复。在启用了自动恢复功能后,每张MyISAM表在被打开时都会检查之前表是否被正常关闭或它是否被标记为需要修复。如果表的状态不对,服务端就会对此表进行修复。
为了启用自动MyISAM表维护功能,就需要在启动服务端时同时使用 --myisam-recover-options
命令项(5.5.3版本之前为 --myisam-recover
)。其命令项值可以是以下一个或多个设置值(多个值之间可以使用逗号分隔):
- DEFAULT:进行默认检查
- BACKUP:告知服务端在进行表修复时,如果此表文件被修改,则在此前先对文件进行备份(即,将tbl_name.MYD备份为tbl_name-datetime.BAK)。
- FORCE:即便恢复会造成一行或多行的数据损失,也将进行恢复。
- QUICK:执行快速恢复,如果表中没有由于删除或更新导致的空洞,则跳过恢复。
举例,要告知服务端对有问题的MyISAM表进行强制恢复,而且需要在表修复时对表的修改进行旧数据备份,你可以在配置文件中加入以下命令项设置:
[mysqld] myisam-recover-options=FORCE,BACKUP
Comment