查看: 5260|回复: 12

一个非常有意思的问题

[复制链接]
论坛徽章:
1
2011新春纪念徽章
日期:2011-02-18 11:43:34
跳转到指定楼层
1#
发表于 2011-3-4 16:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我有M和S两个节点,做了主从,M是主,S是从

现在在S上show slave status发现了一个错误,Error 'Out of range value for column 'PRICE' at row 1' on query. Default database: 'hipiao'. Query: 'INSERT INTO HP_CINEMA_PLAN (ID,PIX_ID,PLAYTIME,PRICE,COMMEND,STATE,HALL_ID,PLAN_ID,PIXLENGTH,DELFLAG,SPRICE,CSTATE,SELLSTATE,PSTATE) VALUES ('5c39b490-45f3-11e0-abcc-001bb97ef1a4',0x34616238383462302D313233382D313165302D383863362D303031393231363431613863,0x323031312D30332D30342031303A31303A3030,0x3430,'0',0x30,0x37323535353865302D393439382D313164662D613830652D303031626239376566316134,0x323939363331,0x3930,'1',0x3430,0x30,0x30,0x30)'

说值超出了字段设置的长度,但问题不在这里,我去主上看binlog,也是记录的'INSERT INTO HP_CINEMA_PLAN (ID,PIX_ID,PLAYTIME,PRICE,COMMEND,STATE,HALL_ID,PLAN_ID,PIXLENGTH,DELFLAG,SPRICE,CSTATE,SELLSTATE,PSTATE) VALUES ('5c39b490-45f3-11e0-abcc-001bb97ef1a4',0x34616238383462302D313233382D313165302D383863362D303031393231363431613863,0x323031312D30332D30342031303A31303A3030,0x3430,'0',0x30,0x37323535353865302D393439382D313164662D613830652D303031626239376566316134,0x323939363331,0x3930,'1',0x3430,0x30,0x30,0x30)'。

但是我去数据库中查ID='5c39b490-45f3-11e0-abcc-001bb97ef1a4',
却能正确显示,这些字段的值都不是十六进制的。该表的字段类型如下:
| ID        | varchar(36)  | NO   | PRI | NULL    |       |
| PIX_ID    | varchar(36)  | NO   |     | NULL    |       |
| PLAYTIME  | datetime     | NO   |     | NULL    |       |
| HALL_ID   | varchar(36)  | NO   | MUL | NULL    |       |
| PRICE     | decimal(5,2) | NO   |     | NULL    |       |
| COMMEND   | char(1)      | NO   |     | 0       |       |
| STATE     | char(1)      | NO   |     | NULL    |       |
| DELFLAG   | char(1)      | NO   |     | 1       |       |
| PLAN_ID   | varchar(20)  | NO   |     | NULL    |       |
| PIXLENGTH | varchar(20)  | YES  |     | NULL    |       |
| SPRICE    | decimal(5,2) | YES  |     | 0.00    |       |
| CSTATE    | varchar(5)   | YES  |     | 0       |       |
| SELLSTATE | varchar(5)   | YES  |     | 0       |       |
| PSTATE    | char(1)      | YES  |     | NULL    |       |

问题来了,如果说这个语句在向M写入时能写成功(binlog都写进去了,肯定是成功的),那为什么同样的语句在S却无法执行?如果S不能直接执行这些语句,那么我的主库也应该无法执行这种语句啊,可是为什么却执行成功了,并且转化为正确的格式呢?

另外,两台mysql参数配置都一样,mysql版本5.1.35。

请各位大虾指点迷津!
论坛徽章:
1
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:29
2#
发表于 2011-3-4 18:16 | 只看该作者
检查SQL模式

使用道具 举报

回复
论坛徽章:
4
ITPUB9周年纪念徽章
日期:2010-10-08 09:28:52数据库板块每日发贴之星
日期:2011-01-29 01:01:012011新春纪念徽章
日期:2011-02-18 11:43:33数据库板块每日发贴之星
日期:2011-02-26 01:01:01
3#
发表于 2011-3-6 17:02 | 只看该作者
关注 不是很懂

使用道具 举报

