mysql自增 mycat_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 ;

我机器上截图:

4288a1e5d68a659894090e067bc2c801.png

向表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,自动增长

f6722ade71d266c76e11339ec6978839.png

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

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

fef553a23eaf3364f7b0556256bf9c2a.png

注意:

可能会有报错

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所在 的节点

d7b706c3b7118b3ddd08e4777ebfee55.png

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

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

f7ee898b253c38c99dadf8daf34ac44d.png

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

我的完整的配置

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值