如何利用myisamchk和mysqlcheck快速修复损坏的MySQL数据库
由于服务器的数据库硬盘空间满了,由于大量写入数据失败导致了出现“Duplicate entry ” for key ‘username’”的错误。
如果,出现这样的mysql数据库错误很可能是mysql数据库索引出了问题。那么,什么是mysql数据库索引?
分析:索引如果是primary unique这两两种,那么数据表的数据对应的这个字段就必须保证其每条记录的唯一性。否则就会产生这个错误。
一般发生在对数据库写操作的时候,例如Discuz!4.1论坛程序要求所有会员的用户名username必须唯一,即username 的索引是unique,这时如果强行往cdb_members表里插入一个已有的username的记录就会发上这个错误,或者将一条记录的username更新为已有的一个username。
比如某网友的dedecms网站出问题了,访问一看,果然全屏报错,检查mysql日志,错误信息为:
Table .dedecmsv4dede_archives is marked as crashed and should be repaired
提示说cms的文章表dede_archives被标记有问题,需要修复。
于是赶快恢复历史数据,上网查找原因。最终将问题解决。
解决方法如下:
找到mysql的安装目录的bin/myisamchk工具,在命令行中输入:
myisamchk -c -r ../data/dedecmsv4/dede_archives.MYI
然后myisamchk 工具会帮助你恢复数据表的索引。重新启动mysql,问题解决。
那么,修复mysql数据库一般可以myisamchk工具或者mysqlcheck工具用这二种方法:
1、myisamchk工具
使用 myisamchk 必须暂时停止 MySQL 服务器。例如,我们要检修 discuz 数据库。执行以下操作:
# service mysql stop (停止 MySQL );
# myisamchk -r /数据库文件的绝对路径/*MYI
# service mysql start
myisamchk 会自动检查并修复数据表中的索引错误。
2、mysqlcheck工具
使用 mysqlcheck 无需停止 MySQL ,可以进行热修复。操作步骤如下:
# mysqlcheck -r discuz.*
# service mysql stop (停止 MySQL );
# myisamchk -r /数据库文件的绝对路径/*MYI
# service mysql start
myisamchk 会自动检查并修复数据表中的索引错误。
注意:无论是 myisamchk 还是 mysqlcheck ,一般情况下不要使用 -f 强制修复,-f 参数会在遇到一般修复无法成功的时候删除部分出错数据以尝试修复。所以,不到万不得已不要使用 -f。
资源均来自第三方,谨慎下载,前往第三方网站下载