1. 首页 > GoldenGate教程 > 正文

GoldenGate教程FG056-OGG数据脱敏同步配置与实战

本文档风哥主要介绍Oracle GoldenGate数据脱敏同步的配置方法,包括数据脱敏的概念、脱敏函数使用、字段级脱敏配置、高级脱敏技巧等内容,风哥教程参考GoldenGate官方文档数据转换、参数配置等内容,适合需要在数据同步过程中进行数据脱敏的OGG运维人员参考。

Part01-基础概念与理论知识

1.1 数据脱敏概念与重要性

数据脱敏是指在数据同步过程中,对敏感数据进行变形、替换或屏蔽处理,以保护数据隐私和安全。在金融、医疗、政府等行业,数据脱敏是合规性要求的重要组成部分。更多视频教程www.fgedu.net.cn

数据脱敏的重要性:

  • 保护个人隐私信息(PII)
  • 满足行业合规要求(如GDPR、网络安全法)
  • 降低数据泄露风险
  • 支持测试和开发环境数据使用
  • 满足数据共享和交换的安全要求
# 常见需要脱敏的数据类型

# 1. 个人身份信息
– 身份证号码
– 护照号码
– 驾驶证号码
– 社保号码

# 2. 联系方式
– 手机号码
– 固定电话
– 电子邮箱
– 通讯地址

# 3. 金融信息
– 银行卡号
– 信用卡号
– 账户密码
– 交易金额

# 4. 医疗信息
– 病历编号
– 诊断信息
– 用药记录

# 5. 其他敏感信息
– 企业税号
– 合同编号
– 员工薪资

1.2 OGG数据脱敏方法分类

OGG提供多种数据脱敏方法,可根据业务需求选择合适的方案:

# 方法1:字段映射脱敏(COLMAP)
使用OGG内置函数对字段进行转换

优点:
– 配置简单
– 实时处理
– 灵活性高

缺点:
– 需要逐字段配置
– 函数有限

示例:
MAP fgedu01.customers, TARGET fgedu02.customers,
COLMAP (phone = @STREXT(phone, 1, 3) || ‘****’ || @STREXT(phone, 8, 11));

# 方法2:TOKEN函数脱敏
使用TOKEN函数进行数据替换

优点:
– 支持复杂替换规则
– 可配置替换表

缺点:
– 配置较复杂
– 需要维护替换表

示例:
MAP fgedu01.customers, TARGET fgedu02.customers,
COLMAP (name = @TOKEN(‘NAME_MASK’, name));

# 方法3:存储过程脱敏
调用数据库存储过程进行脱敏

优点:
– 支持复杂逻辑
– 可复用

缺点:
– 性能开销
– 依赖数据库

示例:
MAP fgedu01.customers, TARGET fgedu02.customers,
COLMAP (id_card = @GETVAL(@CALL(‘mask_id_card’, id_card)));

# 方法4:外部程序脱敏
调用外部程序进行脱敏

优点:
– 灵活性最高
– 支持任意算法

缺点:
– 性能开销大
– 配置复杂

示例:
MAP fgedu01.customers, TARGET fgedu02.customers,
COLMAP (data = @GETVAL(@CALL(‘external_mask’, data)));

1.3 OGG脱敏函数详解

OGG提供丰富的内置函数用于数据脱敏:

# 字符串处理函数

# @STREXT – 字符串截取
语法:@STREXT(string, start, end)
示例:@STREXT(‘13812345678’, 1, 3) 返回 ‘138’

# @STRCAT – 字符串连接
语法:@STRCAT(string1, string2, …)
示例:@STRCAT(‘138’, ‘****’, ‘5678’) 返回 ‘138****5678’

# @STRLEN – 字符串长度
语法:@STRLEN(string)
示例:@STRLEN(‘13812345678’) 返回 11

