阅读(4656) (14)

Mycat2 Sql兼容性 DDL

2021-09-08 11:40:19 更新

DDL兼容性

Mycat暂时只支持新增/删除 库和表

建库

create database 会在prototype节点建立对应的物理库,所以客户端能马上执行show语句查询物理库的信息,但是在其他存储节点并不马上执行,直到物理表用到该物理库的时候才建立。

create database IF NOT EXISTS db1

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,但暂时不支持全局二级索引和影子库. 上述的配置仅仅描述,自动化DDL是如何生成配置的.如果涉及到自定义分片算法,自定义数据分布,请自己更改配置文件.

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;`

扫描逻辑表中对应的所有存储节点的表字段信息是否相同,如果不相同则会显示错误的节点信息,需要人工修正