本次使用shardingProxy版本为5.5.1,mysql为5.7
一般情况我们都是使用配置文件配置shardingProxy的分库分表规则,其实shardingProxy支持动态分配创建分表规则的,下面记录下操作步骤
1、使用CREATE SHARDING TABLE RULE创建分表规则,
具体的语法定义可以参考官网
1.1创建自动时间规则的分表规则
CREATE SHARDING TABLE RULE t_month_table(
STORAGE_UNITS(ds_0),
SHARDING_COLUMN=data_year_month,
TYPE(NAME="AUTO_INTERVAL",PROPERTIES(
"SHARDING_COLUMN"="data_year_month",
## "datetime-pattern"="yyyyMM",
"datetime-lower"="2025-01-01 00:00:00",
## "datetime-upper"="2025-07-01 00:00:00",
## "sharding-suffix-pattern"="yyyyMM",
## "datetime-interval-amount"="1",
## "datetime-interval-unit"="MONTHS",
"sharding-seconds" = 2592000
)),
KEY_GENERATE_STRATEGY(COLUMN=id,TYPE(NAME="snowflake"))
);
用workbench连接shardingProxy 后,执行上面语句,执行成功后,可以使用下面查询语句查询是否创建成功。
SHOW SHARDING TABLE RULES from db_time; ##db_time 为使用的数据库,也可以不加from db_time
SHOW SHARDING ALGORITHMS from db_time;
1.2创建表
CREATE TABLE `t_month_table` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`order_no` varchar(30) DEFAULT NULL,
`user_id` bigint(20) DEFAULT NULL,
`amount` decimal(10,2) DEFAULT NULL,
`data_year_month` varchar(125) DEFAULT NULL,
`age` int(3) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=779468255126355969 DEFAULT CHARSET=utf8mb4;
创建表成功后,查询真实数据库,表的创建请客如下,说明创建成功。
1.3创建固定时间的分表
CREATE SHARDING TABLE RULE t_month_table2(
DATANODES("ds_${0}.t_month_table2${202501..202506}"),
TABLE_STRATEGY(TYPE="standard",SHARDING_COLUMN=data_year_month,
SHARDING_ALGORITHM(TYPE(NAME="INTERVAL",
PROPERTIES(
"datetime-pattern"="yyyyMM",
"datetime-lower"="202501",
"datetime-upper"="202506",
"sharding-suffix-pattern"="yyyyMM",
"datetime-interval-amount"="1",
"datetime-interval-unit"="MONTHS"
)))),
KEY_GENERATE_STRATEGY(COLUMN=id,TYPE(NAME="snowflake"))
);
创建表
CREATE TABLE `t_month_table2` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`order_no` varchar(30) DEFAULT NULL,
`user_id` bigint(20) DEFAULT NULL,
`amount` decimal(10,2) DEFAULT NULL,
`data_year_month` varchar(125) DEFAULT NULL,
`age` int(3) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=779468255126355969 DEFAULT CHARSET=utf8mb4;
最后生成的表结果如下:
表是以年月后缀结尾的,更容易区分数据存放到哪张具体的表。
自动和固定时间的有个区别是:自动的如果超过定义的数据区域会把数据保存到最后一张表里面,而固定时间区域的则会直接报错,无法保存数据。