# @STRSUB – 字符串替换
语法:@STRSUB(string, pattern, replacement)
示例:@STRSUB(‘13812345678’, ‘1234’, ‘****’) 返回 ‘138****5678’

# 数值处理函数

# @ROUND – 四舍五入
语法:@ROUND(number, decimals)
示例:@ROUND(1234.5678, 2) 返回 1234.57

# @FLOOR – 向下取整
语法:@FLOOR(number)
示例:@FLOOR(1234.5678) 返回 1234

# @MOD – 取模运算
语法:@MOD(number, divisor)
示例:@MOD(1234, 100) 返回 34

# 日期处理函数

# @DATE – 日期格式化
语法:@DATE(format, date)
示例:@DATE(‘YYYY-MM-DD’, @GET(‘CURRENT_TIMESTAMP’))

# @DATEDIFF – 日期差值
语法:@DATEDIFF(date1, date2)
示例:@DATEDIFF(‘2026-04-10’, ‘2026-01-01’) 返回 99

# 条件函数

# @CASE – 条件判断
语法:@CASE(condition1, result1, condition2, result2, …, default)
示例:@CASE(@STRLEN(phone)=11, @STREXT(phone,1,3)||’****’||@STREXT(phone,8,11), phone)

# @IF – 条件判断
语法:@IF(condition, true_value, false_value)
示例:@IF(@STRLEN(id_card)=18, ‘有效’, ‘无效’)

# 加密函数

# @ENCRYPT – 加密
语法:@ENCRYPT(algorithm, key, data)
示例:@ENCRYPT(‘AES128’, ‘mykey’, sensitive_data)

# @DECRYPT – 解密
语法:@DECRYPT(algorithm, key, data)
示例:@DECRYPT(‘AES128’, ‘mykey’, encrypted_data)

风哥提示:选择脱敏方法时,需要综合考虑脱敏强度、性能影响、可逆性需求等因素。对于高敏感数据,建议使用不可逆脱敏方法。学习交流加群风哥微信: itpux-com

Part02-生产环境规划与建议

2.1 数据脱敏规划建议

在生产环境中实施数据脱敏前,需要进行详细规划:

数据脱敏规划要点:

  • 识别敏感数据字段
  • 确定脱敏规则和强度
  • 评估脱敏对性能的影响
  • 制定脱敏测试方案
  • 确保合规性审批
# 敏感数据识别清单
| 数据类型 | 字段示例 | 脱敏方式 | 脱敏强度 |
|————-|———————-|—————|———-|
| 身份证号 | id_card | 部分遮盖 | 高 |
| 手机号 | phone | 部分遮盖 | 中 |
| 银行卡号 | bank_card | 部分遮盖 | 高 |
| 姓名 | customer_name | 姓名替换 | 中 |
| 地址 | address | 地址泛化 | 中 |
| 邮箱 | email | 邮箱遮盖 | 中 |
| 密码 | password | 完全替换 | 高 |
| 金额 | amount | 数值扰动 | 低 |

# 脱敏规则设计原则
1. 最小化原则:只脱敏必要的字段
2. 一致性原则:相同数据脱敏结果一致
3. 可用性原则:脱敏后数据仍可用于业务
4. 安全性原则:脱敏后数据不可逆向还原

# 脱敏性能评估
| 脱敏方式 | 性能影响 | 建议 |
|—————|———–|———————|
| 简单字符串处理 | 低 | 推荐使用 |
| 复杂函数计算 | 中 | 谨慎使用 |
| 外部程序调用 | 高 | 避免在高并发场景使用 |
| 加密算法 | 中-高 | 按需使用 |

2.2 脱敏规则设计规划

设计合理的脱敏规则是数据脱敏成功的关键:

# 规则1:身份证号脱敏
原始数据:110101199001011234
脱敏规则:保留前6位和后4位,中间用*替代
脱敏结果:110101********1234

