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. 最佳实践

  1. TABLE 包含:明确
  2. WHERE 简单:性能
  3. COLMAP 清晰:可读
  4. TOKENS:防护
  5. SQLEXEC 谨慎:性能
  6. 脱敏:测试
  7. 监控:数据
  8. 测试:转换
  9. 文档:映射
  10. 演练:故障

15. 参考资料

[1] Oracle GoldenGate Windows and Unix 19c, “Transforming Data” https://docs.oracle.com/en/middleware/goldengate/core/19.1/