前言
上一篇文章写了MYCAT的基本配置,今天这篇文章记录一下mycat自增主键的配置过程,之前使用mycat1.2 遇到一些莫名其妙的问题,特别是自己在各个数据节点上建立了表,然后到mycat中去select,遇到Packet for query is too large的问题,将mycat版本升级到了1.6.
在删除1.2版本的时候,也遇到一个问题,不知道自己什么时候执行了./mycat.bat install了,mycat注册成了windows服务,所以先要执行./mycat.bat remove.然后再删除解压的文件夹。1.6的安装和1.2一样,也是解压即可。
还有一点是,最好在schema配置好之后,在mycat上执行建表语句。好了,开始配置mycat的自增主键。
--可以采用sequence的方式
INSERT INTO gv_asn(id,wh_id,qty,createtime) VALUES(NEXT VALUE FOR MYCATSEQ_GV_ASN,3,3,NOW());
--直接省略,自增列不需赋值
INSERT INTO gv_asn(wh_id,qty) VALUES(3,3);
mycat配置文件
schema.xml:注意gv_asn的primarykey和autoIncrement,以及表mycat_sequence。gv_asn的实际建表也必须是autoIncrement的。
<schema name="TESTERDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="gv_warehouse" type="global" dataNode="dn1,dn2,dn3"></table>
<table name="gv_sku" type="global" dataNode="dn1,dn2,dn3"></table>
<table name="gv_asn" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="sharding-by-murmur"></table>
<table name="mycat_sequence" primaryKey="name" dataNode="dn1"/>
</schema>
server.xml:1为数据库方式配置序列,0为文本方式
<property name="sequnceHandlerType">1</property>
sequence_db_conf.properties:注意要大写
GV_ASN=dn1
配置完成,重启mycat
数据库配置
首先在mydb1节点上执行以下sql脚本,分别是建立序列表,插入序列记录,创建相关的函数.
CREATE TABLE MYCAT_SEQUENCE (
`name` VARCHAR(50) NOT NULL,
current_value INT NOT NULL,
increment INT NOT NULL DEFAULT 1,
remark varchar(100), -- remark 并不是必须的,在这里我是为了让每一个表都对应一个全局的自增,在Remark中配置自增项对应的表名。方便后期维护
PRIMARY KEY(name)) ENGINE=InnoDB;
INSERT INTO mycat_sequence ( NAME, current_value, increment)
VALUES ('GV_ASN', 100, 1);
#创建相关 function
#获取当前 sequence 的值 (返回当前值,增量)
DROP FUNCTION IF EXISTS mycat_seq_currval;
DELIMITER ;;
CREATE DEFINER=`root`@`%` 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_setval;
DELIMITER ;;
CREATE DEFINER=`root`@`%` 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 ;
#获取下一个 sequence 值
DROP FUNCTION IF EXISTS `mycat_seq_nextval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` 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 ;
小测试
打开SQLyog,登录mycat,测试用的gv_asn在上一篇文章中已经建好了,执行
INSERT INTO gv_asn(id,wh_id,qty,createtime) VALUES(NEXT VALUE FOR MYCATSEQ_GV_ASN,3,3,NOW());
select * from gv_asn;
SELECT LAST_INSERT_ID()
如果最后LAST_INSERT_ID返回为0,检查一下asn建表的时候,auto_increase设置是不是漏掉了
如果有数据了,恭喜你就成功了。