OGG配置:
COLMAP (id_card = @STREXT(id_card, 1, 6) || ‘********’ || @STREXT(id_card, 15, 18))

# 规则2:手机号脱敏
原始数据:13812345678
脱敏规则:保留前3位和后4位,中间用*替代
脱敏结果:138****5678

OGG配置:
COLMAP (phone = @STREXT(phone, 1, 3) || ‘****’ || @STREXT(phone, 8, 11))

# 规则3:银行卡号脱敏
原始数据:6222021234567890123
脱敏规则:保留前6位和后4位,中间用*替代
脱敏结果:622202**********0123

OGG配置:
COLMAP (bank_card = @STREXT(bank_card, 1, 6) || ‘**********’ || @STREXT(bank_card, 16, 19))

# 规则4:邮箱脱敏
原始数据:zhangsan@example.com
脱敏规则:保留前3位和@后域名,中间用*替代
脱敏结果:zha***@example.com

OGG配置:
COLMAP (email = @STREXT(email, 1, 3) || ‘***@’ || @STREXT(email, @STRFIND(email, ‘@’) + 1, @STRLEN(email)))

# 规则5:姓名脱敏
原始数据:张三
脱敏规则:保留姓,名用*替代
脱敏结果:张*

OGG配置:
COLMAP (customer_name = @STREXT(customer_name, 1, 1) || @STRREPEAT(‘*’, @STRLEN(customer_name) – 1))

# 规则6:地址脱敏
原始数据:北京市朝阳区某某街道123号
脱敏规则:保留省市,详细地址用*替代
脱敏结果:北京市朝阳区******

OGG配置:
COLMAP (address = @STREXT(address, 1, @STRFIND(address, ‘区’)) || ‘******’)

2.3 脱敏安全合规规划

数据脱敏需要满足安全合规要求:

# 合规要求检查清单

# 1. 数据分类分级
[ ] 完成敏感数据识别
[ ] 完成数据分级分类
[ ] 制定分级保护策略

# 2. 脱敏规则审批
[ ] 脱敏规则评审通过
[ ] 安全部门审批通过
[ ] 合规部门审批通过

# 3. 脱敏效果验证
[ ] 脱敏结果符合预期
[ ] 脱敏数据不可逆
[ ] 业务功能正常

# 4. 审计日志
[ ] 脱敏操作有记录
[ ] 访问日志完整
[ ] 异常行为可追溯

# 5. 定期检查
[ ] 定期检查脱敏效果
[ ] 定期评估脱敏规则
[ ] 定期更新敏感数据清单

# 常见合规标准要求
| 标准 | 要求 |
|————–|————————————–|
| GDPR | 个人数据保护,数据最小化原则 |
| 网络安全法 | 个人信息保护,数据分类分级 |
| 等保2.0 | 敏感数据标识,访问控制 |
| PCI DSS | 支付卡数据保护,数据加密 |
| HIPAA | 医疗信息保护,访问审计 |

风哥提示:数据脱敏涉及合规要求,务必在实施前获得安全部门和合规部门的审批,确保脱敏方案满足相关法规要求。学习交流加群风哥QQ113257174

Part03-生产环境项目实施方案

3.1 OGG字段级脱敏配置实战

3.1.1 基础字段脱敏配置

# 步骤1:创建源端测试表
SQL> CREATE TABLE fgedu01.fgedu_customers (
2 customer_id NUMBER PRIMARY KEY,
3 customer_name VARCHAR2(50),
4 id_card VARCHAR2(18),
5 phone VARCHAR2(11),
6 email VARCHAR2(100),
7 bank_card VARCHAR2(19),
8 address VARCHAR2(200)
9 );

Table created.

# 步骤2:插入测试数据
SQL> INSERT INTO fgedu01.fgedu_customers VALUES (
1, ‘张三’, ‘110101199001011234’, ‘13812345678’,
‘zhangsan@example.com’, ‘6222021234567890123’, ‘北京市朝阳区某某街道123号’);

