Mycat2 序列号 sequence
序列号配置
使用序列号的分片表,对应的自增主键要在建表SQL中体现
例如
`id` bigint NOT NULL AUTO_INCREMENT
2021-8-17后支持autoIncrement
属性强制关闭全局序列号
"xxx":{
"createTableSQL":"xxx",
"autoIncrement": false,
"function":{
"clazz":"io.mycat.router.mycat1xfunction.PartitionByMod",
"name":"PartitionByMod",
"properties":{
"defaultNode":"0",
"type":"Integer",
"count":4,
"columnName":"id"
},
"ranges":{}
},
"partition":{
"schemaNames":"xxxx",
"tableNames":"xxxx_$0-3",
"targetNames":"prototype"
}
},
如果不需要使用mycat的自增序列,而使用mysql本身的自增主键的功能,需要在配置中更改对应的建表sql,不设置AUTO_INCREMENT
关键字,这样,mycat就不认为这个表有自增主键的功能,就不会使用mycat的全局序列号.
这样,对应的插入sql在mysql处理,由mysql的自增主键功能补全自增值.
建表sql可以自动在原型库对应的逻辑表的物理表获取,如果逻辑表的建表SQL与物理表的建表SQL不对应,则需要在配置文件中配置建表SQL.
{数据库名字}_{表名字}.sequence.json放置在sequecnes
文件夹下面
{
"clazz":"io.mycat.plug.sequence.SequenceMySQLGenerator",
"name":"db1_travelrecord"
}
如果不配置,分片表使用雪花算法生成全局序列号
io.mycat.plug.sequence.SequenceMySQLGenerator
{
"clazz":"io.mycat.plug.sequence.SequenceMySQLGenerator",
"name":"db1_travelrecord"
}
在prototype
服务器的db1
库导入dbseq.sql
文件
在mycat_sequence
表建立db1_travelrecord
行,即可,Mycat会从更新此行获得序列号
注意库名对应这里db1_travelrecord
中的db1
就是dbseq.sql
导入的库(物理库,一般是原型库,不能在mycat里执行)
可选参数targetName
更改序列号服务器
{
"clazz":"io.mycat.plug.sequence.SequenceMySQLGenerator",
"name":"db1_travelrecord",
"targetName": "prototype",
"schemaName":"db1"//指定物理库名
}
"targetName"
:"prototype"
是执行自增序列的节点,也是dbseq.sql
导入的节点
dbseq.sql
导入的当前库的库名与逻辑表的逻辑库名一致
导入后检查库下有没有mycat_sequence
表
其中increment
是序列号自增的步伐,为1
的时候严格按1
递增,当1000
的时候,mycat会每次批量递增1000
取序列号.此时在多个mycat访问此序列号表的情况下,不能严格自增
NAME
列中的值是对应的 库名_表名 该值需要用户设置
通过注解设置为雪花算法
/*+ mycat:setSequence{"name":"db1_travelrecord","time":true} */;
通过注解设置为数据库方式全局序列号
/*+ mycat:setSequence
{"name":"db1_travelrecord","clazz":"io.mycat.plug.sequence.SequenceMySQLGenerator"} */;
参数与上述的数据库方式相同