CDC场景
全量复制
- 任务启动时间点开始,将指定库表结构数据传输到目标端
全量流程
- 获取当前所需同步的库/表,从服务器上的redo日志获取当前系统改变号(SCN)的位置
- 获取同步表的ROW SHARE LOCK,以防止在创建快照期间表结构发生变化
- 获取同步的库/表的结构信息,同步到目标端
- 释放ROW SHARE LOCK
- 依据步骤3读取的SCN位置,全表扫描所有相关数据库表和schema
例: SELECT * FROM SCHEMA.TABLE AS OF SCN 123 where ROWNUM <= 2000 minus SELECT * FROM SCHEMA.TABLE AS OF SCN 123 where ROWNUM < 1
- 传输完所有的表数据,继续增量同步
限制
全量同步过程,表结构同步完成前,不支持对同步的表做DDL操作
增量复制
- 根据SCN节点开启增量复制
- 从任务启动时间开启增量复制
DML支持
DML类型
DML类型 | option | Oracle SQL | MySQL SQL | 其他 |
---|---|---|---|---|
INSERT | INSERT INTO TEST.CHARACTER_256_COLUMNS VALUES (4, NULL); | replace into `TEST`.`CHAR_256_COLUMNS`(`COL1`, `COL2`)values(?, ?) |
args=[0, |
|
UPDATE | UPDATE TEST.CHAR_20000_COLUMNS SET COL2='a a b ' WHERE COL1=2; | update `TEST`.`CHAR_256_COLUMNS` set`COL1`=?, `COL2`=?where((`COL1` = ?) and (`COL2` = ?)) limit 1 |
args=[3, "a a", 3, "a a"] | |
DELETE | DELETE FROM TEST.CHAR_256_COLUMNS WHERE COL1 = 5; | delete from `TEST`.`CHAR_256_COLUMNS` where((`COL1` = ?) and (`COL2` = ?)) limit 1 |
args=[5, "ABCDEFGHIJKLMNOPQRSTUVWXYZ "] |
函数支持
函数名 | 是否支持 | 其他 |
---|---|---|
EMPTY_BLOB | 是 | 函数支持解析为NULL |
EMPTY_CLOB | 是 | 函数支持解析为NULL |
CHR | 是 | |
HEXTORAW | 是 | |
DATE | 是 | |
TO_DATE | 是 | |
TO_DSINTERVAL | 是 | |
TO_YMINTERVAL | 是 | |
RAWTOHEX | 是 | |
UNISTR | 是 | |
RAWTOHEX(CHR(34)) | 是 | |
TO_TIMESTAMP | 是 | |
LOCALTIMESTAMP | 是 | |
CURRENT_TIMESTAMP | 是 | |
SYSTIMESTAMP | 是 |
DDL支持
SQL类型 | Option | Oracle SQL | 转化后MySQL SQL | 语法支持 |
---|---|---|---|---|
CREATE TABLE | 不带约束 | CREATE TABLE "test"."CaseInsensitive" ("firstName" VARCHAR(15) NOT NULL,lastName VARCHAR2(45) NOT NULL) | CREATE TABLE `test`.`CaseInsensitive` (`firstName` VARCHAR(15) NOT NULL,`LASTNAME` VARCHAR(45) NOT NULL) DEFAULT CHARACTER SET = UTF8MB4 |
支持 |
CREATE TABLE | 带约束 | CREATE TABLE TEST.employees_demo( employee_id NUMBER(6), last_name VARCHAR2(25) CONSTRAINT emp_last_name_nn_demo NOT NULL, CONSTRAINT emp_id_uk_demo UNIQUE (employee_id)) | CREATE TABLE `TEST`.`EMPLOYEES_DEMO` (`EMPLOYEE_ID` INT,`LAST_NAME` VARCHAR(25) NOT NULL,UNIQUE `EMP_ID_UK_DEMO`(`employee_id`)) DEFAULT CHARACTER SET = UTF8MB4 |
不支持外键约束 |
ALTER TABLE | AddColumnClase | alter table TEST.ADDCOLUMN add (author_last_published date); | ALTER TABLE `TEST`.`ADDCOLUMN` ADD COLUMN (`AUTHOR_LAST_PUBLISHED` DATETIME) |
支持 |
ALTER TABLE | ModifyColumnClause | ALTER TABLE test."MODIFYCOLUMN" MODIFY ( alter_new_name1 CHAR ( 13 )) MODIFY ( alter_name2 VARCHAR ( 66 )) | ALTER TABLE `TEST`.`MODIFYCOLUMN` MODIFY COLUMN `ALTER_NEW_NAME1` CHAR(13), MODIFY COLUMN `ALTER_NAME2` VARCHAR(66) |
支持 |
ALTER TABLE | DropColumnClause | alter table TEST.DROPCOLUMN1 drop column COL1 | ALTER TABLE `TEST`.`DROPCOLUMN1` DROP COLUMN `TEST`.`DROPCOLUMN1`.`COL1 |
支持 |
ALTER TABLE | RenameColumnClase | alter table TEST.RENAMECOLUMN RENAME COLUMN COL1 TO COLNEW1 | ALTER TABLE `TEST`.`RENAMECOLUMN` RENAME COLUMN `TEST`.`RENAMECOLUMN`.`COL1` TO `TEST`.`RENAMECOLUMN`.`COLNEW1` |
当前仅支持8.0语法 |
DROP TABLE | DROP TABLE TEST.DROPTABLE | DROP TABLE `TEST`.`DROPTABLE` |
||
create schema/create user | 实现为执行create table 前先执行create schema if not exists,保持库同步 #840 |
下个版本支持功能
- [ ] 支持 索引同步
- [ ] 同步LOB_WRITE,LOB_TRIM, LOB_ERASE,SEL_LOB_LOCATOR 事件
- [ ] 支持PDB(多租户,oracle 12开始支持)
- [ ] DTLE Oracle extractor 通过 SQL driver 轮询读取的间隔目前写死的5秒,优化为动态数值
- [ ] DTLE Oracle extractor 通过 SQL driver 轮询的SCN区间目前写死的100000,优化为动态数值