1 row created.

SQL> COMMIT;

Commit complete.

# 步骤3:创建目标端表
SQL> CREATE TABLE fgedu02.fgedu_customers (
2 customer_id NUMBER PRIMARY KEY,
3 customer_name VARCHAR2(50),
4 id_card VARCHAR2(18),
5 phone VARCHAR2(11),
6 email VARCHAR2(100),
7 bank_card VARCHAR2(19),
8 address VARCHAR2(200)
9 );

Table created.

# 步骤4:配置Replicat参数(含脱敏)
GGSCI (fgedu.net.cn)> EDIT PARAMS R_MASKING

REPLICAT R_MASKING
USERIDALIAS fgedu_alias
ASSUMETARGETDEFS

— 字段脱敏映射
MAP fgedu01.fgedu_customers, TARGET fgedu02.fgedu_customers,
COLMAP (
customer_id = customer_id,
customer_name = @STREXT(customer_name, 1, 1) || @STRREPEAT(‘*’, @STRLEN(customer_name) – 1),
id_card = @STREXT(id_card, 1, 6) || ‘********’ || @STREXT(id_card, 15, 18),
phone = @STREXT(phone, 1, 3) || ‘****’ || @STREXT(phone, 8, 11),
email = @STREXT(email, 1, 3) || ‘***@’ || @STREXT(email, @STRFIND(email, ‘@’) + 1, @STRLEN(email)),
bank_card = @STREXT(bank_card, 1, 6) || ‘**********’ || @STREXT(bank_card, 16, 19),
address = @STREXT(address, 1, @STRFIND(address, ‘区’)) || ‘******’
);

# 步骤5:创建并启动Replicat
GGSCI (fgedu.net.cn)> ADD REPLICAT R_MASKING, EXTTRAIL /GoldenGate/app/dirdat/em, CHECKPOINTTABLE fgedu.ogg_chkpt

REPLICAT added.

GGSCI (fgedu.net.cn)> START R_MASKING

Sending START request to MANAGER …
REPLICAT R_MASKING starting

# 步骤6:验证脱敏效果
SQL> SELECT * FROM fgedu02.fgedu_customers;

CUSTOMER_ID CUSTOMER_NAME ID_CARD PHONE EMAIL BANK_CARD ADDRESS
———– ————- ——————– ————- ———————- ——————– ——————–
1 张* 110101********1234 138****5678 zha***@example.com 622202**********0123 北京市朝阳区******

3.1.2 条件脱敏配置

# 场景:根据数据类型和长度进行条件脱敏
GGSCI (fgedu.net.cn)> EDIT PARAMS R_MASKING_COND

REPLICAT R_MASKING_COND
USERIDALIAS fgedu_alias
ASSUMETARGETDEFS

— 条件脱敏映射
MAP fgedu01.fgedu_customers, TARGET fgedu02.fgedu_customers,
COLMAP (
customer_id = customer_id,
customer_name = @CASE(
@STRLEN(customer_name) > 2,
@STREXT(customer_name, 1, 1) || @STRREPEAT(‘*’, @STRLEN(customer_name) – 1),
customer_name || ‘*’
),
id_card = @CASE(
@STRLEN(id_card) = 18,
@STREXT(id_card, 1, 6) || ‘********’ || @STREXT(id_card, 15, 18),
@CASE(
@STRLEN(id_card) = 15,
@STREXT(id_card, 1, 6) || ‘*****’ || @STREXT(id_card, 12, 15),
id_card
)
),
phone = @CASE(
@STRLEN(phone) = 11,
@STREXT(phone, 1, 3) || ‘****’ || @STREXT(phone, 8, 11),
phone
),
email = @IF(
@STRFIND(email, ‘@’) > 0,
@STREXT(email, 1, 3) || ‘***@’ || @STREXT(email, @STRFIND(email, ‘@’) + 1, @STRLEN(email)),
email
),
bank_card = bank_card,
address = address
);

