mycat生成全局id
Mycat:数据库中间件(分库分表)
官网指南
mycat运行需要JVM,所以先安装java环境,建议JDK1.8以上。数据库采用mysql5.7,或者8.0
下载
下载地址:https://github.com/MyCATApache/Mycat-download/tree/master/1.6-RELEASE
环境配置
linux: https://www.cnblogs.com/alexzhang92/p/10990904.html
windows:
https://www.cnblogs.com/zuidongfeng/p/7793098.html
Mycat 读写分离、主从切换、分库分表等操作
推荐博客园散尽浮华技术博文
https://www.cnblogs.com/kevingrace/p/9365840.html
好了,回到正题
- 创建原始数据库表
#创建数据库
create database Mycat_sql01;
#添加表
use Mycat_sql01
#创建表test
create table test(id int auto_increment primary key,name varchar(32)) ;
#创建数据库
create database Mycat_sql02;
#添加表
use Mycat_sql02
#创建表test
create table test(id int auto_increment primary key,name varchar(32)) ;
- 创建Mycat生成唯一主键的表(MYCAT_SEQUENCE)及函数
后边会为Mycat_sql01、Mycat_sql02两库创建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 ;
2.1 将数据库中要自增的表名称(test)添加到MYCAT_SEQUENC表(表名大写)
#设定TEST3表的增长方式为 步进为1 ,
insert into MYCAT_SEQUENCE (name,current_value,increment) values (‘TEST’,0,1);
3. 配置maycat
3.1 配置schemal.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="Mycat_test" checkSQLschema="true" sqlMaxLimit="1000">
<table name="test" dataNode="node1,node2" primaryKey="id" autoIncrement="true" type="global"/>
</schema>
<dataNode name="node1" dataHost="localhost" database="Mycat_sql01" />
<dataNode name="node2" dataHost="localhost" database="Mycat_sql02" />
<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>
checkSQLschema=“true”:自增
primaryKey=“id”:主键
type=“global”:全局的表
3.2 配置server.xml
<property name="sequnceHandlerType">1</property>
0 表示是表示使用本地文件方式
1 表示的是根据数据库来生成,就是我们自己配置的自增长
2 表示时间戳的方式 ID= 64 位二进制 (42(毫秒)+5(机器 ID)+5(业务编码)+12(重复累加)
3.3 配置sequence_db_conf.properties
TEST3=node1
注意表名大写
node1即为MYCAT_SEQUENCE表及函数所在的节点
3.4 重启Mycat
4.测试
#插入数据
insert into test (name) value ('xiaowang');
#插入多条数据
insert into test (name) values ('zhanghu'),('mayun'),('huangyu'),('zhangxun');