跳至主要內容

DDL2KUNLUN

Klustron大约 3 分钟

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, yearinteger
bigintbigint
floatdouble prescision
enumenum
setvarchar
blob/longbytea
texttext
varcharvarchar兼容原精度
datetime/timestamp/timetimestamp without time zone兼容原精度
datedate
bit/json/decimalbit/json/decimal兼容原精度
binaryvarbinary
  • 时间类型在经过映射后,不在包含时区信息。原因是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`
);


END