# 验证条件脱敏
SQL> INSERT INTO fgedu01.fgedu_customers VALUES (
2, ‘李’, ‘310101850101123’, ‘13912345678’,
‘lisi@example.com’, ‘6222021234567890123’, ‘上海市浦东新区某某路456号’);

1 row created.

SQL> COMMIT;

Commit complete.

SQL> SELECT * FROM fgedu02.fgedu_customers WHERE customer_id = 2;

CUSTOMER_ID CUSTOMER_NAME ID_CARD PHONE EMAIL BANK_CARD
———– ————- ——————– ————- ———————- ——————–
2 李* 310101*****123 139****5678 lis***@example.com 6222021234567890123

3.2 OGG高级脱敏配置实战

3.2.1 使用用户出口函数脱敏

# 步骤1:创建脱敏函数
SQL> CREATE OR REPLACE FUNCTION fgedu_mask_id_card(p_id_card IN VARCHAR2)
2 RETURN VARCHAR2 IS
3 v_result VARCHAR2(18);
4 BEGIN
5 IF LENGTH(p_id_card) = 18 THEN
6 v_result := SUBSTR(p_id_card, 1, 6) || ‘********’ || SUBSTR(p_id_card, 15, 4);
7 ELSIF LENGTH(p_id_card) = 15 THEN
8 v_result := SUBSTR(p_id_card, 1, 6) || ‘*****’ || SUBSTR(p_id_card, 12, 4);
9 ELSE
10 v_result := p_id_card;
11 END IF;
12 RETURN v_result;
13 END;
14 /

Function created.

# 步骤2:授予OGG用户执行权限
SQL> GRANT EXECUTE ON fgedu_mask_id_card TO fgedu;

Grant succeeded.

# 步骤3:配置Replicat使用函数
GGSCI (fgedu.net.cn)> EDIT PARAMS R_MASKING_FUNC

REPLICAT R_MASKING_FUNC
USERIDALIAS fgedu_alias
ASSUMETARGETDEFS

— 使用数据库函数脱敏
MAP fgedu01.fgedu_customers, TARGET fgedu02.fgedu_customers,
COLMAP (
customer_id = customer_id,
customer_name = customer_name,
id_card = @GETVAL(@CALL(‘fgedu_mask_id_card’, id_card)),
phone = phone,
email = email,
bank_card = bank_card,
address = address
);

# 步骤4:重启Replicat
GGSCI (fgedu.net.cn)> STOP R_MASKING_FUNC
GGSCI (fgedu.net.cn)> START R_MASKING_FUNC

3.2.2 使用TOKEN替换脱敏

# 步骤1:创建TOKEN替换文件
$ vi /GoldenGate/app/dirdef/mask_tokens.txt

# 格式:原始值=替换值
张三=用户A
李四=用户B
王五=用户C

# 步骤2:配置TOKEN定义
GGSCI (fgedu.net.cn)> EDIT PARAMS ./GLOBALS

TOKENFILE /GoldenGate/app/dirdef/mask_tokens.txt

# 步骤3:配置Replicat使用TOKEN
GGSCI (fgedu.net.cn)> EDIT PARAMS R_MASKING_TOKEN

REPLICAT R_MASKING_TOKEN
USERIDALIAS fgedu_alias
ASSUMETARGETDEFS

— 使用TOKEN替换
MAP fgedu01.fgedu_customers, TARGET fgedu02.fgedu_customers,
COLMAP (
customer_id = customer_id,
customer_name = @TOKEN(‘NAME_MASK’, customer_name),
id_card = id_card,
phone = phone,
email = email,
bank_card = bank_card,
address = address
);

风哥提示:高级脱敏方法可以满足更复杂的业务需求,但要注意性能影响。建议在生产环境使用前进行充分的性能测试。更多学习教程公众号风哥教程itpux_com

