美文网首页
MyCat插入数据mycat_sequence中current_

MyCat插入数据mycat_sequence中current_

作者: _空格键_ | 来源:发表于2021-02-23 20:35 被阅读0次

    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

    相关文章

      网友评论

          本文标题:MyCat插入数据mycat_sequence中current_

          本文链接:https://www.haomeiwen.com/subject/rukdfltx.html