数据库 文件 修复-社工库数据联盟
由于临时停电,使用kill -9终止MySQL服务进程,都可能破坏MySQL数据文件。 如果服务在受到干扰时正在更改文件,则文件可能处于不正确或不一致的状态。 由于此类损坏有时不易检测,您可能需要很长时间才能发现此错误。 所以,当你发现这个问题时,可能所有的备份都有同样的错误。
MySQL参考手册第15章介绍了MySQL自带的myisamchk的功能以及如何使用它来检查和修复你的MySQL数据文件。 尽管本章推荐任何想要构建健壮的 MySQL 服务器的人阅读,但值得在这里讨论要点。
在我们继续之前,您必须意识到 myisamchk 程序应该具有访问 MySQL 数据文件的唯一权限以进行检查和修改。 如果MySQL服务正在使用一个文件并修改了myisamchk正在检查的文件数据库 文件 修复,myisamchk会误认为出了什么问题并试图修复它——这将导致MySQL服务崩溃! 这样,为了避免这种情况的发生,通常我们需要在工作时关闭MySQL服务。 或者,您可以暂时关闭服务以制作文件副本,然后处理该副本。 完成后,再次关闭该服务并用新文件替换原始文件(也许您需要使用临时变更日志)。
MySQL数据目录并不难理解。 每个数据库对应一个子目录,每个子目录包含这个数据库中的数据表对应的文件。 每个数据表对应三个文件,文件与表同名但扩展名不同。 tblName.frm文件是表的定义,保存了表中包含的数据列的内容和类型。 tblName.MYD 文件包含表中的数据。 tblName.MYI 文件包含表的索引(例如,它可能包含查找表以帮助改进对表的主键列的查询)。
要检查表是否有错误数据库 文件 修复,只需运行 myisamchk(在 MySQL bin 目录中)并提供文件的位置和表的名称,或表的索引文件的名称:
引述如下:
myisamchk /usr/local/mysql/var/dbName/tblName
myisamchk /usr/local/mysql/var/dbName/tblName.MYI
以上两个命令都可以对指定的表进行检查。 要检查数据库中的所有表,可以使用通配符:
引述如下:
myisamchk /usr/local/mysql/var/dbName/*.MYI
要检查所有数据库中的所有表,可以使用两个通配符:myisamchk /usr/local/mysql/var/*/*.MYI
没有任何选项,myisamchk 对表文件执行普通检查。 如果您对表有疑问,但正常检查没有发现任何错误,您可以使用 --extend-check 选项执行更彻底的检查(但也更慢!):
引述如下:
myisamchk --extend-check /path/to/tblName
检查错误是非破坏性的,这意味着您不必担心对数据文件执行检查会使已经存在的问题变得更糟。 另一方面,修复选项虽然通常是安全的,但不会撤消它对数据文件所做的更改。 因此,我们强烈建议您在尝试修复损坏的表文件时首先进行备份,并确保在进行此备份之前关闭您的 MySQL 服务。
当您尝试修复损坏的表的问题时,可以进行三种类型的修复。 如果您收到一条错误消息,指出无法创建临时文件,请删除该消息指示的文件并重试——这通常是上一次修复操作遗留下来的。
三个修复如下:
引述如下:
myisamchk --recover --quick /path/to/tblName
myisamchk --recover /path/to/tblName
myisamchk --safe-recover /path/to/tblName
第一个速度最快,用于解决最常见的问题; 最后一种最慢,用于修复一些其他方法无法修复的问题。
检查并修复MySQL数据文件
如果以上方法无法修复损坏的表,在你放弃之前,还可以尝试以下两招:
如果怀疑表的索引文件(*.MYI)有不可挽回的错误,甚至丢失了这个文件,可以用数据文件(*.MYD)和数据格式文件(*.frm)重新生成。 首先复制数据文件 (tblName.MYD)。 重新启动 MySQL 服务器并连接到它,使用以下命令删除表的内容:
mysql 从 tblName 中删除;
在删除表内容的同时,创建了一个新的索引文件。 注销并再次关闭该服务,然后用您刚刚保存的文件 (tblName.MYD) 覆盖新的(空的)数据文件。 最后使用myisamchk进行标准修复(上面第二种方法),根据表的数据内容和表的格式文件重新生成索引数据。
如果你的表的格式文件(tblName.frm)丢失了或者发生了不可挽回的错误,但是你知道如何使用相应的CREATE TABLE语句重新生成这个表,你可以重新生成一个新的.frm文件并用它来处理你的数据文件和索引文件(如果索引文件有问题,用上面的方法重建一个新的)。 先把数据和索引文件复制一份,然后删除原来的文件(删除数据目录下所有与这张表相关的记录)。
启动 MySQL 服务并使用原始 CREATE TABLE 文件创建一个新表。 新的 .frm 文件应该可以正常工作,但最好执行标准修复(上面的第二种方法)。
可以使用mysql语句,使用CHECK TABLE $table; // 其中$table代表数据表的名字,检查表是否损坏,如果损坏可以用REPAIR TABLE $table修复,一次不行可以多修几次!
如果使用WIN服务器,可以先登录DB服务器,进入这个路径,不用进入mysql
引述如下:
D:\CD MySQL
D:\mysql>CD BIN
D:\mysql\bin>MYISAMCHK -rd:\mysql\data\guild\msg_table.myi(消息表)
- 检查密钥删除链
- 检查记录删除链
- 恢复(带排序)MyISAM 表 'd:\mysql\data\guild\msg_table.myi'
数据记录:23
- 固定索引 1
D:\mysql\bin>MYISAMCHK --safe-recover d:\mysql\data\guild\msg_table.myi 目录
- 恢复(使用 keycache)MyISAM 表 'd:\mysql\data\guild\msg_table.myi'
数据记录:89
D:\mysql\bin>
当不知道哪张表坏了时,可以进入mysql数据库:以下是引用的内容:
使用公会;
描述 msg_table; 查看 msg_table 是否损坏
它已被修复。 进入MYSQL数据库,输入命令查看:show table; (责任编辑:大宝库)