Closed
Description
方案(实现)
- MySQL - MySQL DDL的同步为,源端将binglog中获取的DDL SQL传输到 目标端,目标端直接执行DDL.
- Oracle - MySQL 同步过程与MySQL-MySQL使用了相同的中间态结构传输. 考虑将Oracle获取的DDL 转为MySQL格式的DDL.
- dtle借助工具logminer , 从oracle 获取DDL SQL.
- 使用三方库OracleParse库解析oracle的DDL,解析出Oracle的语法结构
- 根据解析出来的 SQL 类型和字段类型(类型转换) 通过字符匹配拼接方式构造为MySQL格式的DDL同步到目标端
- 目标端执行同步过来的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不支持