寻求Oracle SOR到SQL Server超大数据表数据复制的替代方案
Oracle超大型表到SQL Server增量同步方案
补充说明:你之前考虑的ROWID匹配方案效率低的问题,只要在SQL Server端给新增的ROWID字段创建唯一非聚集索引,匹配时走索引查找,性能是毫秒级,完全不存在全表扫描的问题。
下面是三个不同权限场景下的可行方案,按需选择即可:
方案1:Oracle物化视图日志增量捕获(优先推荐,对原表影响最小)
- 无需修改原业务表结构,仅需在Oracle端对目标表创建物化视图日志,默认以
ROWID作为变更标识,自动捕获所有新增、修改、删除操作 - 首次同步完成后,后续每次同步仅需拉取物化视图日志中上次同步之后产生的变更记录,不需要扫描Oracle原表,也不需要大范围匹配SQL Server数据
- 同步完成后清理已同步的物化视图日志记录,增量同步耗时仅和每日变更量成正比,完全可以在凌晨时间窗口内完成
- 要求:Oracle操作账号有创建物化视图日志的权限,对原业务表的读写性能影响可以忽略
方案2:Oracle闪回查询增量同步(无物化视图创建权限时使用)
- 无需修改两端表结构,利用Oracle自带的闪回查询能力,每次同步时执行语句拉取24小时内的变更记录:
SELECT * FROM 目标表 AS OF TIMESTAMP TO_TIMESTAMP('上次同步结束时间', 'YYYY-MM-DD HH24:MI:SS') - 拉取到的增量数据直接在SQL Server端用
MERGE语句匹配ROWID索引完成 upsert 操作,效率极高 - 要求:Oracle的
UNDO_RETENTION参数配置大于24小时,保证24小时内的闪回查询可以正常执行,适合日变更量百万级以内的场景
方案3:基于ORA_ROWSCN伪列增量同步(无闪回查询权限时使用)
- Oracle表默认自带
ORA_ROWSCN伪列,记录了每行数据最后一次变更的系统SCN号,每次同步前先记录当前Oracle的最新SCN值,下次同步时执行语句拉取增量:SELECT * FROM 目标表 WHERE ORA_ROWSCN > 上次同步记录的最大SCN - 同样配合SQL Server端的ROWID唯一索引做MERGE操作完成同步
- 注意:如果原表建表时未开启
ROWDEPENDENCIES,ORA_ROWSCN是数据块级的标识,会多拉取少量同数据块的无关记录,不影响同步正确性,仅增量数据量稍大
内容的提问来源于stack exchange,提问作者pithhelmet
相关产品推荐
相关产品推荐

