标签:SQL SERVER/MSSQL SERVER/数据库/DBA/字段/对象更改

概述

变更数据捕获用于捕获应用到 SQL Server 表中的插入、更新和删除活动,并以易于使用的关系格式提供这些变更的详细信息。变更数据捕获所使用的更改表中包含镜像所跟踪源表列结构的列,同时还包含了解所发生的变更所需的元数据。

对表开启了变更捕获之后,对该表的所有DML和DDL操作都会被记录,有助于跟踪表的变化。

测试环境: SQL SERVER 2008 R2,案例库AdventureWorks2008R2

目录

配置变更数据捕获

启动数据库捕获

  1. --开启cdc
  2. USE [AdventureWorks2008R2]
  3. EXECUTE sys.sp_cdc_enable_db
  4. GO
  5. ---如果开启数据库捕获报错误:15517,使用下面的方法处理
  6. ALTER AUTHORIZATION ON DATABASE::[AdventureWorks2008R2] TO [sa]
  7.  
  8. ---查看是否设置成功,1代表开启cdc
  9. SELECT is_cdc_enabled FROM SYS.databases WHERE name='AdventureWorks2008R2'

设置跟踪表

为当前数据库中指定的源表启用变更数据捕获。对表启用变更数据捕获时,应用于此表的每个数据操纵语言 (DML) 操作的记录都将写入事务日志中。变更数据捕获进程将从日志中检索此信息,并将其写入可通过使用一组函数访问的更改表中。

格式:

  1. sys.sp_cdc_enable_table
  2. [ @source_schema = ] 'source_schema', ---表所属的架构名
  3. [ @source_name = ] 'source_name' ,----表名
  4. [ @role_name = ] 'role_name'---是用于控制更改数据访问的数据库角色的名称。
  5. [,[ @capture_instance = ] 'capture_instance' ]--是用于命名变更数据捕获对象的捕获实例的名称,这个名称在后面的存储过程和函数中需要经常用到。
  6. [,[ @supports_net_changes = ] supports_net_changes ]---指示是否对此捕获实例启用净更改查询支持如果此表有主键,或者有已使用 @index_name 参数进行标识的唯一索引,则此参数的默认值为 1。否则,此参数默认为 0
  7. [,[ @index_name = ] 'index_name' ]--用于唯一标识源表中的行的唯一索引的名称。index_name sysname,并且可以为 NULL。如果指定,则 index_name 必须是源表的唯一有效索引。如果指定 index_name,则标识的索引列优先于任何定义的主键列,就像表的唯一行标识符一样。
  8. [,[ @captured_column_list = ] 'captured_column_list' ]--需要对哪些列进行捕获。captured_column_list 的数据类型为 nvarchar(max),并且可以为 NULL。如果为 NULL,则所有列都将包括在更改表中。
  9. [,[ @filegroup_name = ] 'filegroup_name' ]--是要用于为捕获实例创建的更改表的文件组。
  10. [,[ @partition_switch = ] 'partition_switch' ]--指示是否可以对启用了变更数据捕获的表执行 ALTER TABLE SWITCH PARTITION 命令。allow_partition_switch bit,默认值为 1

注意:
对表启用变更数据捕获时,将生成一个更改表以及一个或两个查询函数。更改表充当捕获进程从事务日志中提取的源表更改的存储库。查询函数则用于从更改表中提取数据。这些函数的名称按以下方式派生自 capture_instance 参数:

所有更改函数: cdc.fn_cdc_get_all_changes_ < capture_instance >
净更改函数: cdc.fn_cdc_get_net_changes_ < capture_instance >

1.如果源表是数据库中第一个要启用变更数据捕获的表,并且数据库不存在事务发布,则 sys.sp_cdc_enable_table 还将为数据库创建捕获和清理作业。
它将 sys.tables 目录视图中的 is_tracked_by_cdc 列设置为 1。
2.对表启用变更数据捕获时,SQL Server 代理不必正在运行。但是,只有当 SQL Server 代理正在运行时,捕获进程才会处理事务日志并将条目写入更改表。

  1. USE AdventureWorks2008R2;
  2. GO
  3. EXEC sys.sp_cdc_enable_table
  4. @source_schema = N'HumanResources'
  5. , @source_name = N'Department'
  6. , @role_name = N'cdc_admin'--增加的角色
  7. , @capture_instance = N'HR_Department'--实例名
  8. , @supports_net_changes = 1
  9. , @index_name = N'AK_Department_Name'
  10. , @captured_column_list = N'Name, GroupName'--跟踪的字段
  11. , @filegroup_name = N'PRIMARY';
  12. GO
  13. ---查询表是否启动跟踪,值为1标示已启动
  14. SELECT is_tracked_by_cdc FROM SYS.tables WHERE name='Department'

