MyCat插入数据mycat_sequence中current_value没有递增

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Mycat入门 转载自https://chenjiabing666.github.io/2018/10/07/My...
    爱撒谎的男孩阅读 5,829评论 0 1
  • mycat是什么---作用:java应用程序与数据库紧耦合-----解耦application和db高访问量高并发...
    ___Kevin阅读 3,649评论 0 0
  • 基于 Mycat 1.6.7.3 版本 为什么要分库分表 1、数据库性能瓶颈的出现1)对于应用来说,如果数据库性能...
    vincent浩哥阅读 4,538评论 0 0
  • NoSQL 根本性的优势在于在云计算时代,简单、易于大规模分布式扩展,并且读写性能非常高 关系型数据库NoSQL ...
    Q南南南Q阅读 3,698评论 0 7
  • 第 第1 章 数据库章节1.1 选择1.1.1 Having 子句的作用是(C) 。A.查询结果的分组条件 B.组...
    亮仔_c1b5阅读 5,845评论 0 0

友情链接更多精彩内容