mycat分库分表全局主键

     针对mycat实现对表的分库分表,插入数据时,不同库的同一名称的表会出现主键重复问题,如果通过Mycat查询该表,会有很多主键重复的数据。因此需要利用mycat的主键唯一去处理

Mycat提供了多种方式的生成主键的方式:

Server.xml文件中的参数:

<property name="sequnceHandlerType">1</property>

0 表示使用本地文件方式。

1 表示根据数据库来生成,就是我们自己配置的自增长

2 表示时间戳的方式 ID= 64 位二进制 (42(毫秒)+5(机器 ID)+5(业务编码)+12(重复累加)

3  zookeeper方式

下面主要讲通过数据库表管理的方式

环境准备:

1.创建两个Mysql数据库clyx_app_gd_010、clyx_app_gd_011,每个库中创建一个表plt_order_info_1表,两个表通过zbprov_id字段进行拆分。

建表语句:注意需要设置rec_id 主键自增

DROP TABLE IF EXISTS `plt_order_info_1`;
CREATE TABLE `plt_order_info_1` (
  `REC_ID` int(11) NOT NULL AUTO_INCREMENT,
  `ACTIVITY_SEQ_ID` int(11) NOT NULL ,
  `CHANNEL_ID` varchar(4) DEFAULT NULL ,
  `TENANT_ID` varchar(20) DEFAULT NULL,
  `ZBPROV_ID` varchar(20) DEFAULT NULL ,
  PRIMARY KEY (`REC_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

字段会通过zbprov_id字段进行拆分,zbprov_id=zb010的自动路由到clyx_app_gd_zb010中,

Zbprov_id=zb011的会自动路由到clyx_app_gd_zb011,下面就不进行这方面的说明,默认在已经分库分表的基础上进行全局自增主键管理。

2.选择其中一个库进行创建自增主键函数和需要管理全局自增主键的表

选取 clyx_app_gd_010库进行创建:mycat_sequence表,和三个函数

DROP TABLE IF EXISTS `mycat_sequence`;
CREATE TABLE `mycat_sequence` (
  `name` varchar(50) NOT NULL,
  `current_value` int(11) NOT NULL,
  `increment` int(11) NOT NULL DEFAULT '1',
  `remark` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

– name sequence名称
 – current_value 当前value
– increment增长步长,可以理解为一次增长多少个值。

-remark相当于备注,可有可无

注意:MYCAT_SEQUENCE必须大写。

获取当前sequence的值(返回当前值,增量)

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 ;

-- 设置sequence值

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 ;

-- 获取下一个sequence值

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 ;

注意创建过程中,必须使用root用户去创建,不然会报如下错误:

1419 - You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

就是因为没有SUPER privilege 权限,使用root用户重新执行即可

3.往mycat_seq_setval表中插入两条数据:

INSERT INTO `clyx_app_gd_zb010`.`mycat_sequence` (`name`, `current_value`, `increment`, `remark`) VALUES ('GLOBAL', '1000000000', '1', NULL);

INSERT INTO `clyx_app_gd_zb010`.`mycat_sequence` (`name`, `current_value`, `increment`, `remark`) VALUES ('PLT_ORDER_INFO_1', '1', '1', NULL);

需要注意的是:这里插入的表名,一定要大写

4.设置 sequence_db_conf.properties配置文件,添加如下数据:

PLT_ORDER_INFO_1=dn-zb010

PLT_ORDER_INFO_1是自增长的表名,即SEQUENCE名

dn-zb010是自增长函数所在的数据库节点

5.配置schemal.xml

 数据库的表名称为order,设定表的主键,这样mycat好给我们生成主键,而且我们是自增长,所以需要配置autoIncrement="true",这个里面 type="global" 表示是全局的表, 每个子节点,都会存在(取消该设置,如果存在每插入一条数据,会在所有的数据节点中都存在一条一样的数据)

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

<schema name="order" checkSQLschema="true" sqlMaxLimit="1000">
<table name="plt_order_info_1" dataNode="dn-zb010,dn-zb011" primaryKey="rec_id" autoIncrement="true" />  <!---type="global"一定要去掉->
</schema>

<dataNode name="dn-zb010" dataHost="localhost" database="clyx_app_gd_zb010" />
<dataNode name="dn-zb011" dataHost="localhost" database="clyx_app_gd_zb011" />

<dataHost name="localhost" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root" />
</dataHost>

</mycat:schema>

6.配置server.xml

需要修改sequnceHandlerType 为1,采用数据库方式

<property name="sequnceHandlerType">1</property>

7 插入数据测试

Insert into plt_order_info_1(activity_seq_id,tenant_id,channel_id,zbprov_id) values(‘2222’,’7,’uni099’,’zb010’);
Insert into plt_order_info_1(activity_seq_id,tenant_id,channel_id,zbprov_id) values(‘2222’,’7,’uni099’,’zb011’);

结果:

Clyx_app_gd_zb010库:

Clyx_app_gd_zb011库:

至此通过数据库表的方式管理,实现mycat分库分表全局主键完成。其中部分可能出现出入,是由于我做项目时将mycat的三个配置文件设计成表进行管理,记录文章时新增的。

版权声明:本文为博主原创文章,转载请注明本页地址。https://blog.csdn.net/l1994m/article/details/88641809

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员lm

感谢您的支持,后续分享更多知识

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值