网站突然出现如下错误:
MySQL Error : Duplicate entry '1' for key 'views'
MySQL Errno : 1062
Message : Duplicate entry '1' for key 'views'
我用
myisamchk cdb_posts.myi -r
修复了表,不过表views的内容被清空了(这个命令一定要在停止mysql的时候),还好我这边是文章访问量表,不是非常重要,之前也做了备份!
还有不用停止进行热修复的mysqlcheck:
两个命令介绍如下:
1、myisamchk
使用 myisamchk 必须暂时停止 MySQL 服务器。例如,我们要检修 discuz 数据库。执行以下操作:
# service mysql stop (停止 MySQL );
# myisamchk -r /数据库文件的绝对路径/*MYI
# service mysql start
myisamchk 会自动检查并修复数据表中的索引错误。
2、mysqlcheck
使用 mysqlcheck 无需停止 MySQL ,可以进行热修复。操作步骤如下:
# mysqlcheck –r DBname Tablename –uuser –ppassword
注意,无论是 myisamchk 还是 mysqlcheck ,一般情况下不要使用 -f 强制修复,-f 参数会在遇到一般修复无法成功的时候删除部分出错数据以尝试修复。所以,不到万不得已不要使用 -f。
推荐用下面的两个修复表不过有点慢:
REPAIR TABLE `table_name` 修复表
OPTIMIZE TABLE `table_name` 优化表
在大多数情况下,你也可使用命令OPTIMIZE TABLES优化并修复表,如果不是非常情况还是少用myisamchk吧,虽然myisamchk快或可靠(在真正的致命错误的情况下)。
主要是OPTIMIZE TABLE较易使用并且你不必须关心清空表。
如果你删除了一个表的大部分或如果你用变长的行对一个表(有VARCHAR、BLOB或TEXT列的表)做了改变,应该使用OPTIMZE TABLE。删除的记录以一个链接表维持并且随后的INSERT操作再次使用老记录的位置。你可以使用OPTIMIZE TABLE回收闲置的空间。
OPTIMIZE TABLE通过制作原来的表的一个临时副本来工作。老的表被拷贝到新表中(没有闲置的行),然后原来的表被删除并且重命名一个新的。这样做使得所有更新自动转向新的表,没有任何失败的更新。当OPTIMIZE TABLE正在执行时,原来的表可被另外的客户读取。对表的更新和写入延迟到新表准备好为止。