数据库集群环境
服务 |
端口 |
服务器 |
容器名字 |
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 ;
我机器上截图:
向表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,否则报错,第一个
rule.xml(最后给出完整的配置)
修改的主要配置如下 :
注意:
可能会有报错
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所在 的节点
到这里配置就已经完成了,启动测试
如果表中已经有数据了,需要指定id的开始的值,修改MYCAT_SEQUENCE对应name表的current_value的值即可
----------------------------------------------------------------------------------------------------------------
我的完整的配置
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