数据库的变化

  •  增加的系统表

  • 增加的系统视图

  • 增加的系统存储过程

  • 增加的函数

 

  • 增加的用户与角色
 
  1. ---所有cdc有关的对象
  2. SELECT * FROM SYS.all_objects WHERE name LIKE '%CDC%'OR SCHEMA_ID IN(SELECT SCHEMA_ID FROM SYS.schemas WHERE name='CDC')
  3. ORDER BY TYPE
  4. SELECT * FROM msdb.SYS.objects WHERE name='cdc_jobs'

对象分析

插入测试数据

  1. ---查询插入数据之前表中的内容
    USE [AdventureWorks2008R2]
  2. SELECT * FROM [HumanResources].[Department]
  3.  
  4. --1.插入一条记录
  5. INSERT INTO [AdventureWorks2008R2].[HumanResources].[Department]([Name],[GroupName],[ModifiedDate])
  6. VALUES('TEST','TEST',GETDATE())
  7. GO
  8. --更新一条记录
  9. UPDATE [HumanResources].[Department]
  10. SET GroupName='TEST1'
  11. WHERE GroupName='TEST'
  12.  
  13. --增加一个字段
  14. ALTER TABLE [HumanResources].[Department]
  15. ADD Dcolumn INT

分析系统表

  1. SELECT * FROM cdc.ddl_history---与DDL有关的操作记录
  1. SELECT * FROM cdc.HR_Department_CT
  2. /*
  3. __$operation字段的值:
  4. 1 = 删除
  5. 2 = 插入
  6. 3 = 更新(旧值)
  7. 列数据中具有执行更新语句之前的行值。
  8. 4 = 更新(新值)
  9. 列数据中具有执行更新语句之后的行值。
  10. */
  1. 为每个在更改表中存在行的事务返回一行。该表用于在日志序列号 (LSN) 提交值和提交事务的时间之间建立映射。没有对应的更改表项的项也可以记录下来,以便表在变更活动少或者无变更活动期间将 LSN 处理的完成过程记录下来。
    SELECT * FROM cdc.lsn_time_mapping

