Oracle GoldenGate 过滤与转换详解
Oracle GoldenGate 过滤与转换详解
适用版本:Oracle GoldenGate 12c / 19c / 21c 文档版本:v1.0 / 2026-07
1. 概述
GoldenGate 过滤与转换实现灵活数据复制[1]:
详细见:Oracle GoldenGate 全集。
2. TABLE 过滤
2.1 包含
# ext1.prm
TABLE scott.emp;
TABLE scott.dept;
TABLE hr.*;
2.2 排除
TABLEEXCLUDE scott.temp_*;
TABLEEXCLUDE hr.log_*;
3. WHERE 子句
TABLE scott.emp, WHERE (dept_id = 10);
TABLE scott.emp, WHERE (salary > 5000);
TABLE scott.orders, WHERE (status = 'ACTIVE');
4. FILTER
4.1 基本
TABLE scott.emp, FILTER (on_filter());
TABLE scott.emp, FILTER (salary > 5000 AND dept_id = 10);
4.2 函数
TABLE scott.emp, FILTER (@COMPUTE (salary * 1.1) > 5000);
TABLE scott.emp, FILTER (@STRFIND(name, 'Alice') > 0);
5. 列转换
5.1 COLMAP
MAP scott.emp, TARGET hr.employees,
COLMAP (
USEDEFAULTS,
emp_name = name,
emp_salary = salary,
created = @DATE ('YYYY-MM-DD HH:MI:SS', 'JTS', @GETENV ('GGHEADER', 'COMMITTIMESTAMP'))
);
5.2 函数
- @COMPUTE:计算
- @DATE:日期
- @STRFIND:字符串查找
- @STRCAT:连接
- @IF:条件
- @CASE:多分支
6. TOKENS
6.1 Extract 添加
TABLE scott.emp, TOKENS (
origin = 'site_a',
ts = @GETENV ('GGHEADER', 'COMMITTIMESTAMP')
);
6.2 Replicat 使用
MAP scott.emp, TARGET scott.emp,
FILTER (@TOKEN ('origin') != 'site_a');
6.3 应用
- 循环防护
- 来源追踪
- 业务标识
7. SQLEXEC
7.1 查询
MAP scott.emp, TARGET scott.emp,
SQLEXEC (ID lookup,
QUERY 'SELECT dept_name FROM dept WHERE id = :dept_id',
PARAMS (dept_id = dept_id)),
COLMAP (USEDEFAULTS, dept_name = lookup.dept_name);
7.2 存储过程
MAP scott.emp, TARGET scott.emp,
SQLEXEC (sp_update_audit,
PARAMS (p_id = id, p_op = @GETENV ('GGHEADER', 'OPTYPE')));
8. 数据转换
8.1 类型
MAP scott.emp, TARGET hr.emp,
COLMAP (
id = id,
name = UPPER(name),
salary = TO_NUMBER(salary)
);
8.2 字符集
SOURCECHARSET UTF-8
TARGETCHARSET AL32UTF8
9. 复杂转换
9.1 表拆分
MAP scott.emp, TARGET hr.emp_basic,
COLMAP (USEDEFAULTS, id = id, name = name);
MAP scott.emp, TARGET hr.emp_salary,
COLMAP (id = id, salary = salary, bonus = bonus);
9.2 表合并
MAP scott.emp, TARGET hr.emp_all,
COLMAP (USEDEFAULTS, source = 'EMP');
MAP scott.contractor, TARGET hr.emp_all,
COLMAP (USEDEFAULTS, source = 'CONTRACTOR');
9.3 列拆分
MAP scott.emp, TARGET hr.emp,
COLMAP (
USEDEFAULTS,
first_name = @STRCAT(first_name),
last_name = @STRCAT(last_name)
);
10. 数据屏蔽
10.1 加密
MAP scott.emp, TARGET hr.emp,
COLMAP (
USEDEFAULTS,
ssn = @ENCRYPT (ssn, KEY1)
);
10.2 脱敏
MAP scott.emp, TARGET hr.emp_test,
COLMAP (
USEDEFAULTS,
salary = 0,
phone = 'XXX-XXX-XXXX',
email = @STRCAT ('test_', id, '@example.com')
);
11. 应用场景
11.1 子集复制
- WHERE
- FILTER
- 部分 DML
11.2 数据转换
- 列映射
- 类型转换
- 表结构变更
11.3 数据屏蔽
- 测试环境
- 脱敏
- 加密
11.4 业务规则
- 复杂逻辑
- SQLEXEC
- 函数
12. 性能
12.1 开销
- FILTER 开销
- SQLEXEC 开销
- 监控
12.2 优化
- 简单 FILTER
- 缓存
- 减少 SQLEXEC
13. 常见坑与排错
13.1 数据不复制
- FILTER 排除
- 检查条件
13.2 性能差
- 复杂 FILTER
- SQLEXEC 频繁
13.3 转换错误
- 类型不匹配
- 检查 COLMAP
14. 最佳实践
- TABLE 包含:明确
- WHERE 简单:性能
- COLMAP 清晰:可读
- TOKENS:防护
- SQLEXEC 谨慎:性能
- 脱敏:测试
- 监控:数据
- 测试:转换
- 文档:映射
- 演练:故障
15. 参考资料
[1] Oracle GoldenGate Windows and Unix 19c, “Transforming Data” https://docs.oracle.com/en/middleware/goldengate/core/19.1/