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 db1CREATE 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 = utf8BROADCAST是关键字
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 = utf8DBPARTITION BY hash(id) DBPARTITIONS 2TBPARTITION 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;
扫描逻辑表中对应的所有存储节点的表字段信息是否相同,如果不相同则会显示错误的节点信息,需要人工修正
