InnoDB 中文参考手册 --- 15 故障检测与修复
2024-07-21 02:08:54
供稿:网友
中国最大的web开发资源网站及技术社区,
innodb 中文参考手册 --- 犬犬(心帆)翻译 15 故障检测与修复 一个普遍的规则就是当一个操作挫败或你怀疑是一个 bug,你必须查看 mysql 服务程序 mysqld 的错误日志(error log),通常命名为 'hostname'.err,或 windows 下的 mysql.err。 当进行故障检测并修复时,在命令提示符下运行 mysql 服务程序 mysqld 是一个较好的方式,不要通过 safe_mysqld 的包装(wrapper)或以 windows 服务启动。你可以看到 mysqld 在命令提示符窗口上的显示,而可以更好地把握什么将要发生。在 windows 下,你必须以 --console 选项运行 mysqld-max 来使输出直接显示在 ms-dos 提示符窗口上。 如果问题与性能有关(performance-related),或你的服务看起来将要挂起,你可以使用 innodb_monitor 来显示 innodb 内部状态的相关信息。如果问题是由于锁定引起,使用 innodb_lock_monitor。如果问题是在建表时或其它的数据字典操作,使用 innodb_table_monitor 显示 innodb 内部数据字典的内容。 如果你怀疑表已损坏,在表上运行 check table 。15.1 发现并修复数据字典错误的操作
一个特殊的有关表的问题就是 mysql 在它自己的数据目录下的 .frm 文件中保存它自己的数据字典信息,然而 innodb 将它自己的信息保存在数据文件中 innodb 自己的数据字典中。如果你在外部移走了 .frm 文件,或在 mysql < 3.23.44 的版本中使用了 drop database ,或在数据字典操作时服务器崩溃了,那么 .frm 文件可能会因与 innodb 内部的数据字典 out-of-sync 而结束。
与数据字典 out-of-sync 的一个故障现象就是 create table 语句的调用失败。那么你必须查看错误日志。如果错误述说为表在 innodb 内部数据字典中已存在,那么一定在 innodb 的数据文件中存在一个孤表(orphaned table),没有相对应的 .frm 文件。
innodb: error: table test/parent already exists in innodb internal innodb: data dictionary. have you deleted the .frm file innodb: and not used drop table? have you used drop database innodb: for innodb tables in mysql version <= 3.23.43? innodb: see the restrictions section of the innodb manual. innodb: you can drop the orphaned table inside innodb by innodb: creating an innodb table with the same name in another innodb: database and moving the .frm file to the current database. innodb: then mysql thinks the table exists, and drop table will innodb: succeed.
你可以跟从上面错误日志中的提示移除(drop)孤表(orphaned table)。
另一个与数据字典 out-of-sync 的故障现象就是 mysql 提示不能打开一个文件 yourtablename.innodb 的错误。
error 1016: can't open file: 'child2.innodb'. (errno: 1)
在错误日志中可以发现:
innodb: cannot find table test/child2 from the internal data dictionary innodb: of innodb though the .frm file for the table exists. maybe you innodb: have deleted and recreated innodb data files but have forgotten innodb: to delete the corresponding .frm files of innodb tables?
意思就是有一个孤的(orphaned) .frm 文件,在 innodb 中没有相应的表与之对应。可以通过手工删除 .frm 文件来移除它。
如果在一个 alter table 操作时 mysql 崩溃了,你可能会因在 innodb 表空间在存在一个孤的临时表而告终。通过 innodb_table_monitor ,你可以发现一个名为 #sql... 的表,但是 mysql 不允许访问任何一个如此命名的表,你将不能转储(dump)或移除(drop)它。解决办法就是使用从 3.23.48 开始 innodb 支持的一个特殊的机制。
如果在表空间内存在一个孤表(orphaned table) #sql... ,那么调用
create table `rsql..._recover_innodb_tmp_table`(...) type = innodb;
使表定义与临时表相似,你可以使 innodb 将孤表重命名为 `rsql..._recover_innodb_tmp_table`。那么你就可以转储或移除重命名后的表了。 表名中的反引号是必须的,因为临时表命名中包含字符 '-'。