DDL兼容性
Mycat暂时只支持新增/删除 库和表
自己改了配置不要用DDL
自定义分片算法,自己修改配置的分片表,,以及不能通过sql分库分表语法(带dbpartition by mod_hash(id) tbpartition by mod_hash(id) tbpartitions 2 dbpartitions 2;)生成的分片表,暂时不支持alter的.你可以在mycat里alter,这样就可以把alter语句下发到mysql之后,重新执行/! mycat:createTable{…}/恢复自定义的分片表配置
DDL功能只能在开发时候使用,生产上请咨询DBA,比如使用Percona团队的工具进行DDL,使用PT工具操作,archery集成pt
在Mycat2的设计目标里,DDL是不能包裹在有DML语句的事务内,在Mycat2里使用这个方式,容易死锁
建库
create database 会在prototype节点建立对应的物理库,所以客户端能马上执行show语句查询物理库的信息,但是在其他存储节点并不马上执行,直到物理表用到该物理库的时候才建立。
create database IF NOT EXISTS db1
CREATE DATABASE `db1` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ;
create table 在已经存在表的情况下,会覆盖已经存在的表的数据,并根据生成的存储节点信息向存储节点执行建表操作。
删库
drop database 会在prototype节点删除对应的物理库,但是对于全局表,分片表的存储节点不会进行操作
drop database IF EXISTS db1
全局表
CREATE TABLE db1.`customer` (
`id` bigint NOT NULL AUTO_INCREMENT,
`firstname` varchar(100) DEFAULT NULL,
`lastname` varchar(100) DEFAULT NULL,
`modified_date` date DEFAULT NULL,
`created_date` date DEFAULT NULL,
PRIMARY KEY (`id`)
) BROADCAST ENGINE = InnoDB CHARSET = utf8
BROADCAST是关键字
Mycat会查找配置的名字以c为首字符串的集群纳入该表的存储节点,并把sql添加if not existed关键字执行
单表,普通表,读写分离表
CREATE TABLE db1.`customer` (
`id` bigint NOT NULL AUTO_INCREMENT,
`firstname` varchar(100) DEFAULT NULL,
`lastname` varchar(100) DEFAULT NULL,
`modified_date` date DEFAULT NULL,
`created_date` date DEFAULT NULL
, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8
Mycat会在prototype中执行此sql,把添加prototype为单表的存储节点
分片表
CREATE TABLE db1.`customer` (
`id` bigint NOT NULL AUTO_INCREMENT,
`firstname` varchar(100) DEFAULT NULL,
`lastname` varchar(100) DEFAULT NULL,
`modified_date` date DEFAULT NULL,
`created_date` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE = InnoDB CHARSET = utf8
DBPARTITION BY hash(id) DBPARTITIONS 2
TBPARTITION BY hash(id) TBPARTITIONS 2
Mycat会在prototype中执行此sql,然后寻找当前名字首字母为c的集群纳入存储节点根据分片规则开始建库建表,需要注意的是prototype不会存储任何数据,仅仅在存储节点中进行存储.
建表语句支持PolarDB-X CREATE TABLE,但暂时不支持全局二级索引和影子库
https://help.aliyun.com/document_detail/71300.html
上述的配置仅仅描述,自动化DDL是如何生成配置的.如果涉及到自定义分片算法,自定义数据分布,请自己更改配置文件.自己在mysql执行alter
ALTER TABLE 语句(执行过后检查mycat日志是否有异常)
添加字段ALTER TABLE db1.
travelrecord2`\n
ADD COLUMN user_id varchar(30);`
修改字段ALTER TABLE db1.
travelrecord2`\n
MODIFY COLUMN user_id varchar(30);`
添加本地索引ALTER TABLE db1.
travelrecord2`\n
ADD INDEX user_id_idx (user_id);`
本地索引更名ALTER TABLE db1.
travelrecord2`\n
RENAME INDEX user_id_idx
TO iuser_id_idx_new
;`
删除本地索引ALTER TABLE db1.
travelrecord2`\n
DROP INDEX iuser_id_idx_new
;`
删除字段ALTER TABLE db1.
travelrecord2`\n
DROP COLUMN user_id;`
本地索引语句
创建本地索引CREATE INDEX testIdx ON db1.
travelrecord2(id);
删除索引DROP INDEX testIdx ON db1.
travelrecord2``
DROP TABLE语句
删除逻辑表drop TABLE db1.
travelrecord2`
仅仅删除原型库的物理表,不会删除存储节点的物理表
RENAME TABLE语句
RENAME TABLE travelrecord2 to travelrecord3
仅仅更改原型库的物理表与配置中的表名,不会更改存储节点的表名.
在单表的情况下,会更新存储节点的表名,使单表使用方式一致(如果不是这样,则会使用旧的表名,导致路由错误)
TRUNCATE语句
TRUNCATE TABLE db1.
travelrecord2``
CHECK TABLE语句
CHECK TABLE db1.travelrecord2;
扫描逻辑表中对应的所有存储节点的表字段信息是否相同,如果不相同则会显示错误的节点信息,需要人工修正