分析存储过程

  1. ---查询当前作业配置
  2. SELECT * FROM MSDB.dbo.cdc_jobs
  3. --或者使用
  4. USE AdventureWorks2008R2;
  5. GO
  6. EXEC sys.sp_cdc_help_jobs;
  7. GO
  8. 1.sys.sp_cdc_add_job
  9. 在当前数据库中创建变更数据捕获清理或捕获作业
  10.  
  11. 1.创建捕获作业
  12. USE AdventureWorks2008R2;
  13. GO
  14. EXEC sys.sp_cdc_add_job
  15. @job_type = N'capture';
  16. GO
  17. 2.创建清理作业
  18. ---创建清理作业,作业连续运行,更改数据行将在更改表中保留2880分钟,清除时使用一条语句最多删除4000条记录
  19. USE AdventureWorks2008R2;
  20. GO
  21. EXEC sys.sp_cdc_add_job
  22. @job_type = N'cleanup'
  23. ,@start_job=1
  24. ,@retention=2880
  25. ,@threshold =4000
  26. 2.sys.sp_cdc_change_job
  27. 修改当前数据库中变更数据捕获清除或捕获作业的配置
  28. --仅在使用 sp_cdc_stop_job 停止作业并使用 sp_cdc_start_job 重新启动该作业后,对该作业所做的更改才会生效
  29.  
  30. 1.更改捕获作业
  31. --将每个循环扫描最多处理的事务数更改为200,为了从日志中提取所有行而要执行的最大扫描循环50
  32. USE AdventureWorks2008R2;
  33. GO
  34. EXECUTE sys.sp_cdc_change_job
  35. @job_type = N'capture',
  36. @maxtrans = 200,
  37. @maxscans = 50;
  38.  
  39. GO
  40. 2.更改清除作业,将记录保留时间更改为3440分钟
  41. USE AdventureWorks2008R2;
  42. GO
  43. EXECUTE sys.sp_cdc_change_job
  44. @job_type = N'cleanup',
  45. @retention = 3440;
  46. GO
  47. 3.sys.sp_cdc_cleanup_change_table
  48. 根据指定的 low_water_mark 值从当前数据库的更改表中删除行,重置更改表中的最小 __$start_lsn,并删除小于该值的数据.
  49. 将同时清除cdc.HR_Department_CT,cdc.lsn_time_mapping表的记录
  50.  
  51. USE AdventureWorks2008R2;
  52. GO
  53. EXEC sys.sp_cdc_cleanup_change_table
  54. @capture_instance =N'HR_Department',
  55. @low_water_mark=0x0000037D000000D30008,
  56. @threshold=2000;
  57.  
  58. SELECT sys.fn_cdc_increment_lsn(sys.fn_cdc_get_max_lsn())
  59. 4.sys.sp_cdc_drop_job
  60. msdb 中删除当前数据库的变更数据捕获清除或捕获作业。
  61.  
  62. --下例删除 AdventureWorks2008R2 数据库的清除作业和捕获作业
  63. USE AdventureWorks2008R2;
  64. GO
  65. EXEC sys.sp_cdc_drop_job @job_type = N'cleanup';
  66. USE AdventureWorks2008R2;
  67. GO
  68. EXEC sys.sp_cdc_drop_job @job_type = N'capture';
  69.  
  70. 5.sys.sp_cdc_disable_db
  71. 对当前数据库禁用变更数据捕获
  72.  
  73. 禁用当前对数据库中的所有表启用的变更数据捕获。与变更数据捕获相关的所有系统对象(如更改表、作业、存储过程和函数)都将被删除。sys.databases 目录视图中的数据库条目的 is_cdc_enabled 列设置为 0
  74. 如果在禁用变更数据捕获时为数据库定义了很多捕获实例,则长时间运行事务可能导致 sys.sp_cdc_disable_db 的执行失败。通过在运行 sys.sp_cdc_disable_db 之前使用 sys.sp_cdc_disable_table 禁用单个捕获实例,可以避免此问题。
  75. USE AdventureWorks2008R2;
  76. GO
  77. EXECUTE sys.sp_cdc_disable_db;
  78. GO
  79. 6.sys.sp_cdc_disable_table
  80. 对当前数据库中指定的源表和捕获实例禁用变更数据捕获
  81. 删除与指定的源表和捕获实例相关联的变更数据捕获更改表和系统函数。它会删除任何与来自变更数据捕获系统表的指定捕获实例相关联的行,并将 sys.tables 目录视图中的表项的 is_tracked_by_cdc 列设置为 0
  82.  
  83. ---下例对 HumanResources.Department 表禁用了变更数据捕获
  84. USE AdventureWorks2008R2;
  85. GO
  86. EXEC sys.sp_cdc_disable_table
  87. @source_schema = N'HumanResources'
  88. , @source_name = N'Department'
  89. , @capture_instance = N'HR_Department' ---这里是定义的实例名称,在一开始创建捕获的时候创建的,这里也可以制定ALL(禁用表HumanResources.Department的所有捕获),
  90.  
  91. 7.sys.sp_cdc_enable_db
  92. 对当前数据库启用变更数据捕获。必须先对数据库执行此过程,然后才能对该数据库中的任何表启用变更数据捕获。变更数据捕获可记录应用到所启用的表中的插入、更新和删除活动,同时采用易于使用的关系格式提供变更详细信息。此操作将为已修改的行捕获反映了所跟踪源表列结构的列信息,同时还捕获将更改应用到目标环境所需的元数据。
  93. 将创建以全数据库为作用域的变更数据捕获对象,包括元数据表和 DDL 触发器。它还会创建 cdc 架构和 cdc 数据库用户,并将 sys.databases 目录视图中的数据库条目的 is_cdc_enabled 列设置为 1
  94. USE AdventureWorks2008R2;
  95. GO
  96. EXECUTE sys.sp_cdc_enable_db;
  97. GO
  98.  
  99. 8.sys.sp_cdc_enable_table
  100. --对需要进行跟踪的表启动CDC,sys.sp_cdc_enable_table
  101. /*
  102. 为当前数据库中指定的源表启用变更数据捕获。对表启用变更数据捕获时,应用于此表的每个数据操纵语言 (DML) 操作的记录都将写入事务日志中。
  103. 变更数据捕获进程将从日志中检索此信息,并将其写入可通过使用一组函数访问的更改表中。
  104. */
  105. sys.sp_cdc_enable_table
  106. [ @source_schema = ] 'source_schema', ---表所属的架构名
  107. [ @source_name = ] 'source_name' ,----表名
  108. [ @role_name = ] 'role_name'---是用于控制更改数据访问的数据库角色的名称。
  109. [,[ @capture_instance = ] 'capture_instance' ]--是用于命名特定于实例的变更数据捕获对象的捕获实例的名称
  110. [,[ @supports_net_changes = ] supports_net_changes ]---指示是否对此捕获实例启用净更改查询支持
  111. [,[ @index_name = ] 'index_name' ]--用于唯一标识源表中的行的唯一索引的名称。index_name sysname,并且可以为 NULL。如果指定,则 index_name 必须是源表的唯一有效索引。如果指定 index_name,则标识的索引列优先于任何定义的主键列,就像表的唯一行标识符一样。
  112. [,[ @captured_column_list = ] 'captured_column_list' ]--需要对哪些列进行捕获。captured_column_list 的数据类型为 nvarchar(max),并且可以为 NULL。如果为 NULL,则所有列都将包括在更改表中。
  113. [,[ @filegroup_name = ] 'filegroup_name' ]--是要用于为捕获实例创建的更改表的文件组。
  114. [,[ @partition_switch = ] 'partition_switch' ]--指示是否可以对启用了变更数据捕获的表执行 ALTER TABLE SWITCH PARTITION 命令。allow_partition_switch bit,默认值为 1
  115.  
  116. 9.sp_cdc_generate_wrapper_function
  117. 生成用于为 SQL Server 中可用的变更数据捕获查询函数创建包装函数的脚本
  118. EXEC sys.sp_cdc_generate_wrapper_function
  119.  
  120. 10. sys.sp_cdc_help_change_data_capture
  121. 返回当前数据库中为变更数据捕获启用的每个表的变更数据捕获配置。最多可为每个源表返回两行,为每个捕获实例返回一行。
  122. ---返回制定表的捕获信息
  123. USE AdventureWorks2008R2;
  124. GO
  125. EXECUTE sys.sp_cdc_help_change_data_capture
  126. @source_schema = N'HumanResources', --架构名
  127. @source_name = N'Department';--表名
  128. GO
  129. --返回所有表的捕获信息
  130. USE AdventureWorks2008R2;
  131. GO
  132. EXECUTE sys.sp_cdc_help_change_data_capture
  133.  
  134. 11.sys.sp_cdc_get_captured_columns
  135. 返回指定捕获实例所跟踪的捕获源列的变更数据捕获元数据信息。
  136. USE AdventureWorks2008R2;
  137. GO
  138. EXECUTE sys.sp_cdc_get_captured_columns
  139. @capture_instance = N'HR_Department';
  140. GO
  141.  
  142. 12.sys.sp_cdc_get_ddl_history
  143. 返回自对指定的捕获实例启用变更数据捕获后与该捕获实例关联的数据定义语言 (DDL) 更改历史记录。
  144. 与查询表是一样的结果
  145. SELECT * FROM cdc.ddl_history
  146.  
  147. USE AdventureWorks2008R2;
  148. GO
  149. EXECUTE sys.sp_cdc_get_ddl_history
  150. @capture_instance = N'HR_Department';
  151.  
  152. 13.sp_cdc_help_jobs
  153. 报告关于当前数据库中所有变更数据捕获清除或捕获作业的信息。因为一个数据库只会在第一个表创建捕获的时候创建作业
  154. 所以这里只需要在当前库执行就可以。
  155. sys.sp_cdc_help_jobs
  156. USE AdventureWorks2008R2;
  157. GO
  158. EXEC sys.sp_cdc_help_jobs;
  159. GO
  160. 14.sp_cdc_scan
  161. 执行变更数据捕获日志扫描操作,需要进行捕获的时候使用,默认情况下5会自动进行捕获。
  162. 如果变更数据捕获正在使用 SQL Server 代理捕获作业,则 sys.sp_MScdc_capture_job 将内部调用 sys.sp_cdc_scan。如果变更数据捕获日志扫描操作已经处于活动状态,或数据库启用了事务复制,则无法显式执行此过程。此存储过程应当由需要自定义自动配置的捕获作业的行为的管理员使用。
  163. USE AdventureWorks2008R2;
  164. GO
  165. EXEC sp_cdc_scan
  166.  
  167. 15.sys.sp_cdc_start_job,
  168. 启动和停止当前数据库的变更数据捕获清除或捕获作业。
  169.  
  170. ---启动清除作业
  171. USE AdventureWorks2008R2;
  172. GO
  173. EXEC sys.sp_cdc_start_job @job_type = N'cleanup';
  174.  
  175. ---停止捕获作业
  176. USE AdventureWorks2008R2;
  177. GO
  178. EXEC sys.sp_cdc_stop_job @job_type = N'capture';
  179. GO
  180.  
  181. USE AdventureWorks2008R2;
  182. GO
  183. EXEC sys.sp_cdc_stop_job @job_type = N'cleanup';
  184. GO

