7x24小时不停机:基于 Apache SeaTunnel 实现 Oracle to Oracle 实时 CDC 同步全实战
在企业级数据治理和实时数仓建设中,Oracle 数据库之间的高效、不间断数据同步一直是一大痛点。传统的定时批处理(Batch)模式不仅对源库具有较高的瞬时高压,还存在显著的数据延迟,无法满足现代实时业务的需求。
作为 Apache 基金会的顶级项目,Apache SeaTunnel 凭借其微内核、高并发、低代码配置的架构优势,成为了替代传统 DataX、GoldenGate(OGG)等工具的热门选择。其内置的 connector-cdc-oracle 插件通过无侵入式解析 Oracle 的 LogMiner 日志,能够完美实现毫秒级的 变更数据捕获(CDC, Change Data Capture)。
本文将手把手带你从零开始,在 数据库运维配置、高权限账号准备、SeaTunnel 实时流任务编写 三个维度,彻底打通 7x24 小时不停机的 Oracle 实时同步管道。
一、 为什么选择 SeaTunnel CDC?
- 非侵入式读取:底层依赖 Oracle 原生的 LogMiner 技术,直接解析重做日志(Redo Log)和归档日志(Archive Log),不锁表,对业务系统影响极小。
- 全量与增量无缝衔接 :支持
startup.mode = "initial"。启动后会自动先做历史全量数据的秒级拉取,全量结束后不中断程序,自动、无缝地切入实时增量监听状态。 - 原生支持断点续传(HA) :通过内置的 Checkpoint 机制,能实时记录消费到的 SCN(系统改变号)。即使同步服务器意外宕机,重启后也能精准续传,保证数据不丢不重。
- 版本支持提示 :官方 Oracle CDC 插件基于现代日志特性设计,明确支持 Oracle 12c、19c、21c 及以上版本(不建议在已过期的 11g 及以下版本中使用)。
二、 核心前置准备:Oracle 数据库端 DBA 配置
Oracle 默认并不会记录极其详细的变更上下文。为了让 SeaTunnel 能够成功捕捉并还原每一次 INSERT/UPDATE/DELETE,必须在源数据库开启归档日志与补充日志。
请联系您的 DBA,或使用 sysdba(如 sys 账户) 权限登录源库执行以下 SQL 命令:
1. 开启归档日志(Archive Log)
注:如果数据库已经是 ARCHIVELOG 模式,可跳过此步。切换该模式通常需要重启数据库。
sql
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
2. 开启全表补充日志(Supplemental Log)
这是 CDC 的核心。如果没有补全日志,LogMiner 只能拿到修改后的数据,拿不到修改前的数据(导致 UPDATE 无法在目标库还原)。
sql
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
3. 创建专属高权限同步账号
LogMiner 技术需要涉及到数据库底层的元数据字典读取与系统级视图查询,因此需要授予专属的高级权限(以下以 Oracle 19c/21c 为例):
sql
-- 创建专属 CDC 用户
CREATE USER seatunnel_cdc IDENTIFIED BY YourSecurePassword;
-- 授予基础权限
GRANT CREATE SESSION TO seatunnel_cdc;
GRANT SELECT ANY TABLE TO seatunnel_cdc;
-- 授予核心 LogMiner 权限
GRANT SELECT ANY TRANSACTION TO seatunnel_cdc;
GRANT EXECUTE_CATALOG_ROLE TO seatunnel_cdc;
-- 特别注意:Oracle 12c 及以上版本必须显式授予以下系统权限
GRANT LOGMINERAL_PRIVILEGE TO seatunnel_cdc;
GRANT SELECT ON V_$LOG TO seatunnel_cdc;
GRANT SELECT ON V_$LOGFILE TO seatunnel_cdc;
GRANT SELECT ON V_$ARCHIVED_LOG TO seatunnel_cdc;
GRANT SELECT ON V_$DATABASE TO seatunnel_cdc;
三、 💡 权限开启状态检查(黄金验证动作)
在将账号交付给 SeaTunnel 之前,我们必须以 sysdba 管理员身份登录,运行以下查询,确保刚刚创建的用户状态和 CDC 核心权限已经完全成功开启:
1. 检查用户账号状态(确保为 OPEN)
sql
SELECT username, account_status, expiry_date
FROM dba_users
WHERE username = 'SEATUNNEL_CDC'; -- 注意:Oracle 元数据必须全大写
如果 ACCOUNT_STATUS 显示为 OPEN,说明账号正常启用。
2. 检查 CDC 系统权限与底层视图权限
为了防止 SeaTunnel 启动时因缺失系统权限而崩溃,请执行以下两个核心检查(必须使用 SYS 账号或拥有最高 DBA 权限的账号运行,否则会报"表或视图不存在"):
sql
-- 检查系统权限:确认是否包含 CREATE SESSION、SELECT ANY TRANSACTION 和 LOGMINERAL_PRIVILEGE
SELECT privilege
FROM dba_sys_privs
WHERE grantee = 'SEATUNNEL_CDC';
-- 检查底层关键视图权限:确认是否包含 V_$LOG、V_$LOGFILE、V_$ARCHIVED_LOG 和 V_$DATABASE
SELECT table_name, privilege
FROM dba_tab_privs
WHERE grantee = 'SEATUNNEL_CDC';
检查清单:只要在上述查询结果中,能看到对应系统视图的 SELECT 权限以及 LogMiner 系统特权,即代表该 CDC 用户已完全开启、权限就绪。
四、 环境依赖补全:安装核心插件与驱动
如果你之前下载的 SeaTunnel 还没安装过 Oracle 的相关依赖,请确保以下三点到位(无论 Linux 还是 Windows):
- 精简插件配置 :修改
config/plugin_config,只保留connector-jdbc和connector-cdc-oracle,避免下载无用依赖。 - 下载插件 :运行
sh bin/install-plugin.sh(Windows 下运行.cmd)。 - 手动补全商业驱动与语言包 :前往 Oracle 官网或从数据库安装目录拷贝
ojdbc8.jar与orai18n.jar。orai18n.jar(国际化语言包)至关重要! 如果你的 Oracle 数据库使用了ZHS16GBK等中文编码,或者涉及NVARCHAR2字段,没有这个包会导致同步出来的中文变成乱码、甚至直接报错中断。- 将上述两个 Jar 包一并放入 SeaTunnel 的
lib/目录下。
五、 核心配置:编写 oracle_cdc_to_oracle.conf
在 SeaTunnel 的 config/ 目录下创建一个全新的流式任务配置文件 oracle_cdc_to_oracle.conf。
⚠️ 避坑警示(大小写与标准复数参数):
- Oracle 数据库的元数据默认是以全大写 形式存在的。在 CDC 配置中,
database-names、schema-names和table-names必须填写全大写,否则会因找不到匹配的表而无限挂起!- 官方新版插件强制要求参数使用复数数组格式 ,填错单数形式会触发
Unrecognized option解析报错。table-names必须使用数据库名.Schema名.表名的完整三段式全路径。
text
env {
parallelism = 2
job.mode = "STREAMING" # 1. 核心重点:必须声明为 STREAMING(流模式)
checkpoint.interval = 15000 # 2. 核心重点:开启 Checkpoint 快照机制,单位毫秒(每 15 秒保存一次 SCN 进度)
}
source {
Oracle-CDC { # 3. 使用专门的 Oracle-CDC 实时流插件
username = "seatunnel_cdc"
password = "YourSecurePassword"
# 新版标准:核心基础 JDBC 连接串
base-url = "jdbc:oracle:thin:@//192.168.1.100:1521/ORCL"
# 核心重点:必须为复数数组格式,且全部大写!
database-names = ["ORCL"]
schema-names = ["SOURCE_USER"]
# 必须是三段式全路径(数据库名.SCHEMA名.表名),支持正则匹配多张表
table-names = ["ORCL\\.SOURCE_USER\\.SOURCE_TABLE"]
# 首次启动策略:initial 表示先自动做全量历史数据同步,随后无缝切换到增量 CDC 监听
startup.mode = "initial"
}
}
transform {
# 在流式同步中,如果源表和目标表结构完全一致,通常无需 transform 板块
}
sink {
Jdbc { # 4. 写入端使用标准的 Jdbc 插件
url = "jdbc:oracle:thin:@//192.168.1.200:1521/ORCL"
driver = "oracle.jdbc.OracleDriver"
user = "target_user"
password = "target_password"
# 开启以下参数,SeaTunnel 会根据 CDC 捕获到的变更类型(INSERT/UPDATE/DELETE)
# 自动在后台生成并执行对应的目标端 SQL 语句,保证两端状态绝对一致
generate_sink_sql = true
database = "ORCL"
table = "TARGET_USER.TARGET_TABLE"
}
}
六、 任务启动与生产运维检查清单
1. 任务启动
通过命令行直接调起任务:
- Linux :
./bin/seatunnel.sh --config config/oracle_cdc_to_oracle.conf -e local - Windows :
.\bin\seatunnel.cmd --config config/oracle_cdc_to_oracle.conf -e local
(注:Windows 环境下若报日志初始化错误,请记得将bin/seatunnel.cmd内的日志名修改为-Dseatunnel.logs.file_name=seatunnel-starter-client-test)
2. 成功运行的表现
- 第一阶段(历史全量):控制台会快速滚动打印存量数据的拉取进度。
- 第二阶段(增量流式监听) :全量数据同步完后,程序不会退出 ,而是进入长连接阻塞监听状态。此时你在源表敲下一个
INSERT或UPDATE并执行COMMIT,目标表在 1 秒内就会同步更新!
3. 实时流的"保命"运维清单
在生产环境中上线 7x24 小时 CDC 流任务,请务必建立以下运维规范:
- 归档日志清理策略(最重要的一条) :请一定要对齐 DBA 的归档日志清理(Delete input)策略。建议归档日志在源端服务器至少保留 24-48 小时 。如果 SeaTunnel 刚好停机维护了半天,而此时 DBA 的自动化脚本删除了尚未被 SeaTunnel 消费的归档日志,任务重启时会报
LogMiner 找不到日志的毁灭性错误,届时你只能重新跑全量初始化! - 表结构变更(DDL)限制 :当前的 CDC 主要针对 DML 变更。如果在运行中源表突然进行了
ALTER TABLE增加列或删除列的操作,流任务可能会中断报错。建议在进行 DDL 变更前,先优雅停止 SeaTunnel,修改两端表结构后,再重新拉起任务。
总结
通过 Apache SeaTunnel 的 Oracle-CDC 连接器,我们只用了区区几十行低代码配置,就轻松搭起了一条高性能、具备抗风险能力(断点续传)的实时数据流管道。如果你正在摆脱传统 OGG 的高昂商业授权,或者苦于 DataX 定时轮询对数据库造成的巨大压力,不妨立刻试一试 SeaTunnel CDC!