SQL Server 多表数据增量获取和发布 2.1
CDC 介绍
为了满足数据迁移和数据抽取的业务需要,使得有机会在数据库层面上直接实现增量抽取功能,ORACLE 综合性能和场景需要,在数据库引擎层面直接集成了 CDC 功能,由于提供了类似 API 的功能接口,变更数据捕获和更改跟踪均不要求在源中进行任何架构更改或使用触发器,所以比第三方工具具有一定的优势。利用 CDC 捕获变更有以下特点:
① 性能影响小。使用异步进程捕获,通过进程读取事务日志,对系统造成的影响很小,不对业务系统造成太大的压力,影响现有业务。
② 监控范围大。对该表的所有 DML 和 DDL 操作都会被记录,有助于跟踪表的变化,实现表操作的追根溯源。
③ 操作简单 。CDC 是在数据库引擎中添加的功能,封装在数据库中,类似于 API 接口调用,不需要复杂的业务处理逻辑就可以实现 DML 和 DDL 的操作监控。
④ 有一定时延性。由于捕获进程从事务日志中提取更改数据,因此,向源表提交更改的时间与更改出现在其关联更改表中的时间之间存在内在的延迟。 虽然这种延迟通常很小,但务必记住,在捕获进程处理相关日志项之前无法使用更改数据。
#CDC 注意事项
1. SQL Server 的版本必须是 2008 或以上;
2. 不能同时使用内存优化表(SQL Server2014 或以上版本才有的功能)。否则会出现以下错误:
@@SERVERNAME、serverproperty('servername')两者(本地服务器名和服务器实例的属性必须一致)必须一致。下面脚本可将两者调整成一致。如果执行后两者仍不一致,需要重启 SQL Server 服务。
>if serverproperty('servername') <> @@servername
begin
declare @server sysname
set @server = @@servername
exec sp_dropserver@server =@server
set @server = cast(serverproperty('servername') as sysname)
exec sp_addserver@server = @server , @local = 'LOCAL'
PRINT 'ok'
end
select @@SERVERNAME,serverproperty('servername')
必须开启 SQL Sever 代理服务。CDC 功能必须通过作业来实现。
开启 CDC 功能的表,无法使用 TRUNCATE TABLE 。可以先禁用,执行完 truncate 再启用 cdc。
6.如果表结构发生变化,则捕获实例表中:新增列无法捕获到、删除列保持 NULL、修改列类型会发生强制转换。为保险起见,应禁用捕获实例,然后再启用。
7.在查询 CDC 相关表时,建议加上 With(NOLOCK),否则易产生阻塞或死锁。
一个表最多只能有两个捕获实例。
版权声明: 本文为 InfoQ 作者【happlyfox】的原创文章。
原文链接:【http://xie.infoq.cn/article/f072bd5eb8dcb2dfd877612ca】。文章转载请联系作者。
评论