分析函数

  1. 1.fn_cdc_get_all_changes_capture_instance
  2. 针对在指定日志序列号 (LSN) 范围内应用到源表的每项更改均返回一行
  3. USE AdventureWorks2008R2;
  4. GO
  5.  
  6. DECLARE @from_lsn binary(10), @to_lsn binary(10)
  7. SET @from_lsn =
  8. sys.fn_cdc_get_min_lsn('HR_Department')
  9. SET @to_lsn = sys.fn_cdc_get_max_lsn()
  10. SELECT * FROM cdc.fn_cdc_get_all_changes_HR_Department
  11. (@from_lsn, @to_lsn, N'all');
  12. GO
  13. 2.fn_cdc_get_net_changes_capture_instance
  14. 针对指定 LSN 范围内每个已更改的源行返回一个净更改行。也就是说,如果在 LSN 范围内源行具有多项更改,
  15. 则该函数将返回反映该行最终内容的单一行。例如,如果事务在源表中插入一行,并且 LSN 范围内的后续事务更新了该行中的一个或多个列,
  16. 则该函数将只返回一行,其中包含多个更新的列值。
  17. 如果值最后是删除操作,则不返回该LSN的值
  18. USE AdventureWorks2008R2;
  19. GO
  20. DECLARE @begin_time datetime, @end_time datetime, @from_lsn binary(10), @to_lsn binary(10);
  21. -- Obtain the beginning of the time interval.
  22. SET @begin_time = GETDATE() -1;
  23. -- DML statements to produce changes in the HumanResources.Department table.
  24. INSERT INTO HumanResources.Department (Name, GroupName)
  25. VALUES (N'MyDept', N'MyNewGroup');
  26.  
  27. UPDATE HumanResources.Department
  28. SET GroupName = N'Resource Control'
  29. WHERE GroupName = N'Inventory Management';
  30.  
  31. DELETE FROM HumanResources.Department
  32. WHERE Name = N'MyDept';
  33.  
  34. -- Obtain the end of the time interval.
  35. SET @end_time = GETDATE();
  36. -- Map the time interval to a change data capture query range.
  37. SET @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);
  38. SET @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);
  39.  
  40. -- Return the net changes occurring within the query window.
  41. SELECT * FROM cdc.fn_cdc_get_net_changes_HR_Department(@from_lsn, @to_lsn, 'all');
  42.  
  43. 3.sys.fn_cdc_decrement_lsn
  44. 根据指定的 LSN 返回序列中的上一个日志序列号 (LSN)
  45. Use AdventureWorks2008R2;
  46. GO
  47. SELECT sys.fn_cdc_decrement_lsn(sys.fn_cdc_get_max_lsn())
  48.  
  49. 下例在一个返回 LSN 值小于最大 LSN 值的更改数据行的查询中,使用 sys.fn_cdc_decrement_lsn 来设置 LSN 上限。
  50.  
  51. Use AdventureWorks2008R2;
  52. GO
  53. DECLARE @from_lsn binary(10), @to_lsn binary(10);
  54. SET @from_lsn = sys.fn_cdc_get_min_lsn('HR_Department');
  55. SET @to_lsn = sys.fn_cdc_decrement_lsn(sys.fn_cdc_get_max_lsn());
  56. SELECT * FROM cdc.fn_cdc_get_net_changes_HR_Department( @from_lsn, @to_lsn, 'all');
  57. GO
  58.  
  59. 4.sys.fn_cdc_increment_lsn
  60. 根据指定的 LSN 返回序列中的下一个日志序列号 (LSN)。
  61. 此函数返回的 LSN 值始终大于指定的值,并且不存在介于这两个值之间的 LSN 值。
  62. 若要系统地查询随时间变化的更改数据流,可以定期重复调用该查询函数,每次调用时指定一个新的查询间隔来限定查询中返回的更改的范围。为帮助确保不丢失数据,通常使用前一个查询的上限来生成后一个查询的下限。由于查询间隔是一个闭区间,因此新的下限必须大于前一个上限,但要足够小,以确保不存在 LSN 值介于此值与旧上限之间的更改。sys.fn_cdc_increment_lsn 函数就是用来获取此值的。
  63. Use AdventureWorks2008R2;
  64. GO
  65. SELECT sys.fn_cdc_increment_lsn(sys.fn_cdc_get_max_lsn())
  66.  
  67. 5.sys.fn_cdc_get_column_ordinal
  68. 返回实例制定列的列序号。
  69.  
  70. Use AdventureWorks2008R2;
  71. GO
  72. SELECT sys.fn_cdc_get_column_ordinal ( 'HR_Department','NAME');
  73.  
  74. 6.sys.fn_cdc_get_max_lsn
  75. 返回 cdc.lsn_time_mapping 系统表的 start_lsn 列中的最大日志序列号 (LSN)。您可以使用此函数为任何捕获实例返回变更数据捕获时间线的高端点
  76. USE AdventureWorks2008R2;
  77. GO
  78. SELECT sys.fn_cdc_get_max_lsn()AS max_lsn;
  79.  
  80. SELECT sys.fn_cdc_get_min_lsn(N'HR_Department');
  81.  
  82. USE AdventureWorks2008R2;
  83. GO
  84. DECLARE @from_lsn binary(10), @to_lsn binary(10);
  85. SET @from_lsn = sys.fn_cdc_get_min_lsn(N'HR_Department');
  86. SET @to_lsn = sys.fn_cdc_get_max_lsn();
  87. SELECT * FROM cdc.fn_cdc_get_net_changes_HR_Department(@from_lsn, @to_lsn, 'all');
  88. GO
  89.  
  90. 7.sys.fn_cdc_get_min_lsn
  91. USE AdventureWorks2008R2;
  92. GO
  93. SELECT sys.fn_cdc_get_min_lsn ('HR_Department')AS min_lsn;---查询制定的实例名的最小LSN
  94.  
  95. 8.sys.fn_cdc_has_column_changed ( 'capture_instance','column_name' , update_mask )
  96. 标识指定的更新掩码是否指示已更新关联的更改行中的指定列。
  97. USE AdventureWorks2008R2;
  98. GO
  99. SELECT sys.fn_cdc_has_column_changed ('HR_Department','name' , 2)
  100.  
  101. 9.sys.fn_cdc_is_bit_set
  102. 指示捕获的列是否已更新,采用的方法是检查是否在提供的位掩码内设置了其序号位置。
  103.  
  104. USE AdventureWorks2008R2;
  105. GO
  106. DECLARE @from_lsn binary(10), @to_lsn binary(10), @GroupNm_ordinal int;
  107. SET @from_lsn = sys.fn_cdc_get_min_lsn('HR_Department');
  108. SET @to_lsn = sys.fn_cdc_get_max_lsn();
  109. SET @GroupNm_ordinal = sys.fn_cdc_get_column_ordinal('HR_Department','GroupName');
  110. SELECT sys.fn_cdc_is_bit_set(@GroupNm_ordinal,__$update_mask) as 'IsGroupNmUpdated', *
  111. FROM cdc.fn_cdc_get_all_changes_HR_Department( @from_lsn, @to_lsn, 'all')
  112. WHERE __$operation = 4;
  113. GO
  114.  
  115. 10.sys.fn_cdc_map_lsn_to_time
  116. 为指定的日志序列号 (LSN) 返回 cdc.lsn_time_mapping 系统表的 tran_end_time 列中的日期和时间值。
  117. 您可以使用此函数系统地将 LSN 范围映射到更改表中的日期范围
  118. SELECT sys.fn_cdc_map_lsn_to_time(sys.fn_cdc_get_max_lsn());
  119.  
  120. 11.sys.fn_cdc_map_time_lsn
  121. 下面的示例使用 sys.fn_cdc_map_time_lsn 函数来确定在 cdc.lsn_time_mapping 表中是否有 tran_end_time
  122. 值大于或等于指定时间的行。例如,可以用此查询来确定捕获进程是否已处理完截至前指定时间提交的更改
  123. DECLARE @extraction_time datetime, @lsn binary(10);
  124. SET @extraction_time = GETDATE();
  125. SELECT @lsn = sys.fn_cdc_map_time_to_lsn ('smallest greater than or equal', @extraction_time);
  126. IF @lsn IS NOT NULL
  127. BEGIN
  128. print '...'
  129. END
  130.  
  131. DECLARE @begin_time datetime, @end_time datetime, @begin_lsn binary(10), @end_lsn binary(10);
  132. SET @begin_time = '2015-04-07 18:00:00.000';
  133. SET @end_time = '2015-04-08 18:00:00.000';
  134. SELECT @begin_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than', @begin_time);
  135. SELECT @end_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);
  136. SELECT * FROM cdc.fn_cdc_get_net_changes_HR_Department(@begin_lsn, @end_lsn, 'all ');

