免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 乱.码
打印 上一主题 下一主题

MyISAM表插入数据的经常Duplicate entry key的问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-04-17 17:41 |只看该作者
show create table Syslog;

| Syslog | CREATE TABLE `Syslog` (
  `id` int(11) NOT NULL auto_increment,
  `fac` tinyint(4) NOT NULL default '0',
  `pri` tinyint(4) NOT NULL default '0',
  `host` varchar(64) default NULL,
  `time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `msg` varchar(255) default NULL,
  PRIMARY KEY  (`id`),
  KEY `priSyslog` (`pri`),
  KEY `facSyslog` (`fac`),
  KEY `timeSyslog` (`time`),
  FULLTEXT KEY `msg` (`msg`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |

后面3个KEY因为在上面建立了索引常用于查询 正考虑给删了 否则应该会影响插入效率吧 但不至于是问题所在吧

论坛徽章:
1
双子座
日期:2013-08-19 14:56:16
12 [报告]
发表于 2008-04-17 17:47 |只看该作者
下次出这样的问题建议你
analyze table Syslog; 看表到底有错误没
select MAX(id) from Syslog;  检查ID
show create table Syslog;
看 ) ENGINE=MyISAM AUTO_INCREMENT=1028 DEFAULT CHARSET=latin1 |   表最后的这个ID

论坛徽章:
0
13 [报告]
发表于 2008-04-18 10:33 |只看该作者
原帖由 猪知猪之道 于 2008-4-17 17:47 发表
下次出这样的问题建议你
analyze table Syslog; 看表到底有错误没
select MAX(id) from Syslog;  检查ID
show create table Syslog;
看 ) ENGINE=MyISAM AUTO_INCREMENT=1028 DEFAULT CHARSET=latin1 |   ...


出问题的时候我用了check 列出了类似这样的错误:
error | Found xxxx keys of yyyy
error | corrupt

其中xxxx != yyyy
select max(id) from Syslog;
返回的值也不等于 最后一条记录的ID

论坛徽章:
0
14 [报告]
发表于 2008-04-24 00:01 |只看该作者
看来这个问题确实比较古怪,mysqlcheck 能解决它,不知道它做了什么事?
看了手册,只知道如果auto_increment列值达到了列的类型的最大值,那么下一次insert时,因为超出范围,mysql会用最大值赋值给auto increment计数器及列值,这时会与前面已经存在的记录冲突,报'duplicate key'

参见http://blog.chinaunix.net/u2/67276/showart_574312.html

int类型最大值上了10位数了,楼主是6位数时就出错,奇怪了!

论坛徽章:
0
15 [报告]
发表于 2008-04-24 09:12 |只看该作者
原帖由 cocolala 于 2008-4-24 00:01 发表
看来这个问题确实比较古怪,mysqlcheck 能解决它,不知道它做了什么事?
看了手册,只知道如果auto_increment列值达到了列的类型的最大值,那么下一次insert时,因为超出范围,mysql会用最大值赋值给auto in ...


有符号的11位,无符号的10位。
这个的确有点可能,不过单表的记录超过亿了。我觉得是不是应该分一下表了。

论坛徽章:
0
16 [报告]
发表于 2008-04-24 11:26 |只看该作者
原帖由 乱.码 于 2008-4-18 10:33 发表


出问题的时候我用了check 列出了类似这样的错误:
error | Found xxxx keys of yyyy
error | corrupt

其中xxxx != yyyy
select max(id) from Syslog;
返回的值也不等于 最后一条记录的ID



看你mysqlcheck的结果,可知应该是因为mysql表损坏导致这种情况.
当指定插入127这个值时,mysql发现key中已经存在(可能是因为之前在insert时,刚好在127这个地方出问题了,更新key文件ok,但更新数据文件失败).根据约束规则,所以报duplicate key错误;

论坛徽章:
0
17 [报告]
发表于 2008-04-24 12:39 |只看该作者
最直接的办法就是导出所有数据,然后导入

论坛徽章:
0
18 [报告]
发表于 2008-04-25 09:26 |只看该作者
这个问题我实在没搞清楚为什么会出现,也不明白为什么会无缘无故出现表损坏的情况,难道myisam经常出现这个问题?不清楚。
因为我并非手动插入数据,而是有个C程序持续的往里写数据,并且是单进程、单线程的,绝对不会同时有两个session往里写数据,id字段,int类型,也就是auto_increment字段也是不指定的,让其自动增长,可就是当数据量达到6位数时就会出现这个问题,执行表修复就正常了,之后偶尔也会出现。

论坛徽章:
0
19 [报告]
发表于 2008-04-25 09:53 |只看该作者
原帖由 乱.码 于 2008-4-25 09:26 发表
这个问题我实在没搞清楚为什么会出现,也不明白为什么会无缘无故出现表损坏的情况,难道myisam经常出现这个问题?不清楚。
因为我并非手动插入数据,而是有个C程序持续的往里写数据,并且是单进程、单线程的, ...



六位数?

你确定你的自增字段类型不是MEDIUMINT的?

论坛徽章:
0
20 [报告]
发表于 2008-04-25 10:22 |只看该作者
原帖由 yueliangdao0608 于 2008-4-25 09:53 发表



六位数?

你确定你的自增字段类型不是MEDIUMINT的?

不是 定义的int 系统识别的应该是int(11)

不是一到6位数就OVER了 比如有时是123456条记录OVER 有时是654321条记录OVER 我说的意思就是说在6位数时候比较常见
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP