SQL Server CDC最佳实践
企业核心业务系统oltp的数据需要通过ETL同步到数据仓库,原始的ETL流程通过定制化从SQL Server中进行数据抽取,经过生产环境的监控,发现ETL过程的query会对生产系统造成额外负载。于是制定了通过cdc进行增量数据同步的方案:
方案选型中比对了SQL server的trigger,CT,CDC, temporary table各种方式,选型对比如下:
Trigger |
CT |
CDC |
Temporal table |
|
Sync way |
Synchronous |
Synchronous |
Asynchronous |
Synchronous |
Internal work |
Heavy than index |
Same as index |
||
Table part in transaction |
Yes |
Yes |
No |
Yes |
Historical Data retention |
Manual control |
No |
Yes |
Yes |
通过表格对比可以看到,cdc通过异步非侵入式进行增量数据捕获,使用了sp_replcmds,这个过程和sql server的transactional replication中的log reader agent是相同的,缺点就是会对占用原始database的datafile和logfile,造成数据增长。
在cdc的使用过程中,比较重要的是将cdc数据置于单独的filegroup内,这样,在数据管理恢复和性能上会减少对于原始oltp的影响。具体过程如下:
在db级别启用cdc时需要先将db的默认filegroup改成cdc,这样cdc对应的元数据信息,例如经常变化的表cdc.lsn_time_mapping可以存放到单独的filegroup中
对于表的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
最新文章
- Python: open和codecs.open
- Hadoop中MR程序的几种提交运行模式
- mysql时间属性之时间戳和datetime之间的转换
- nginx :413 Request Entity Too Large
- HT for Web基于HTML5的图像操作(三)
- oracle中Window和Window Group
- Android 采用post方式提交数据到服务器
- linux下用phpize给PHP动态添加扩展
- 【原】xcode5&;IOS7及以下版本免证书真机调试记录
- 误删ext3的恢复方法
- IOS:利用dispatch_once创建单例
- PHP+MySQL多语句执行<;转自wooyun>;
- 使用Node.js作为后台进行爬虫
- c#自带压缩类实现数据库表导出到CSV压缩文件
- ubuntu下python flask环境搭建
- laravel会话驱动扩展—连接自定义会话管理系统
- 记录参加QCon2017北京站的心得
- top 分析
- VS2012 VS2015打开项目加载失败
- webservice-整理
热门文章
- python中魔法方法__str__与__repr__的区别
- 04、DAT图像文件
- LOCATE()和FIND_IN_SET()
- centos 安装配置LAMP平台
- python 抓取拉勾网 攻略
- css阴影——box-shadow
- ajax异步 —— javascript
- JS计算两个经纬度的距离
- Linux学习--第八天--acl、SetUID、SetGID、chattr、lsattr、sudo
- MySQL发生系统错误2 系统无法找到指定文件