3.3 OGG脱敏效果验证测试

# 步骤1:创建验证脚本
#!/bin/bash
# verify_masking.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

echo “=== 数据脱敏验证测试 ===”
echo “测试时间: $(date)”
echo “”

# 源端数据
echo “1. 源端原始数据:”
sqlplus -s fgedu/fgedu@fgedudb < 0 THEN ‘身份证已脱敏’
ELSE ‘身份证未脱敏’
END AS id_card_status
FROM fgedu02.fgedu_customers
WHERE ROWNUM = 1;
EOF

# 验证手机号脱敏
sqlplus -s fgedu/fgedu@fgedudb < 0 THEN ‘手机号已脱敏’
ELSE ‘手机号未脱敏’
END AS phone_status
FROM fgedu02.fgedu_customers
WHERE ROWNUM = 1;
EOF

echo “”
echo “=== 验证完成 ===”

# 步骤2:执行验证
$ ./verify_masking.sh

=== 数据脱敏验证测试 ===
测试时间: 2026-04-10 10:00:00

1. 源端原始数据:
CUSTOMER_ID CUSTOMER_NAME ID_CARD PHONE EMAIL
———– ————- ——————– ————- ——————–
1 张三 110101199001011234 13812345678 zhangsan@example.com
2 李四 310101198501011234 13912345678 lisi@example.com

2. 目标端脱敏数据:
CUSTOMER_ID CUSTOMER_NAME ID_CARD PHONE EMAIL
———– ————- ——————– ————- ——————–
1 张* 110101********1234 138****5678 zha***@example.com
2 李* 310101********1234 139****5678 lis***@example.com

3. 脱敏规则验证:
ID_CARD_STATUS
——————–
身份证已脱敏

PHONE_STATUS
——————–
手机号已脱敏

=== 验证完成 ===
from GoldenGate视频:www.itpux.com

Part04-生产案例与实战讲解

4.1 金融行业数据脱敏案例

某银行核心系统数据脱敏同步案例:

# 项目背景
– 源端:银行核心系统Oracle 19c
– 目标端:开发测试环境Oracle 19c
– 需求:生产数据同步到测试环境,敏感数据需脱敏

# 敏感数据清单
| 表名 | 敏感字段 | 脱敏规则 |
|——————|——————|——————|
| fgedu_customers | id_card | 保留前6后4 |
| fgedu_customers | phone | 保留前3后4 |
| fgedu_accounts | account_pwd | 替换为固定值 |
| fgedu_cards | card_no | 保留前6后4 |
| fgedu_cards | cvv2 | 替换为*** |
| fgedu_trans | trans_amount | 数值扰动±10% |

# 脱敏配置
GGSCI (fgedu.net.cn)> EDIT PARAMS R_BANK_MASK

REPLICAT R_BANK_MASK
USERIDALIAS fgedu_alias
ASSUMETARGETDEFS

— 客户信息脱敏
MAP fgedu_core.fgedu_customers, TARGET fgedu_test.fgedu_customers,
COLMAP (
customer_id = customer_id,
customer_name = @STREXT(customer_name, 1, 1) || ‘**’,
id_card = @STREXT(id_card, 1, 6) || ‘********’ || @STREXT(id_card, 15, 18),
phone = @STREXT(phone, 1, 3) || ‘****’ || @STREXT(phone, 8, 11),
email = ‘test@test.com’,
address = ‘测试地址’
);

— 账户信息脱敏
MAP fgedu_core.fgedu_accounts, TARGET fgedu_test.fgedu_accounts,
COLMAP (
account_id = account_id,
customer_id = customer_id,
account_pwd = ‘******’,
account_status = account_status
);

— 银行卡信息脱敏
MAP fgedu_core.fgedu_cards, TARGET fgedu_test.fgedu_cards,
COLMAP (
card_id = card_id,
account_id = account_id,
card_no = @STREXT(card_no, 1, 6) || ‘**********’ || @STREXT(card_no, 16, 19),
cvv2 = ‘***’,
expiry_date = expiry_date
);

