作者:刘安
爱可生测试团队成员,主要负责 DTLE 开源项目相关测试任务,擅长 Python 自动化测试开发。
前言:过年前 DTLE 发布了 4.22.01.0 版本,该版本最重要的特性是支持 Oracle-MySQL 增量数据同步。今天我就来给大家介绍一下这个功能。
一、现状
1. 目前只支持增量同步
a. 可以根据 SCN 节点开启增量复制
b. 从任务启动时间开启增量复制
2. 类型映射
a. 已支持类型
Oracle | MySQL | 限制 |
BINARY_DOUBLE | float | mysql 不支持Inf/-Inf/Nan数据,用NULL来存储 |
CHAR(n), CHARACTER(n) | CHAR(n), CHARACTER(n) | |
DATE | datetime | |
DECIMAL(p,s), DEC(p,s) | DECIMAL(p,s), DEC(p,s) | |
DOUBLE PRECISION | DOUBLE PRECISION | |
FLOAT§ | DOUBLE | |
INTEGER, INT | INT | 极值问题 (https://github.com/actiontech/dtle/issues/825) |
INTERVAL DAY§ TO SECOND(s) | VARCHAR(30) | |
INTERVAL YEAR§ TO MONTH | VARCHAR(30) | |
NCHAR VARYING(n) | NCHAR VARYING(n) | |
NCHAR(n) | NCHAR(n)/NVARCHAR(n) | |
NUMBER(p,0), NUMBER§ | TINYINT/SMALLINT/INT/BIGINT/DECIMAL§ | |
NUMBER(p,s) | DECIMAL(p,s) | |
NUMBER, NUMBER(*) | DOUBLE | |
NUMERIC(p,s) | NUMERIC(p,s) | |
NVARCHAR2(n) | NVARCHAR(n) | |
RAW(n) | VARBINARY(n) | |
REAL | DOUBLE | |
ROWID | CHAR(100) | |
SMALLINT | DECIMAL(38) | |
TIMESTAMP§ | datetime | |
VARCHAR2(n) | VARCHAR(n) | |
VARCHAR(n) | VARCHAR(n) |
b. 待支持类型
Oracle | MySQL | 当前不支持原因 |
BINARY_FLOAT | float | MySQL不支持Inf/-Inf/Nan数据, MySQL float类型无法精确匹配,导致更新失败 |
BLOB | BLOB | 当前实现逻辑,无法从redoSQL获取足够的值 |
CLOB | CLOB | 当前实现逻辑,无法从redoSQL获取足够的值 |
LONG | LONGTEXT | 只支持insert |
LONG RAW | LONGBLOB | 只支持insert |
NCLOB | TEXT | 无法从redoSQL获取足够的值 |
TIMESTAMP§ WITH TIME ZONE | datetime | 时区问题未处理 |
c. 不支持类型
Oracle | MySQL | 不支持原因 |
BFILE | VARCHAR(255) | logminer不支持 |
UROWID(n) | VARCHAR(n) | logminer读取的数据不足以构造新SQL |
XMLTYPE | VARCHAR(30) | logminer不支持 |
3. DML支持度
a. DML类型
DML类型 | Oracle SQL | MySQL SQL |
INSERT | INSERT INTO ACTION_DB.CHAR_255_COLUMNS VALUES (0, NULL) | replace into |
UPDATE | UPDATE ACTION_DB.CHAR_255_COLUMNS SET COL2=‘abcdefghijklmnopqrstuvwxyz’ WHERE COL1=0 | update |
DELETE | DELETE FROM ACTION_DB.CHARACTER_255_COLUMNS WHERE COL1=0 | delete from |
b. DML函数支持度
函数名 | 是否支持 | 其他 |
CURRENT_TIMESTAMP | 是 | |
DATE | 是 | |
EMPTY_BLOB | 是 | 函数支持解析为NULL |
EMPTY_CLOB | 是 | 函数支持解析为NULL |
HEXTORAW | 是 | |
LOCALTIMESTAMP | 是 | |
RAWTOHEX | 是 | |
RAWTOHEX(CHR()) | 是 | |
SYSTIMESTAMP | 是 | |
TO_DATE | 是 | |
TO_DSINTERVAL | 是 | |
TO_TIMESTAMP | 是 | |
TO_YMINTERVAL | 是 | |
UNISTR | 是 |
4. DDL支持度
DDL | Target | Option |
CREATE | 表 TABLE | DEFAULT CREATE |
ALTER | 表 TABLE | 增加字段 |
删除字段 | ||
重命名字段 (当前仅支持MySQL 8.0语法) | ||
变更字段类型 | ||
DROP | 表 TABLE | DEFAULT DROP |
二、环境准备
1. Oracle数据库开启归档日志
2. 安装 LogMiner 工具(Oracle 安装时默认安装)
可查看系统中是否存在运行 LogMiner 所需要的 dbms_logmnr 、dbms_logmnr_d 包,如果没有安装 LogMiner 工具需要的包,需要运行下面两个命令:
3. 创建 logminer 需要角色权限
4. 部署一个单节点的 4.22.01.0版本 DTLE
https://github.com/actiontech/dtle/releases/download/v4.22.01.0/dtle-ce-4.22.01.0.x86_64.rpm
三、创建 Oracle-MySQL 任务
1. 获取 Token
2. 准备 job 文件
3. 创建 Oracle-MySQL job
4. 源端 Oracle 写入数据
5. 目标端 MySQL 检查同步情况
四、使用限制
因为 Oracle 和 MySQL 是异构数据库,所以在源端 Oracle 能执行的 Oracle SQL 语句通过 DTLE 转换到目标端的 MySQL SQL 语句后有可能无法正确执行。比如 Oracle 支持数值范围 MySQL 不支持,Oracle 的 DATE 类型支持公元前的年份而 MySQL 的 datetime 只能为公元后的年份等等。遇到这些情况,DTLE 的默认行为是报错并且停止同步。
如果需要跳过这种阻塞情况,可以修改 DTLE 的环境变量然后重新启动 DTLE 服务。
如果在使用 DTLE 时发现了任何问题,请及时联系我们。
DTLE repo: https://github.com/actiontech/dtle
DTLE docs: https://actiontech.github.io/dtle-docs-cn/