数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

mysql数据文件破坏后的修复方法


发布日期:2021年12月27日
 
mysql数据文件破坏后的修复方法

由于临时断电使用kill 中止MySQL服务进程所有的这些都可能会毁坏MySQL的数据文件如果在被干扰时服务正在改变文件文件可能会留下错误的或不一致的状态因为这样的毁坏有时是不容易被发现的当你发现这个错误时可能是很久以后的事了于是当你发现这个问题时也许所有的备份都有同样的错误

MySQL参考手册的第十五章讲述了MySQL自带的myisamchk的功能以及如何使用它检查和修复你的MySQL数据文件虽然这一章对于每个想要搭建一个强壮的MySQL服务的人都是推荐阅读的我们还是有必要在这里对其中的要点进行讨论

在我们继续之前你必须意识到myisamchk程序对用来检查和修改的MySQL数据文件的访问应该是唯一的如果MySQL服务正在使用某一文件并对myisamchk正在检查的文件进行修改myisamchk会误以为发生了错误并会试图进行修复这将导致MySQL服务的崩溃!这样要避免这种情况的发生通常我们需要在工作时关闭MySQL服务作为选择你也可以暂时关闭服务以制作一个文件的拷贝然后在这个拷贝上工作当你做完了以后重新关闭服务并使用新的文件取代原来的文件(也许你还需要使用期间的变更日志)

MySQL数据目录不是太难理解的每一个数据库对应一个子目录每个子目录中包含了对应于这个数据库中的数据表的文件每一个数据表对应三个文件它们和表名相同但是具有不同的扩展名tblNamefrm文件是表的定义它保存了表中包含的数据列的内容和类型tblNameMYD文件包含了表中的数据tblNameMYI文件包含了表的索引(例如它可能包含lookup表以帮助提高对表的主键列的查询)

要检查一个表的错误只需要运行myisamchk(在MySQL的bin目录下)并提供文件的位置和表名或者是表的索引文件名

myisamchk /usr/local/mysql/var/dbName/tblName

myisamchk /usr/local/mysql/var/dbName/tblNameMYI

上面的两个命令都可以执行对指定表的检查要检查数据库中所有的表可以使用通配符

myisamchk /usr/local/mysql/var/dbName/*MYI

要检查所有数据库中的所有表可以使用两个通配符 myisamchk /usr/local/mysql/var/*/*MYI

如果不带任何选项myisamchk将对表文件执行普通的检查如果你对一个表有怀疑但是普通的检查不能发现任何错误你可以执行更彻底的检查(但是也更慢!)这需要使用extendcheck选项

myisamchk extendcheck /path/to/tblName

对错误的检查是没有破坏性的这意味着你不必担心执行对你的数据文件的检查会使已经存在的问题变得更糟另一方面修复选项虽然通常也是安全的但是它对你的数据文件的更改是无法撤消的因为这个原因我们强烈推荐你试图修复一个被破坏的表文件时首先做个备份并确保在制作这个备份之前你的MySQL服务是关闭的

当你试图修复一个被破坏的表的问题时有三种修复类型如果你得到一个错误信息指出一个临时文件不能建立删除信息所指出的文件并再试一次这通常是上一次修复操作遗留下来的

这三种修复方法如下所示

myisamchk recover quick /path/to/tblName

myisamchk recover /path/to/tblName

myisamchk saferecover /path/to/tblName

第一种是最快的用来修复最普通的问题而最后一种是最慢的用来修复一些其它方法所不能修复的问题

检查和修复MySQL数据文件

如果上面的方法无法修复一个被损坏的表在你放弃之前你还可以试试下面这两个技巧

如果你怀疑表的索引文件(*MYI)发生了不可修复的错误甚至是丢失了这个文件你可以使用数据文件(*MYD)和数据格式文件(*frm)重新生成它首先制作一个数据文件(tblNameMYD)的拷贝重启你的MySQL服务并连接到这个服务上使用下面的命令删除表的内容

mysql DELETE FROM tblName;

在删除表的内容的同时会建立一个新的索引文件退出登录并重新关闭服务然后用你刚才保存的数据文件(tblNameMYD)覆盖新的(空)数据文件最后使用myisamchk执行标准的修复(上面的第二种方法)根据表的数据的内容和表的格式文件重新生成索引数据

如果你的表的格式文件(tblNamefrm)丢失了或者是发生了不可修复的错误但是你清楚如何使用相应的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 r d:\mysql\data\guild\msg_tablemyi(msg_table)

check key deletechain

check record deletechain

recovering (with sort) MyISAMtable d:\mysql\data\guild\msg_tablemyi

Data records:

Fixing index

D:\mysql\bin>MYISAMCHK saferecover d:\mysql\data\guild\msg_tablemyi

recovering (with keycache) MyISAMtable d:\mysql\data\guild\msg_tablemyi

Data records:

D:\mysql\bin>

当不知道哪个表坏了可以进入mysql数据库:

use guild;

desc msg_table; 看msg_table有没有坏

修复好了进入MYSQL数据库中打命令检查show table;

上一篇:实例教程:MySQL密码恢复笔记

下一篇:mysql联结操作符