sql-server – 是否可以仅在复制服务器上进行更改跟踪,而不是原始服务器?

我正在开发一个系统,我们从复制服务器中提取记录,并且需要知道何时发生了更改.

我们希望不必触摸原始服务器,只读取它,包括不允许启用更改跟踪.可以这样做吗?

如果需要,我们将每晚简单地提取所有记录ID并比较两者,但考虑到我们有数千万条记录,它肯定不是理想的解决方案.

我见过这个问题:

> Is it possible to use Change Tracking on a Replication target?

它的答案似乎是建议这样做的方法是在原始服务器上启用更改跟踪,然后复制,在我的情况下不是一个选项.

最佳答案
如果您不仅可以考虑SQL Server选项,请查看GoldenGate.
我们有一个项目可以提供从Oracle到Greenplum数据库的内容(持续变更)变更跟踪. GoldenGate也支持SQL Server,因此进程的想法甚至参数文件都是相同的.
从高层次来看,它看起来像:

>捕获源系统上的事务记录信息(EXTRACT进程)
>传递到目标独立系统(可以是SQL Server,或GoldenGate支持的任何系统) – (PUMP流程)
>将更改应用为DML操作,而不是作为带有“操作名称”,“提交时间戳”等附加属性的完整记录,否则您可以从源上生成的跟踪文件(REPLICAT进程)获取.
您只能将PK值或完整行值记录到更改跟踪中.这只是一个设计问题.

EXTRACT和PUMP过程非常简单.这里最有趣的是REPLICAT配置:

REPLICAT <PROCESS NAME>
INCLUDE ./dirprm/DBLOGIN.inc
INCLUDE ./dirprm/REPORT.inc
MACRO #map_history
PARAMS (#table)
BEGIN
IGNORETRUNCATES
MAP <SRC_SCHEMA>.#table, TARGET <TGT_SCHEMA>.#table,
  INSERTALLRECORDS,
  COLMAP (USEDEFAULTS,
    OPERATION = @GETENV('GGHEADER', 'OPTYPE'),
    CSN = @GETENV('TRANSACTION', 'CSN'),
    RSN = @COMPUTE(@COMPUTE(@NUMSTR(@GETENV('RECORD', 'FILESEQNO')) * 100000000000) + @NUMSTR(@GETENV('RECORD', 'FILERBA'))),
    CSN_TIMESTAMP = @GETENV('GGHEADER', 'COMMITTIMESTAMP')
  );
END;
INCLUDE ./dirprm/DML_REPLICAT.inc
#map_history(<TABLE1>)
#map_history(<TABLE2>)
...
#map_history(<TABLEN>)

这适用于每天数亿次操作(包括LOB).

希望有助于了解潜在解决方案之一.

转载注明原文:sql-server – 是否可以仅在复制服务器上进行更改跟踪,而不是原始服务器? - 代码日志