SQL Server如何配置cdc进行ETL

企业核心业务系统oltp的数据需要通过ETL同步到数据仓库,原始的ETL流程通过定制化从SQL Server中进行数据抽取,经过生产环境的监控,发现ETL过程的query会对生产系统造成额外负载。于是制定了通过cdc进行增量数据同步的方案:

方案选型中比对了SQL server的trigger,CT,CDC, temporary table各种方式,选型对比如下:

TriggerCTCDCTemporal table
Sync waySynchronousSynchronousAsynchronousSynchronous
Internal workHeavy than indexSame as indexCall sp_replcmds   to collect from tlog no direct workload. 
Table part in transactionYesYesNoYes
Historical Data retentionManual controlNoYesYes 

通过表格对比可以看到,cdc通过异步非侵入式进行增量数据捕获,使用了sp_replcmds,这个过程和sql server的transactional replication中的log reader agent是相同的,缺点就是会对占用原始database的datafile和logfile,造成数据增长。

在cdc的使用过程中,比较重要的是将cdc数据置于单独的filegroup内,这样,在数据管理恢复和性能上会减少对于原始oltp的影响。具体过程如下:

  1. 在db级别启用cdc时需要先将db的默认filegroup改成cdc,这样cdc对应的元数据信息,例如经常变化的表cdc.lsn_time_mapping可以存放到单独的filegroup中
  2. 对于表的cdc数据使用@fileGroup_Name参数指定filegroup

–enable cdc filegroup

USE DB1

ALTER DATABASE DB1 ADD FILEGROUP CDC

GO

ALTER DATABASE DB1 ADD FILE

(

NAME=’CDC’,

FILENAME=’D:\DATA\DB_CDC1.ndf’,

SIZE = 1024MB,

MAXSIZE = unlimited,

FILEGROWTH=256MB

)TO FILEGROUP CDC

GO

USE DB1

GO 

ALTER DATABASE DB1 MODIFY FILEGROUP [CDC] DEFAULT

GO  

EXEC sys.sp_cdc_enable_db  

GO  

ALTER DATABASE DB1 MODIFY FILEGROUP [DATA] DEFAULT

go

EXEC sys.sp_cdc_enable_table @source_schema = N’dbo’,@source_name = ‘T1′,@role_name = N’cdc_Admin’,@fileGroup_Name = N’CDC’ 

CDC建立后有capture job和clean job,当cdc的数据增量非常大的时候,需要适当调整job的参数:

EXEC sys.sp_cdc_change_job  

 @job_type = ‘capture’ 

 ,@maxtrans = 5000      –每个扫描循环可以处理的最多事务数 

 ,@maxscans = 100       –为了从日志中提取所有行而要执行的最大扫描循环次数 

 ,@continuous = 1       –连续运行最多处理(max_trans * max_scans)个事务 

 ,@pollinginterval = 1

发表评论

电子邮件地址不会被公开。 必填项已用*标注