— 交易信息脱敏
MAP fgedu_core.fgedu_trans, TARGET fgedu_test.fgedu_trans,
COLMAP (
trans_id = trans_id,
account_id = account_id,
trans_amount = @ROUND(trans_amount * (1 + (@MOD(trans_id, 20) – 10) / 100.0), 2),
trans_date = trans_date,
trans_type = trans_type
);

# 脱敏效果
源端数据:
CUSTOMER_ID CUSTOMER_NAME ID_CARD PHONE ACCOUNT_PWD
———– ————- ——————– ————- ———–
1001 张三 110101199001011234 13812345678 abc123

目标端数据:
CUSTOMER_ID CUSTOMER_NAME ID_CARD PHONE ACCOUNT_PWD
———– ————- ——————– ————- ———–
1001 张** 110101********1234 138****5678 ******

4.2 数据脱敏常见问题处理

# 问题1:脱敏函数执行错误
# 错误信息
ERROR OGG-00351 Error in COLMAP function.

# 原因分析
函数参数错误或数据类型不匹配

# 解决方案
# 1. 检查函数语法
COLMAP (phone = @STREXT(phone, 1, 3) || ‘****’ || @STREXT(phone, 8, 11))

# 2. 添加错误处理
COLMAP (phone = @IF(@STRLEN(phone)=11, @STREXT(phone, 1, 3) || ‘****’ || @STREXT(phone, 8, 11), phone))

# 问题2:脱敏后数据长度不匹配
# 错误信息
ERROR OGG-00868 Column value too long for column.

# 原因分析
脱敏后数据长度超过字段定义长度

# 解决方案
# 1. 修改目标表字段长度
SQL> ALTER TABLE fgedu02.fgedu_customers MODIFY (id_card VARCHAR2(20));

# 2. 或调整脱敏规则
COLMAP (id_card = @STREXT(id_card, 1, 6) || ‘****’ || @STREXT(id_card, 15, 18))

# 问题3:NULL值处理
# 现象
源端NULL值脱敏后变成字符串’NULL’

# 解决方案
COLMAP (phone = @IF(@COLTEST(phone, NULL), phone, @STREXT(phone, 1, 3) || ‘****’ || @STREXT(phone, 8, 11)))

# 问题4:性能问题
# 现象
脱敏后同步性能下降明显

# 解决方案
# 1. 简化脱敏函数
# 2. 减少条件判断
# 3. 使用批量处理
BATCHSQL BATCHESPERQUEUE 200, OPSPERBATCH 200

4.3 数据脱敏解决方案

# 解决方案1:脱敏规则管理脚本
#!/bin/bash
# masking_rule_manager.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

RULE_FILE=/GoldenGate/app/dirdef/masking_rules.txt

# 添加脱敏规则
add_rule() {
local table=$1
local column=$2
local rule=$3

echo “${table}.${column}=${rule}” >> $RULE_FILE
echo “规则已添加: ${table}.${column}”
}

# 查询脱敏规则
query_rule() {
local table=$1
local column=$2

grep “^${table}.${column}=” $RULE_FILE
}

# 列出所有规则
list_rules() {
echo “=== 当前脱敏规则 ===”
cat $RULE_FILE
}

case “$1” in
add)
add_rule $2 $3 $4
;;
query)
query_rule $2 $3
;;
list)
list_rules
;;
*)
echo “用法: $0 {add|query|list} [table] [column] [rule]”
;;
esac

# 使用示例
$ ./masking_rule_manager.sh add fgedu_customers id_card “保留前6后4”
规则已添加: fgedu_customers.id_card

$ ./masking_rule_manager.sh list
=== 当前脱敏规则 ===
fgedu_customers.id_card=保留前6后4
fgedu_customers.phone=保留前3后4
fgedu_customers.email=保留前3字符

