DDL2KUNLUN
DDL2KUNLUN
在将业务数据迁移到 Klustron(原KunlunBase) 的场景中,如果源数据库不是 Postgresql ,则 DDL 的迁移会因为语法不兼容而失败。为了解决这样的问题,Klustron 团队开发了 ddl2kunlun 语法转换工具。该工具的主要功能就是将MySQL 语法的 DDL 语句转换成 Postgresql 语法的 DDL 语句。下面对工具的基本原理和使用进行介绍。
从Klustron-1.2版本开始,用户不再需要调用DDL2Kunlun做DDL语法转换,因为Klustron 已经支持了MySQL 常用DDL语法。
1 工作原理
ddl2kunlun 工作的主要流程可以分为两个部分,解析和重写。其中解析部分是将 DDL语句转换成语法树结构。重写部分是对上一阶段产生的语法书进行解析,并按照 PostgreSQL 的语法对 DDL 进行重写,从而生成一个 Klustron 可以执行的 DDL 语句。转换后的 DDL 与源 DDL 在语义上完全等价。
1.1 DDL 解析
ddl2kunlun 可以通过两种不同的模式,将 DDL 转换成一棵语法树。 第一种是通过链接源库,并在源库中查询中获取表相关的元信息的方式来构建语法树。其中包括列信息(列名,数据类型,数据精度),索引信息,表约束信息等。 第二种是直接通过文本语法解析的方式,将 DDL 转换成一颗语法树。在转换成语法树之后,改语法树会作为下一阶段重写的输入。
1.2 DDL 重写
重写部分的主要工作就是抽取语树种的信息,然后根据 Klustron 兼容的方式重写 DDL 并输出。
1.2.1 类型映射
其中关于类型映射,按照下述规则来进行:
MySQL源类型 | Klustron目标类型 | 精度映射 |
---|---|---|
tinyint, smallint, int, year | integer | |
bigint | bigint | |
float | double prescision | |
enum | enum | |
set | varchar | |
blob/long | bytea | |
text | text | |
varchar | varchar | 兼容原精度 |
datetime/timestamp/time | timestamp without time zone | 兼容原精度 |
date | date | |
bit/json/decimal | bit/json/decimal | 兼容原精度 |
binary | varbinary |
- 时间类型在经过映射后,不在包含时区信息。原因是MySQL导出的静态数据不包含时区信息,而下游Klustron在写入带时区信息的时间类型数据时,需要显式的指定时区信息,因此从兼容性的角度考虑,类型转换过程会去掉时区信息
1.2.2 自增键、索引及其他约束映射
自增键映射为 Klustron 序列,并转换为 alter table 语句在目标表上执行。唯一索引映射为 Klustron 的列唯一约束,二级索引映射为普通索引。主键约束和唯一键约束,转换为 alter table 语句在目标表上执行。
2 使用示例
Usage of ./bin/ddl2kunlun-darwin:
-database string
Database Or Schema Name
-dumpView
Dump all view define only, this will discard the 'database' and 'table' value if specified
-host string
Host IP address (default "127.0.0.1")
-password string
Password
-port string
Host Port Number (default "3306")
-sourceType string
Data Source Instance type (default "mysql")
-table string
Table Name
-user string
User Name
ddl2kunlun 也可以从标准输入中获取 SQL。
$ echo "
create table \`p_&&_a\`.\`t1\`(a tinyint unsigned auto_increment,
b smallint(3), c mediumint unsigned, d integer(15),
e bigint unsigned,
primary key (a),
unique index uk1(c),
index ik2(b))
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_as_cs;
" | ./bin/ddl2kunlun-darwin
CREATE TABLE `p_&&_a`.`t1` (
`a` int ,
`b` int ,
`c` bigint ,
`d` bigint ,
`e` bigint ,
constraint t1_pkey primary key ( a )
);
alter table p_&&_a.t1 alter column a add auto_increment;
alter table `t1` add constraint `uk1` unique (
`c`
);
create index `ik2` on `t1` (
`b`
);