MySql数据库集群通过MyCat实现表数据id的自动增长

数据库集群环境

服务

端口

服务器

容器名字

MySql-pxc01

13306

192.168.142.130

Node1(主)分片

MySql-pxc02

13306

192.168.142.132

Node2(从)

MySql-pxc03

13306

192.168.142.133

Node1(主)分片

MySql-pxc04

13306

192.168.142.134

Node2(从)

MySql01

3306

192.168.142.130

Mster01(主)

MySql02

3306

192.168.142.133

Slave01(从)

Mycat01

8066,9066,

192.168.142.132

mycat

Mycat02

8066,9066,

192.168.142.134

mycat

HaProxy

4001,4002

192.168.142.130

haproxy

通过haproxy转发至mycat,由mycat向数据库pxc集群中插入数据时报错;错误信息如下:

java.lang.RuntimeException: org.springframework.jdbc.BadSqlGrammarException: 
### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: bad insert sql (sharding column:ID not provided,INSERT INTO tb_house_resources (

意思是插入的数据sql语句不对,没有提供数据的id字段

 

 

在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一。为此,MyCat 提供了全局sequence,并且提供了包含本地配置和数据库配置等多种实现方式。

 

解决如下:

1、在实际连接的数据库中创建MYCAT_SEQUENCE表以及三个function,分别是mycat_seq_currval、mycat_seq_nextval、mycat_seq_setval

创建语句如下

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 ;


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 ;

我机器上截图:

MySql数据库集群通过MyCat实现表数据id的自动增长_第1张图片

向表MYCAT_SEQUENCE中插入数据

insert into MYCAT_SEQUENCE (name,current_value,increment) values ('TB_HOUSE_RESOURCES',0,1);

意思是:name为需要自动增长表的表名;current_value当前的值为0,则下次插入的数据的id为1,步长为1即每次增加1

 

schema.xml(最后给出完整的配置)

中主要的配置如下,chechSQLschema必须为true,否则报错,第一个

中name为指定需要自动增长id的表名,dataNode为指定数据库的节点,我这里有分片所以是两个,primaryKey="ID" autoIncrement="true" 为主键为id,自动增长

MySql数据库集群通过MyCat实现表数据id的自动增长_第2张图片

 

rule.xml(最后给出完整的配置)

修改的主要配置如下 :中的rule01与schema.xml中使用的rule相对应,其它的说明如图

MySql数据库集群通过MyCat实现表数据id的自动增长_第3张图片

注意:

可能会有报错

Caused by: org.xml.sax.SAXParseException; lineNumber: 150; columnNumber: 14; The content of element type "mycat:rule" must match "(tableRule*,function*)".

MyCat的rule.xml配置文件里不支持tableRule/function/tableRule/function交叉的方式配置。只能是tableRule/function顺序配置,即在整个rule.xml的配置文件中,所有的都是在的前面

server.xml(最后给出完整的配置)

需要添加:

1

#sequncehandlerType设为1;
#0 表示是表示使用本地文件方式
#1 表示的是根据数据库来生成,就是我们自己配置的自增长
#2 表示时间戳的方式

 

sequence_db_conf.properties

配置如下,TB_HOUSE_RESOURCES为操作的表名,dn1为MYCAT_SEQUENCE所在 的节点

MySql数据库集群通过MyCat实现表数据id的自动增长_第4张图片

 

到这里配置就已经完成了,启动测试

 

如果表中已经有数据了,需要指定id的开始的值,修改MYCAT_SEQUENCE对应name表的current_value的值即可

MySql数据库集群通过MyCat实现表数据id的自动增长_第5张图片

 

----------------------------------------------------------------------------------------------------------------

我的完整的配置

schema.xml




	
	
		
		
select user() select user() select user() select user()

rule.xml





	
		
			id
			func1
		
	

	
		
			user_id
			func1
		
	

	
		
			sharding_id
			hash-int
		
	
	
		
			id
			rang-long
		
	
	
		
			id
			mod-long
		
	
	
		
			id
			murmur
		
	
	
		
			id
			crc32slot
		
	
	
		
			create_time
			partbymonth
		
	
	
		
			calldate
			latestMonth
		
	
	
	
		
			id
			rang-mod
		
	
	
	
		
			id
			jump-consistent-hash
		
	
	
	
		
			id
			mod-long
		
	
	

	
		0
		2
		160
		
		
	

	
	
	
		partition-hash-int.txt
	
	
		autopartition-long.txt
	


	
	
		
		2
	



	
		8
		128
	
	
		24
	
	
		yyyy-MM-dd
		2015-01-01
	
	
	
        	partition-range-mod.txt
	
	
	
		3
	

server.xml




	
		0
		1
		0
		0
		1
		false
		0
		0
		1
		64k
		1k
		0
		384m
		false
		
		
		

	
	
	
	
		itcast123
		
		
		haoke,mytest
	

 

你可能感兴趣的:(数据库)