mysql 自动序列清除断点_MyCat教程六:全局序列号-全局主键的自增长

前面我们介绍了MyCat的分库分表操作,那么同一张表中的数据会被保存在不同的数据库中,那么这就涉及到了主键维护的问题,此时肯定不能使用单个数据库中id自增的方式来处理了,这时我们就可以通过MyCat中提供的几种增长的方式来实现

全局主键自增

一、本地文件自增方式

首先我们来看下第一种方式,也就是本地文件自增方式

1. 修改分片策略

我们原来配置的分片策略crc32slot是不支持主键自增的,所以我们需要修改为auto-sharding-long

e153499709da3668e7dc7a76f15f613e.png

2. 修改server.xml文件

server.xml文件中的sequnceHandlerType是用来配置主键生成类型的

sequnceHandlerType值

说明

0

本地文件自增方式

1

数据库自增方式

2

本地时间戳自增方式

所以我们需要先把sequnceHandlerType的值修改为0

94b0c2bf9c22ab2a44268a161f996f71.png

3.sequence_conf.properties介绍

在conf目录下的sequence_conf.properties 中有序列的相关配置信息

#Wed Oct 16 07:40:44 CST 2019

COMPANY.MAXID=2000

GLOBAL.MAXID=20000

COMPANY.HISIDS=

CUSTOMER.MAXID=2000

HOTNEWS.CURID=1000

ORDER.MINID=1001

CUSTOMER.HISIDS=

HOTNEWS.MINID=1001

GLOBAL.CURID=10002

ORDER.MAXID=2000

COMPANY.CURID=1000

CUSTOMER.CURID=1000

COMPANY.MINID=1001

GLOBAL.MINID=10001

HOTNEWS.MAXID=2000

CUSTOMER.MINID=1001

GLOBAL.HISIDS=

HOTNEWS.HISIDS=

ORDER.HISIDS=

ORDER.CURID=1000

主要的是GLOBAL.MAXID=20000 GLOBAL.CURID=10002 GLOBAL.MINID=10001 可以自行设置

4.测试实现

插入语句中主键字段用next value for MYCATSEQ_GLOBAL 替代

insert into t_user(id,name,age)values(next value for MYCATSEQ_GLOBAL,'HG-93',23)

二、本地时间戳自增方式

使用时间戳的方式,我们不需要分配策略或者选择其他的分片策略。

2a498af7235c526c2414c77013a4bd8c.png

1e7cc6215fc232234edbd171f8b712f5.png

1.修改server.xml文件

将server.xml文件中的sequnceHandlerType修改为2

f66d6749f80f1a04577397a46aa65f82.png

2.重启mycat

修改了配置文件,要让其生效需重启服务。

c843532c8a5e330573f05049c5d3a56a.png

3.插入数据测试

insert into t_user(id,name,age)values(next value for MYCATSEQ_GLOBAL,'HG-93',23)

时间戳太长将id修改为 varchar类型。

b1cb4c50452c298f38bd82b2056daa29.png

生成成功~

三、数据库自增方式

1.创建序列表和相关函数

第三种方式是在Mycat所管理的某个数据库中创建一张自增的表结构来维护相关的数据,相关的脚本官方提供的有,如下:

DROP TABLE IF EXISTS MYCAT_SEQUENCE;

CREATE TABLE MYCAT_SEQUENCE (

NAME VARCHAR (50) NOT NULL,

current_value INT NOT NULL,

increment INT NOT NULL DEFAULT 100,

PRIMARY KEY (NAME)

) ENGINE = INNODB ;

INSERT INTO MYCAT_SEQUENCE(NAME,current_value,increment) VALUES ('GLOBAL', 100000, 100);

DROP FUNCTION IF EXISTS `mycat_seq_currval`;

DELIMITER ;;

CREATE FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50))

RETURNS VARCHAR(64) CHARSET utf8

DETERMINISTIC

BEGIN DECLARE retval VARCHAR(64);

SET retval="-999999999,null";

SELECT CONCAT(CAST(current_value AS CHAR),",",CAST(increment AS CHAR) ) INTO retval

FROM MYCAT_SEQUENCE WHERE NAME = seq_name;

RETURN retval ;

END

;;

DELIMITER ;

DROP FUNCTION IF EXISTS `mycat_seq_nextval`;

DELIMITER ;;

CREATE FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS VARCHAR(64)

CHARSET utf8

DETERMINISTIC

BEGIN UPDATE MYCAT_SEQUENCE

SET current_value = current_value + increment

WHERE NAME = seq_name;

RETURN mycat_seq_currval(seq_name);

END

;;

DELIMITER ;

DROP FUNCTION IF EXISTS `mycat_seq_setval`;

DELIMITER ;;

CREATE FUNCTION `mycat_seq_setval`(seq_name VARCHAR(50), VALUE INTEGER)

RETURNS VARCHAR(64) CHARSET utf8

DETERMINISTIC

BEGIN UPDATE MYCAT_SEQUENCE

SET current_value = VALUE

WHERE NAME = seq_name;

RETURN mycat_seq_currval(seq_name);

END

;;

DELIMITER ;

我们把这些脚本在demo2上执行

823cada14bfe1367a1bf24bed96b759c.png

2.修改server.xml

9f20f46a124dce09999c7831ad56a9f2.png

3.修改sequence_db_conf.properties文件

因为demo2对应的逻辑库是 dn2所以我们需要修改此处

ac44851447d8c34badb7244021aacf38.png

4.测试

重启服务并插入数据测试

14df8022b3e4453adda04497c3dc2786.png

insert into t_user(id,name,age)values(next value for MYCATSEQ_GLOBAL,'hg-93',23)

主键的生成成功,除了这三种方式以外还可以通过`zookeeper`来维护自增的主键,这个可以自行实现

关注微信公众号【程序员的梦想】,专注于Java,SpringBoot,SpringCloud,微服务,Docker以及前后端分离等全栈技术。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值