# 解决方案2:脱敏效果审计脚本
#!/bin/bash
# masking_audit.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

LOG_FILE=/GoldenGate/app/logs/masking_audit.log

audit_masking() {
echo “=== 脱敏审计报告 ===” >> $LOG_FILE
echo “审计时间: $(date)” >> $LOG_FILE

# 检查脱敏覆盖率
sqlplus -s fgedu/fgedu@fgedudb <> $LOG_FILE
SELECT
‘身份证脱敏率’ AS metric,
ROUND(COUNT(CASE WHEN INSTR(id_card, ‘*’) > 0 THEN 1 END) * 100.0 / COUNT(*), 2) AS rate
FROM fgedu02.fgedu_customers
UNION ALL
SELECT
‘手机号脱敏率’,
ROUND(COUNT(CASE WHEN INSTR(phone, ‘*’) > 0 THEN 1 END) * 100.0 / COUNT(*), 2)
FROM fgedu02.fgedu_customers;
EOF

echo “” >> $LOG_FILE
}

audit_masking

Part05-风哥经验总结与分享

5.1 数据脱敏最佳实践

根据多年数据脱敏项目实施经验,总结以下最佳实践:

数据脱敏最佳实践:

  • 识别所有敏感数据字段
  • 设计合理的脱敏规则
  • 充分测试脱敏效果
  • 定期审计脱敏覆盖
  • 保持脱敏规则更新
# 最佳实践1:脱敏规则设计原则
1. 最小化原则:只脱敏必要字段
2. 一致性原则:相同数据相同规则
3. 不可逆原则:脱敏后不可还原
4. 可用性原则:脱敏后数据可用

# 最佳实践2:脱敏配置模板
MAP source_table, TARGET target_table,
COLMAP (
id = id,
sensitive_field = @STREXT(sensitive_field, 1, n) || ‘****’ || @STREXT(sensitive_field, m, end)
);

# 最佳实践3:脱敏测试清单
[ ] 脱敏规则正确执行
[ ] 脱敏数据不可逆
[ ] 业务功能正常
[ ] 性能影响可接受
[ ] 合规要求满足

5.2 数据脱敏检查清单

# 脱敏实施前检查
[ ] 敏感数据识别完成
[ ] 脱敏规则设计完成
[ ] 脱敏规则审批通过
[ ] 测试环境验证通过
[ ] 性能测试通过

# 脱敏实施后检查
[ ] 脱敏效果验证通过
[ ] 业务功能验证通过
[ ] 审计日志正常
[ ] 监控告警正常
[ ] 文档更新完成

# 定期检查
[ ] 脱敏覆盖率检查
[ ] 脱敏规则有效性检查
[ ] 敏感数据清单更新
[ ] 合规审计配合

5.3 风哥实战经验总结

在多年数据脱敏项目实施过程中,总结以下实战经验:

风哥实战经验:

  • 数据脱敏是合规要求,必须重视
  • 脱敏规则要平衡安全性和可用性
  • 充分测试是成功的关键
  • 定期审计确保脱敏有效
  • 保持规则更新应对变化
# 经验1:脱敏规则选择
– 身份证:保留前6后4,中间遮盖
– 手机号:保留前3后4,中间遮盖
– 银行卡:保留前6后4,中间遮盖
– 姓名:保留姓,名遮盖
– 地址:保留省市,详细地址遮盖

# 经验2:性能优化
– 使用简单字符串函数
– 避免复杂条件判断
– 批量处理提高效率

# 经验3:问题预防
– 充分测试各种数据情况
– 处理NULL值和异常值
– 监控脱敏执行状态

风哥提示:数据脱敏是数据安全的重要环节,务必严格按照合规要求实施。建议建立完善的脱敏规则管理和审计机制,确保数据安全。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息