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语句查询物理库的信息,但是在其他存储节点并不马上执行,直到物理表用到该物理库的时候才建立。

  1. create database IF NOT EXISTS db1
  2. CREATE DATABASE `db1` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ;

create table 在已经存在表的情况下,会覆盖已经存在的表的数据,并根据生成的存储节点信息向存储节点执行建表操作。

删库

drop database 会在prototype节点删除对应的物理库,但是对于全局表,分片表的存储节点不会进行操作

  1. drop database IF EXISTS db1

全局表

  1. CREATE TABLE db1.`customer` (
  2. `id` bigint NOT NULL AUTO_INCREMENT,
  3. `firstname` varchar(100) DEFAULT NULL,
  4. `lastname` varchar(100) DEFAULT NULL,
  5. `modified_date` date DEFAULT NULL,
  6. `created_date` date DEFAULT NULL,
  7. PRIMARY KEY (`id`)
  8. ) BROADCAST ENGINE = InnoDB CHARSET = utf8
  9. BROADCAST是关键字

Mycat会查找配置的名字以c为首字符串的集群纳入该表的存储节点,并把sql添加if not existed关键字执行

单表,普通表,读写分离表

  1. CREATE TABLE db1.`customer` (
  2. `id` bigint NOT NULL AUTO_INCREMENT,
  3. `firstname` varchar(100) DEFAULT NULL,
  4. `lastname` varchar(100) DEFAULT NULL,
  5. `modified_date` date DEFAULT NULL,
  6. `created_date` date DEFAULT NULL
  7. , PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8

Mycat会在prototype中执行此sql,把添加prototype为单表的存储节点

分片表

  1. CREATE TABLE db1.`customer` (
  2. `id` bigint NOT NULL AUTO_INCREMENT,
  3. `firstname` varchar(100) DEFAULT NULL,
  4. `lastname` varchar(100) DEFAULT NULL,
  5. `modified_date` date DEFAULT NULL,
  6. `created_date` date DEFAULT NULL,
  7. PRIMARY KEY (`id`)
  8. ) ENGINE = InnoDB CHARSET = utf8
  9. DBPARTITION BY hash(id) DBPARTITIONS 2
  10. 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;
扫描逻辑表中对应的所有存储节点的表字段信息是否相同,如果不相同则会显示错误的节点信息,需要人工修正