回复
论坛徽章:
4
ITPUB9周年纪念徽章
日期:2010-10-08 09:31:222011新春纪念徽章
日期:2011-02-18 11:43:34ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262012新春纪念徽章
日期:2012-01-04 11:53:29
4#
发表于 2011-3-6 23:24 | 只看该作者
主备字段类型是否完全一致?
是否传入了中文字段?

使用道具 举报

回复
论坛徽章:
5
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522011新春纪念徽章
日期:2011-02-18 11:43:35迷宫蛋
日期:2011-11-02 16:14:29
5#
发表于 2011-3-9 16:02 | 只看该作者
感觉LZ离我很近 hipiao ........

使用道具 举报

回复
论坛徽章:
3
2010新春纪念徽章
日期:2010-03-01 11:20:072011新春纪念徽章
日期:2011-02-18 11:42:49ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
6#
发表于 2011-3-9 17:17 | 只看该作者
离我也很近,莫非。。。。。。。。。。。。。。。??????

使用道具 举报

回复
论坛徽章:
52
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:33:22生肖徽章2007版:龙
日期:2012-02-07 10:32:552012新春纪念徽章
日期:2012-02-07 09:59:35
7#
发表于 2011-3-10 10:59 | 只看该作者

回复 #1 horonunu 的帖子

mysqlbinlog --v-v的模式翻译成非16制的

使用道具 举报

回复
论坛徽章:
1
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:29
8#
发表于 2011-3-10 11:06 | 只看该作者

再次分析SQL_MODE问题

看看楼主的列定义
PRICE     | decimal(5,2)  他的范围是999.99

看看楼主插入的值
0x3430
这是一个16进制的值,换算一下是13360.00,明显超过范围了,在严格模式下会直接报错。



我模拟一下SQL_MODE,先来一个严格的。
SQL>set @@sql_mode='traditional';
Query OK, 0 rows affected (0.04 sec)

SQL>select @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                                                    |
+-------------------------------------------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER |
+-------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

SQL>insert into t1 values(0x3430);
ERROR 1264 (22003): Out of range value for column 'id' at row 1
报错。


SQL>set @@sql_mode='';
Query OK, 0 rows affected (0.00 sec)

SQL>insert into t1 values(0x3430);
Query OK, 1 row affected, 1 warning (0.03 sec)
没有报错,但是有警告。这个值被强制转换成999.99。


而楼主说,两台机器的参数配置是一样的,那我也十分不解了。

究其原因,表结构设计不好。

使用道具 举报

回复
论坛徽章:
5
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB9周年纪念徽章
日期:2010-10-08 09:28:522011新春纪念徽章
日期:2011-02-18 11:43:35迷宫蛋
日期:2011-11-02 16:14:29
9#
发表于 2011-3-21 10:00 | 只看该作者
结一下这个贴:

再描述一下整个过程:

数据库环境:主从库所有配置一致,版本5.1.35,出现主库能成功执行SQL,从库出错,出错的原因是超出字段定义大小,排查后发现主库在写入BIN LOG后,用MYSQLBINLOG不能正确翻译SQL语句,翻译过后依然16进制,导致从库直接执行出错。
应用环境:两台应用服务器,跑JAVA,用JDBC CONNECTOR连接数据库,程序排查无问题
测试说明:找了5.0.37环境,测试一切正常,新搭建5.1.35,错误依旧,后仔细排查SQL,发现所有出错SQL均出自其中一台JAVA程序,排查JDBC CONNECTOR,发现出问题的版本是5.0.3,无问题的是5.0.5,
升级后5.0.3,错误消失,原因在于JDBC CONNECTOR版本过低与高版本MYSQL配合问题。。。

使用道具 举报

回复
论坛徽章:
3
2010新春纪念徽章
日期:2010-03-01 11:20:072011新春纪念徽章
日期:2011-02-18 11:42:49ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
10#
发表于 2011-3-21 16:57 | 只看该作者

回复 #9 xiete 的帖子

楼主应该再考虑下主从的sql_mode配置不同。检查下M上那条记录的值是否正确,可能里面已经存在price数据了。

[ 本帖最后由 dimen007 于 2011-3-21 16:59 编辑 ]

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表