Skip to content

support sync DDL from Oracle to MySQL #811

Closed
@sjjian

Description

@sjjian

方案(实现)

  • MySQL - MySQL DDL的同步为,源端将binglog中获取的DDL SQL传输到 目标端,目标端直接执行DDL.
  • Oracle - MySQL 同步过程与MySQL-MySQL使用了相同的中间态结构传输. 考虑将Oracle获取的DDL 转为MySQL格式的DDL.
  1. dtle借助工具logminer , 从oracle 获取DDL SQL.
  2. 使用三方库OracleParse库解析oracle的DDL,解析出Oracle的语法结构
  3. 根据解析出来的 SQL 类型和字段类型(类型转换) 通过字符匹配拼接方式构造为MySQL格式的DDL同步到目标端
  4. 目标端执行同步过来的SQL

DDL 支持度

SQL类型 Option Oracle SQL 转化后MySQL SQL 语法支持 不支持字段类型
CREATE TABLE 不带约束 CREATE TABLE test."persons"("first_name" VARCHAR(15) NOT NULL,last_name VARCHAR2(45) NOT NULL); CREATE TABLE TEST.persons (first_name VARCHAR(15),LAST_NAME VARCHAR(45)) 支持
CREATE TABLE 带约束 暂未支持
ALTER TABLE AddColumnClase ALTER TABLE test."persons" ADD alter_name1 VARCHAR2 ( 30 )) ADD ( alter_name2 VARCHAR2 ( 30 )); ALTER TABLE TEST.persons ADD COLUMN(ALTER_NAME1 VARCHAR(30)),ADD COLUMN(ALTER_NAME2 VARCHAR(30)) 支持
ALTER TABLE ModifyColumnClause ALTER TABLE test."persons" MODIFY ( alter_new_name1 CHAR ( 13 )) MODIFY ( alter_name2 VARCHAR ( 66 )) ALTER TABLE TEST.persons MODIFY COLUMN(ALTER_NEW_NAME1 CHAR(13)),MODIFY COLUMN(ALTER_NAME2 VARCHAR(66)) 支持
ALTER TABLE DropColumnClause ALTER TABLE "TEST"."persons" DROP ("DROP_NAME1",drop_name2) ALTER TABLE TEST.persons DROP COLUMN(DROP_NAME1,DROP_NAME2) 支持
ALTER TABLE RenameColumnClase ALTER TABLE "TEST"."persons" RENAME COLUMN "RE_NAME" TO "RE_NAME_NEW ALTER TABLE TEST.persons CHANGE COLUMN RE_NAME RE_NAME_NEW 当前仅支持8.0语法
DROP TABLE DROP TABLE test."persons DROP TABLE TEST.persons

类型转换

  • 类型转换参考链接
  • 文档变更点
    1.NClob 变更为text
    2.timestamp 在MySQL 最大长度为6
    3.MySQL中number字段最大scale为30
    4.INTEGET和INT应该对应MySQL中的decimal(38)或者INT都会出现长度不足的问题(40个9为可存储的最大值)
    5.ROW ID 字段对应长度10导致写入失败,修改为100

oracle number 类型 scale 小于0不支持

参考文档

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions