共计 1167 个字符,预计需要花费 3 分钟才能阅读完成。
如何利用 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。