mycat设置主键自增—sequence的配置
1. 配置server.xml文件
(#0 代表文件方式,#1 代表数据库方式,#2 代表本地时间戳方式)
<property name="sequnceHandlerType">1</property>
2. 数据库配置
Sequence 获取步骤:
- 当初次使用该 sequence 时,根据传入的 sequence 名称,从数据库这张表中读取 current_value和 increment 到 MyCat 中,并将数据库中的 current_value 设置为原 current_value 值+increment 值。
- MyCat 将读取到 current_value+increment 作为本次要使用的 sequence 值,下次使用时,自动加 1,当使用 increment 次后,执行步骤 1)相同的操作。
- MyCat 负责维护这张表,用到哪些 sequence,只需要在这张表中插入一条记录即可。若某次读取的sequence 没有用完,系统就停掉了,则这次读取的 sequence 剩余值不会再使用。
#所有操作都在一个物理数据库(dn1)上
#创建 MYCAT_SEQUENCE 表
#name sequence 名称
#current_value 当前 value
#increment 增长步长! 可理解为 mycat 在数据库中一次读取多少个 sequence. 当这些用完后, 下次再从数
#据库中读取。
DROP TABLE IF EXISTS MYCAT_SEQUENCE;
CREATE TABLE MYCAT_SEQUENCE (
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名称',
`current_value` int(11) NOT NULL COMMENT '当前值',
`increment` int(11) NOT NULL DEFAULT 1 COMMENT '增长步长',
PRIMARY KEY (`name`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
#创建相关 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 ;
3. 修改mycat 相关配置
sequence_db_conf.properties
#sequence stored in datanode
GLOBAL=dn1
COMPANY=dn1
CUSTOMER=dn1
ORDERS=dn1
SYS_USER=dn1
配置schema.xml
<schema name="DB1" checkSQLschema="false" sqlMaxLimit="100">
<table name="sys_user" primaryKey="user_id" autoIncrement="true" dataNode="dn$1-2" rule="rule1"/>
</schema>
<dataNode name="dn$1-2" dataHost="localhost1" database="db$1-2" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="xxxx:8066" user="mycat" password="xxxxxx">
</writeHost>
</dataHost>
4.修改mysql的配置文件my.cnf
//-- [mysqld]下添加如下配置
//-- 如果不添加如下配置并发下会取重复...
log_bin_trust_function_creators=1
5. 重启mycat
./mycat restart
6.使用方法
- 不给id手动赋值
INSERT INTO sys_user(name) VALUES("姓名")
- 手动赋值主键
INSERT into sys_user(user_id,name) VALUES(next value for MYCATSEQ_SYS_USER,"姓名");
- 获取下一个主键id的方法(一般用于自己设置主键id)
存在问题: 1. mycat服务启动或者重启时,第一次使用,获取的值为当前值+步长
(current_value+increment)
2. 每使用一次,相当于插入一个id,MYCAT_SEQUENCE表对应会加一
# 注意:MYCATSEQ_ 拼接的字段为MYCAT_SEQUENCE中存储的name字段
SELECT 'next value for MYCATSEQ_SYS_USER'
- 获取数据存储节点,根据id查询,加一个EXPLAIN(必须大写),会返回存储节点。
EXPLAIN SELECT * from sys_user WHERE user_id = '100'