分析系统视图

  1. 1.sys.dm_cdc_log_scan_sessions
  2. 针对当前数据库中的每个日志扫描会话返回一行。返回的最后一行表示当前会话。您可以使用此视图返回有关当前日志扫描会话的状态信息,
  3. 或有关自 SQL Server 实例上次启动以来所有会话的聚合信息。
  4. USE AdventureWorks2008R2;
  5. SELECT *
  6. FROM sys.dm_cdc_log_scan_sessions
  7. --可以观察empty_scan_count字段的值可以发现它的变化,5秒增加一次,和前面配置的日志扫描作业的频率是一样的
  8. USE AdventureWorks2008R2;
  9. GO
  10. print getdate()
  11. SELECT empty_scan_count
  12. FROM sys.dm_cdc_log_scan_sessions
  13. WHERE session_id = (SELECT MAX(b.session_id) from sys.dm_cdc_log_scan_sessions AS b)
  14.  
  15. waitfor DELAY '00:01'
  16.  
  17. print getdate()
  18. SELECT empty_scan_count
  19. FROM sys.dm_cdc_log_scan_sessions
  20. WHERE session_id = (SELECT MAX(b.session_id) from sys.dm_cdc_log_scan_sessions AS b)
  21.  
  22. 2.sys.dm_cdc_errors
  23. 为变更数据捕获日志扫描会话中遇到的每个错误返回一行。
  24. USE AdventureWorks2008R2;
  25. GO
  26. SELECT *
  27. FROM sys.dm_cdc_errors

