mycat踩坑记,一次生产bug
【心中一万的羊驼...】
进入正题。
环境
- MyCat 版本:V1.6
- MyCat SEQ配置:
sequnceHandlerType=1
,sequence表DDL是
CREATE TABLE `mycat_sequence` (
`name` varchar(50) NOT NULL,
`current_value` bigint(20) NOT NULL,
`increment` int(11) NOT NULL DEFAULT '1',
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
- MyCat 配置表
tab
自增主键: schema.xml 配置
<table name="tab" primaryKey="id" autoIncrement="true" dataNode="dn8"/>
插入 mycat_sequence 数据,步长 increment=10
INSERT INTO mycat_sequence (name, current_value, `increment`)
VALUES('TAB', 1, 10);
问题描述
Spark任务通过JDBC连接MyCat,发送insert into tab xxx
初始化一些数据。
MyCat配置了表tab
自增主键,使用insert into tab xxx
插入数据,如果sql中没有指定PK,MyCat应该会自己拼装上PK字段和值,然后将拼装后的sql发送到MySQL上去执行。
但是Spark初始化完成数据后,MySQL中已经增加了110w+的数据,mycat_sequence中tab1表的current_value是21。说明MyCat没有组装ID到insert语句中。
************************* 省略排查过程,直接上结论 *************************
总结
1、MyCat通过配置 primaryKey="id" autoIncrement="true"
来开启自增主键
2、MyCat获取PK值,先从自己的SEQ缓存中取,如果缓存中没有,就去 mycat_sequence
中获取,每次获取increment个数值放入缓存,同时更新 current_value=current_value+increment。
3、客户端发送到MyCat的 insert into tab(xx) value(xx)
中如果没有包含主键ID,MyCat会自动拼装上ID,将拼装后的SQL insert into tab(xx, ID) value(xx, 12)
发送到MySQL上执行。
关键来了:MyCat向insert拼装ID,不识别insert ignore into
,如过客户端发送到MyCat的insert带有ignore,MyCat直接将SQL发送到MySQL