SQL Server 2008 的CDC功能
2013-09-17 10:31
363 查看
CDC:变更数据捕获仅在2008及以上的版本 Enterprise Edition、Developer Edition 和 Enterprise Evaluation Edition 中可用。
CDC(Change Data Capture)通过对事务日志的异步读取,记录DML操作的发生时间、类型和实际影响的数据变化,然后将这些数据记录到启用CDC时自动创建的表中。通过cdc相关的存储过程,可以获取详细的数据变化情况。由于数据变化是异步读取的,因此对整体性能的影响不大,远小于通过Trigger实现的数据变化记录。
因此在触发器较多的情况下,可以用CDC来替换触发器以提高数据库性能!
下面我用一个实例讲解这个功能。该功能主要在ETL解决方案中比较有用。
USE AdventureWorksDW;
GO
EXECUTE sys.sp_cdc_enable_db; --启用数据库对CDC的支持
GO
EXEC sys.sp_cdc_enable_table 'dbo',
'FactInternetSales', @role_name = NULL, @supports_net_changes =0; --启用某个表对CDC的支持GO
--这里的supports_net_changes指的是是否支持所谓的净更改,即过滤掉重复的
SELECT name, is_tracked_by_cdc FROM sys.tables
WHERE name LIKE ('fact%');
INSERT INTO FactInternetSales
VALUES(484,1127,1139,1134,18759,1,100,6,'SO75124',1,1,1,21.9800,21.9800,0,0,8.2205,8.2205,21.9800,1.7584,0.5495,NULL,NULL);
INSERT INTO FactInternetSales
VALUES(486,1127,1139,1134,18759,1,100,6,'SO75125',1,1,1,21.9800,21.9800,0,0,8.2205,8.2205,21.9800,1.7584,0.5495,NULL,NULL);
UPDATE FactInternetSales
SET PromotionKey = 2
WHERE SalesOrderNumber = 'SO75124';
DELETE FROM FactInternetSales WHERE SalesOrderNumber='SO75125'
SELECT * FROM cdc.dbo_FactInternetSales_CT; --这个表其实是在系统表里面
--这里将看到4条结果,其中operation为3和4是update操作的那条,3表示旧值,4表示新值
--2表示新增
--1表示删除
DECLARE @begin_time datetime, @end_time datetime, @from_lsn binary(10), @to_lsn binary(10);
-- Obtain the beginning of the time interval.
SET @begin_time = GETDATE()-1;
SET @end_time = GETDATE();
-- Map the time interval to a change data capture query range.
SELECT @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);
SELECT @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);
print @begin_time
print @end_time
print @from_lsn
print @to_lsn
--创建一个存储过程,根据开始时间和结束时间读取变更记录
CREATE PROC GetCDCResult
(@begin_time DATETIME,@end_time DATETIME)
AS
DECLARE @from_lsn binary(10), @to_lsn binary(10);
SELECT @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);
SELECT @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);
SELECT * FROM cdc.dbo_FactInternetSales_CT WHERE __$start_lsn BETWEEN @from_lsn AND @to_lsn
--调用该存储过程
EXEC GetCDCResult '2009-4-27','2009-4-29'
--撤销CDC
EXEC sys.sp_cdc_disable_table 'dbo',
'FactInternetSales','All'
EXEC sys.sp_cdc_disable_db
有朋友可能会问到:CDC到底是怎么做到的呢?
下面这篇文章很详细地讲解到了该原理
http://technet.microsoft.com/zh-cn/library/cc645937.aspx
1. 其实,它是有一个独立的进程的。它是异步地读取日志文件。如果某部分更改没有被进程读到,那么此时日志截断也是没有效果的,很显然需要这样来保证。
2. net_changes是什么意思呢?说的是针对一行记录,如果有多个更改的话,那么以最后的一条为准。
3. 这个更改是不是会永远保存?不会的,它会定期清除的
捕获和清除作业都是使用默认参数创建的。将立即启动捕获作业。它连续运行,每个扫描周期最多可处理 1000 个事务,并在两个周期之间停顿 5 秒钟。清除作业在每天凌晨 2 点运行一次。它将更改表项保留三天(4320 分钟),可使用单个删除语句最多删除 5000 项。
4. 如果启用了之后,修改了表的结构,会怎么样?
为适应固定列结构更改表,在为源表启用变更数据捕获后,负责填充更改表的捕获进程将忽略未指定进行捕获的任何新列。如果删除了某个跟踪的列,则会为在后续更改项中为该列提供 Null 值。但是,如果现有列更改了其数据类型,则会将更改传播到更改表,以确保捕获机制没有导致跟踪的列发生数据丢失。捕获进程还会将检测的跟踪表列结构的任何更改发送到 cdc.ddl_history 表。如果使用者希望得到下游应用程序中可能需要进行的调整的通知,请使用 sys.sp_cdc_get_ddl_history 存储过程。
from:http://www.cnblogs.com/chenxizhang/archive/2009/04/28/1445297.html
CDC(Change Data Capture)通过对事务日志的异步读取,记录DML操作的发生时间、类型和实际影响的数据变化,然后将这些数据记录到启用CDC时自动创建的表中。通过cdc相关的存储过程,可以获取详细的数据变化情况。由于数据变化是异步读取的,因此对整体性能的影响不大,远小于通过Trigger实现的数据变化记录。
因此在触发器较多的情况下,可以用CDC来替换触发器以提高数据库性能!
下面我用一个实例讲解这个功能。该功能主要在ETL解决方案中比较有用。
USE AdventureWorksDW;
GO
EXECUTE sys.sp_cdc_enable_db; --启用数据库对CDC的支持
GO
EXEC sys.sp_cdc_enable_table 'dbo',
'FactInternetSales', @role_name = NULL, @supports_net_changes =0; --启用某个表对CDC的支持GO
--这里的supports_net_changes指的是是否支持所谓的净更改,即过滤掉重复的
SELECT name, is_tracked_by_cdc FROM sys.tables
WHERE name LIKE ('fact%');
INSERT INTO FactInternetSales
VALUES(484,1127,1139,1134,18759,1,100,6,'SO75124',1,1,1,21.9800,21.9800,0,0,8.2205,8.2205,21.9800,1.7584,0.5495,NULL,NULL);
INSERT INTO FactInternetSales
VALUES(486,1127,1139,1134,18759,1,100,6,'SO75125',1,1,1,21.9800,21.9800,0,0,8.2205,8.2205,21.9800,1.7584,0.5495,NULL,NULL);
UPDATE FactInternetSales
SET PromotionKey = 2
WHERE SalesOrderNumber = 'SO75124';
DELETE FROM FactInternetSales WHERE SalesOrderNumber='SO75125'
SELECT * FROM cdc.dbo_FactInternetSales_CT; --这个表其实是在系统表里面
--这里将看到4条结果,其中operation为3和4是update操作的那条,3表示旧值,4表示新值
--2表示新增
--1表示删除
DECLARE @begin_time datetime, @end_time datetime, @from_lsn binary(10), @to_lsn binary(10);
-- Obtain the beginning of the time interval.
SET @begin_time = GETDATE()-1;
SET @end_time = GETDATE();
-- Map the time interval to a change data capture query range.
SELECT @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);
SELECT @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);
print @begin_time
print @end_time
print @from_lsn
print @to_lsn
--创建一个存储过程,根据开始时间和结束时间读取变更记录
CREATE PROC GetCDCResult
(@begin_time DATETIME,@end_time DATETIME)
AS
DECLARE @from_lsn binary(10), @to_lsn binary(10);
SELECT @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);
SELECT @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);
SELECT * FROM cdc.dbo_FactInternetSales_CT WHERE __$start_lsn BETWEEN @from_lsn AND @to_lsn
--调用该存储过程
EXEC GetCDCResult '2009-4-27','2009-4-29'
--撤销CDC
EXEC sys.sp_cdc_disable_table 'dbo',
'FactInternetSales','All'
EXEC sys.sp_cdc_disable_db
有朋友可能会问到:CDC到底是怎么做到的呢?
下面这篇文章很详细地讲解到了该原理
http://technet.microsoft.com/zh-cn/library/cc645937.aspx
1. 其实,它是有一个独立的进程的。它是异步地读取日志文件。如果某部分更改没有被进程读到,那么此时日志截断也是没有效果的,很显然需要这样来保证。
2. net_changes是什么意思呢?说的是针对一行记录,如果有多个更改的话,那么以最后的一条为准。
3. 这个更改是不是会永远保存?不会的,它会定期清除的
捕获和清除作业都是使用默认参数创建的。将立即启动捕获作业。它连续运行,每个扫描周期最多可处理 1000 个事务,并在两个周期之间停顿 5 秒钟。清除作业在每天凌晨 2 点运行一次。它将更改表项保留三天(4320 分钟),可使用单个删除语句最多删除 5000 项。
4. 如果启用了之后,修改了表的结构,会怎么样?
为适应固定列结构更改表,在为源表启用变更数据捕获后,负责填充更改表的捕获进程将忽略未指定进行捕获的任何新列。如果删除了某个跟踪的列,则会为在后续更改项中为该列提供 Null 值。但是,如果现有列更改了其数据类型,则会将更改传播到更改表,以确保捕获机制没有导致跟踪的列发生数据丢失。捕获进程还会将检测的跟踪表列结构的任何更改发送到 cdc.ddl_history 表。如果使用者希望得到下游应用程序中可能需要进行的调整的通知,请使用 sys.sp_cdc_get_ddl_history 存储过程。
from:http://www.cnblogs.com/chenxizhang/archive/2009/04/28/1445297.html
相关文章推荐
- SQL Server 2008 的CDC功能
- 在SQL Server2008中使用数据更新捕捉功能-Using Change Data Capture (CDC) in SQL Server 2008
- SQL Server 2008 的CDC功能
- SQL Server 2008数据库中CDC的功能使用及说明
- SQL Server 2008中的CDC(Change Data Capture)功能使用及释疑
- 使用SQLServer 2008的CDC功能实现数据变更捕获
- 安装VS2010 SP1后SQL Server 2008 r2智能感知功能(IntelliSense)失效!
- SQL Server 2008新功能──传递表值参数
- 安装VS2010 SP1后SQL Server 2008 r2智能感知功能(IntelliSense)失效的一个解决方案
- FW: Introduction to Change Data Capture (CDC) in SQL Server 2008
- SQL SERVER 2008中启用相应的功能
- SQL Server 2008 T-SQL 新增语法功能
- 使用SQL Server 2008的事务日志传送功能备份数据库
- 在 SQL Server 2005/2008 中,使用 Gmail 帐号配置数据库邮件功能
- SQL Server 2008 表复制功能
- [MSSQL]SQL Server 2008 通过配置数据库邮件实现发送邮件功能
- SQL Server 2008 通过配置数据库邮件实现发送邮件功能(转)
- SQL Server 2008 的代码提示功能
- SQL Server 2008 R2数据管理全新亮相:安全性的增强功能
- SQL Server 2008中新增的变更数据捕获(CDC)和更改跟踪