总结

捕获方法可以跟踪一个表对象的更改操作,但是开启了变更捕获对性能存在一定的影响,特别在日志读写这一块,首先它比正常的操作需要进行更多的日志写操作,而且日志的读操作也是很频繁的,有时候可能会引起日志等待类型,所以要慎重使用。

如果文章对大家有帮助,希望大家能给个推荐,谢谢!!!

备注:

作者:pursuer.chen

博客:http://www.cnblogs.com/chenmh

本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接,否则保留追究责任的权利。

《欢迎交流讨论》

SQL Server 变更数据捕获(CDC)的更多相关文章

  1. SQL Server 变更数据捕获(CDC)监控表数据

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现过程(Realization) 补充说明(Addon) 参考文献(References) ...

  2. SQL Server 2008中新增的 1.变更数据捕获(CDC) 和 2.更改跟踪

    概述 1.变更数据捕获(CDC)        每一次的数据操作都会记录下来 2.更改跟踪       只会记录最新一条记录   以上两种的区别:         http://blog.csdn.n ...

  3. SQL Server 2008中新增的变更数据捕获(CDC)和更改跟踪

    来源:http://www.cnblogs.com/downmoon/archive/2012/04/10/2439462.html  本文主要介绍SQL Server中记录数据变更的四个方法:触发器 ...

  4. CDC变更数据捕获

    CDC变更数据捕获 (2013-03-20 15:25:52)   分类: SQL SQL Server中记录数据变更的四个方法:触发器.Output子句.变更数据捕获(Change Data Cap ...

  5. SQL Server 2008中的CDC(Change Data Capture)功能使用及释疑

    SQL Server 2008中的CDC(Change Data Capture)功能使用及释疑 关键词:CDC   原文:http://www.cnblogs.com/chenxizhang/arc ...

  6. SqlServer 2014该日志未截断,因为其开始处的记录是挂起的复制操作或变更数据捕获

    环境:AlwaysOn集群 操作系统:Windows Server 2008 R2 数据库: SQL Server 2014 错误提示:“该日志未截断,因为其开始处的记录是挂起的复制操作或变更数据捕获 ...

  7. SQL Server 数据库开启日志CDC记录,导致SQL Server 数据库日志异常增大

    这几天单位的SQL Server业务数据生产库出现数据库日志增长迅速,导致最终数据无法写入数据库,业务系统提示"数据库事务日志已满",经过多方咨询和请教,终于将日志异常的数据库处理 ...

  8. SQL Server 迁移数据到MySQL

    一.背景 由于项目开始时候使用的数据库是SQL Server,后来把存储的数据库调整为MySQL,所以需要把SQL Server的数据转移到MySQL:由于涉及的表比较多,所以想在MySQL中生成对应 ...

  9. 在SQL Server中将数据导出为XML和Json

        有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做 ...

随机推荐

  1. python 学习第三天

    一,Python的数据结构-集合 1,集合的定义 Python中集合是以{}括起来的,例如x=set({1,2,3,4,5}),这就是一个集合,集合的特点有:(1),去重的(2),无序的,集合的作用用 ...

  2. android中接口和抽象类的区别

    最近发现很多基础有点生疏了,特地写一点博客来巩固一下.今天主要来谈谈接口和抽象类的区别,我们在项目的很多地方都会用到接口或者抽象类,但是它们之间的一些区别和相同点不知道大家有没有注意到,还有就是,什么 ...

  3. Node.js之创建应用

    1.使用Node.js时,不仅仅在实现一个应用,同时实现了整个HTTP服务器: 2.Node.js由下列几部分组成: (1)引入required模块:我们可以使用require指令来载入Node.js ...

  4. 调用0A中断输入字符串数据段的DUP定义

    ;这是自动生成的代码模板 STACKS SEGMENT STACK ;堆栈段 DW DUP(?) ;注意这里只有128个字节 STACKS ENDS DATAS SEGMENT ;数据段 STRING ...

  5. 丢手帕问题即约瑟夫问题的PHP解法

    问题描述:n个人排成一圈.从某个人开始,依次报数,数到m的人被杀死.下一个人重新从1开始报数,数到m的人被杀死.直到剩下最后一个人. 解决思路:从数学角度去看,每一次报数决定谁去死是一个n.m的求余数 ...

  6. SOAPUI使用教程-MockService脚本概述

    虽然静态MockOperation和MockResponse模型可以给你一定的灵活性,更多的动态行为添加到您的服务让您更模拟复杂的服务功能是很有用的.例如,你可能想: 从请求到响应传输值,修改它们的值 ...

  7. 根据url下载图片

    如题:在我要动手写的时候才发现不搜索根本就是写不出来,究其原因还是因为基础不扎实,由于用的少已经没有能力写出了 首先需要获取url数据流,然后写进文件里即可,仅仅两步可惜我写不出来啊跟着搜来的内容写一 ...

  8. C++文件操作(fstream)

    C++ 通过以下几个类支持文件的输入输出: ofstream: 写操作(输出)的文件类 (由ostream引申而来) ifstream: 读操作(输入)的文件类(由istream引申而来) fstre ...

  9. android开发中使不同的listview同时联动

    在做一个Android程序时,需要在一个屏幕上显示两个不同的listview,开始用< linearlayout>包裹这两个listview在<ScrollView >设置时, ...

  10. Errors occurred during the build. Errors running builder 'JavaScript Validator' on project

    1.问题:Errors occurred during the build. Errors running builder 'JavaScript Validator' on project 2.解决 ...