文章目录
-
- 跟踪数据变化(SQL Server)
-
- 使用changedatacapture或changetracking常规方法(触发器) 时间戳列 额外表)的优点
- changedatacapture与changetracking不同之处:
- Change Data Capture
-
- change data capture数据流
- 理解cdc和capture instance
- change table(变更表)
- CDC时效
- 处理原表变化
- 捕获作业与事务复制日志读取之间的关系
- change data capture agent jobs
- 处理不同的排序规则
- 配置和管理
-
- 数据库级别启用或禁用changedatacapture(需要有sysadmin角色):
- 启用或禁或禁用changedatacapture(需要有sysadmin角色(启用库级cdc)或数据库db_owner角色(启用表级别cdc)):
- 管理和监控CDC
-
- capture job
-
- capture job参数
- cleanup job
- 监控cdc进程
- CDC数据类型限制:
- 使用变化数据
-
- 查询函数
- 使用场景查询函数
- 查询自上次更新以来的所有变更
-
- 直到目前的所有变化
- 提交时间集中在所有变更结果中
- change data capture与其他SQL Server特性
-
- change tracking
- 数据库镜像
- 事务复制
- 恢复或附加启用cdc的数据库
- contained database (数据库)
- cdc and always on
- Change Tracking
-
- 启用和禁用change tracking
-
- 库级别启用change tracking
- 表级别启用change tracking
- 禁止使用表级和库级change tracking
- 管理change tracking
-
- 目录视图
- 安全性
- change tracking的开销
-
- 对于DML的影响
- 对存储的影响
- 单向和双向复制应用
-
- 单向复制
- 双向复制
- change tracking工作原理
- 使用change tracking
-
- 使用change tracking函数获取数据变化
-
- 关于change tracking函数
- 获取初始数据
- 使用change tracking函数获取变化
- 版本号
- 确保可用版本号
- 使用列级跟踪
- 使用快照隔离
- change tracking清理
跟踪数据变化(SQL Server)
从2008开始,sqlserver在用户表的数据变化中提供两种跟踪数据库:changedatacapture和changetracking。changedatacapture和changetracking可同时在数据库中使用。
使用changedatacapture或changetracking常规方法(触发器) 时间戳列 额外表)的优点
- 节省开发时间;
- 原表无需修改;
- 有内置的数据变更信息清理机制;
- 提供函数捕获变化信息;
- 低开销;
- 基于已提交的事务;
- 标准工具可用于配置和管理;
changedatacapture与changetracking不同之处:
CDC是数据变化的异步捕获,changetracking同步捕获数据变化。[外链图片转存失败,源站可能有防盗链机制。建议保存图片并直接上传(img-c4kLue5B-1608688043488)(en-resource://database/5290:0)]
Change Data Capture
从sqlserver2008开始支持。
changedatacapture实际发生的捕获DML(insert,update,delete)数据。使用异步进程读取事务日志以获取变化。对系统影响不大。如下图所示,将用户表的更改记录在相应的变更表中(changetables)。变化表提供了一个基于时间变化的历史视图。[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-iTJHd7c2-1608688043491)(en-resource://database/5292:0)]
change data capture数据流
[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-qUNPEW2s-1608688043493)(en-resource://database/5400:1)] CDC读取事务日志中的变化。insert、update、delete所需信息已写入日志。
理解cdc和capture instance
在数据库中使用cdc在此之前,首先需要启用数据库级别cdc(使用sys.sp_cdc_enable_db);然后使用sys.sp_cdc_enable_table启用表级别cdc。
使用对表cdc,会创建相应的capture instance。capture instance由变更表(change table)和最多两查询函数组成。capture instance的相关信息在cdc.change_table,cdc.index_columns和cdc.captured_columns中记录。相关信息可通过sys.sp_cdc_help_change_data_capture查看。
capture instance相关的对象均存在cdc模式下。默认情况下,capture instance的命名为<schemaname_table_name>,相应的change表为其加后缀_CT;相应的查询函数为fn_cdc_get_all_changes_加capture instance名称。如果配置支持net changes,则会创建支持net_changes查询的函数,其命名为fn_cdc_get_net_changes_加capture instance名称。
cdc.fn_cdc_get_net_changes_dbo_VW_GHZDK:针对指定 LSN 范围内每个已更改的源行返回一个净更改行。也就是说,如果在 LSN 范围内源行具有多项更改,则该函数将返回反映该行最终内容的单一行
change table(变更表)
change table的前五列为元数据列。 change table中,insert和delete为单条数据,update为两条数据(前后各一条)。
change table中的列: _KaTeX parse error: Expected group after '_' at position 51: …e number(LSN); _̲seqval:对同一事务中的变更进行排序; _KaTeX parse error: Expected group after '_' at position 83: …(after image); _̲update_mask:是一个可变位掩码;对于insert和delete,为所有位;对于update,仅为涉及到变更的位;
CDC时效
默认,保留三天。 cdc相关事务信息放到cdc.lsn_time_mapping表中。
exec sys.sp_cdc_help_change_data_capture;
查询capture instance的当前最小LSN的函数:sys.fn_cdc_get_min_lsn;查看当前最大LSN的函数:sys.fn_cdc_get_max_lsn。
原表变化的处理
- 在启用cdc之后,表新加的列不捕获变化;
- 如果跟踪的列删除了,那么会补空值;
- 如果列数据类型变化了,那么相应的change table中也会变化;
- 可以使用过程sys.sp_cdc_get_ddl_history获取表DDL变更的通知;
注:对同一表,最多启用2个capture instance。
捕获作业与事务复制日志读取之间的关系
cdc的捕获进程逻辑写在过程sp_replcmds(为sqlserver.exe的一部分;同样也用于读取事务日志)中。
注:如果开启了CDC,若有变化未获取,则即使将恢复模式设置为simple,事务日志也不会截断。即使使用checkpoint也不可以。
change data capture agent jobs
有关cdc,有两个代理任务:
- 产生change tables;
- 清理change table中的数据;
capture job每个循环最多扫描1000个事务,循环间的间隔为5秒; 清理作业在每天的2点运行。保留change table中的数据3天,每个delete语句最多删除5000条数据。
cdc agent job可以使用以下过程添加和删除:
sys.sp_cdc_add_job
sys.sp_cdc_drop_job
更改cdc agent job的默认值的存储过程(需要重启job):
sys.sp_cdc_change_job
查看cdc agent job的当前默认值:
sys.sp_cdc_help_jobs
capture job和cleanup job在启动时从msdb.dbo.cdc_jobs表中读取参数配置。
重启cdc agent job:
sys.sp_cdc_start_job
sys.sp_cdc_stop_job
启用cdc的数据库,其数据库服务或agent service不可以运行在network service账户下,否则会报22832错误。
不同排序规则的处理
如果数据库与表列的排序规则不同,则cdc可能会使用,可以通过为列使用nvarchar或nchar来解决这个问题。
配置和管理
数据库级别启用或禁用change data capture(需要有sysadmin角色):
在为表级别启用cdc之前,必须先为数据库启用cdc(需要sysadmin角色)。使用sys.sp_cdc_enable_db启用数据库级别的cdc,使用sys.database表的is_cdc_enabled列来判断数据库是否启用了cdc。
如果数据库中已经存在了cdc用户或模式,则无法启用cdc。
禁用数据库级别的cdc之前无需禁用表级别cdc。库级别禁用cdc会删除cdc相关的元数据、包含cdc用户和架构及cdc job。
如果删掉了启用cdc的数据库,则相应的cdc job也会自动删除。
--库级别启用CDC(需要有sysadmin角色):
-- ================================
-- Enable Database for CDC Template
-- ================================
USE <Database_Name,sysname,Database_Name>
GO
EXEC sys.sp_cdc_enable_db
GO
--创建成功后,将自动添加CDC用户和CDC架构。
--查看库级别CDC是否启用:
SELECT IS_CDC_ENABLED,CASE WHEN IS_CDC_ENABLED = 0 THEN 'CDC功能禁用'
ELSE 'CDC功能启用' END 描述 FROM sys.databases WHERE NAME = 'test';
--库级别禁用CDC
-- =================================
-- Disable Database for CDC Template
-- =================================
USE <Database_Name,sysname,Database_Name>
GO
EXEC sys.sp_cdc_disable_db
GO
表级别启用或禁用change data capture(需要有sysadmin角色(启用库级别cdc)或者数据库的db_owner角色(启用表级别cdc)):
使用sys.sp_cdc_enable_table启用表级别cdc,查看表sys.table的列is_tracked_by_cdc查看表是否启用cdc。
在创阿金capture instance的时候可以指定如下选项:
- 捕获的表列;默认为全列,可以使用@captured_column_list指定需要捕获的列的列表;
- change table所在的文件组;默认,change table放在数据库的默认文件组中。可以使用@filegroup_name参数指定文件组,但指定的文件组必须已经存在。建议change table放到与原表不同的文件组中。
-- ===================================================
-- Enable a Table Specifying Filegroup Option Template
-- ===================================================
USE <Database_Name,sysname,Database_Name>
GO
EXEC sys.sp_cdc_enable_table
@source_schema = N'<source_schema,sysname,source_schema>',
@source_name = N'<source_name,sysname,source_name>',
@role_name = N'<role_name,sysname,role_name>',
@filegroup_name = N'<filegroup_name,sysname,filegroup_name>',
@supports_net_changes = 1
GO
- 控制访问change table的角色;可以是一个存在的服务角色或数据库角色,如果指定的角色不存在,则会自动创建数据库角色。sysadmin或db_owner的用户可以访问change table,其他用户必须具有原表所有列的select权限才可以访问change table。另外,如果指定了角色,那么肥sysadmin或db_owner的用户,必须为指定角色的一员。
如果不使用指定角色,则可以使用@role_name参数将其指定为NULL。
-- ===================================================
-- Enable a Table Without Using a Gating Role Template
-- ===================================================
USE <Database_Name,sysname,Database_Name>
GO
EXEC sys.sp_cdc_enable_table
@source_schema = N'<source_schema,sysname,source_schema>',
@source_name = N'<source_name,sysname,source_name>',
@role_name = NULL,
@supports_net_changes = 1
GO
- net change的查询函数 如果设置@supports_net_changes为1,则会为capture instance创建一个捕获net change的函数。 原表必须有主键或者能够唯一确定行的唯一索引,才可以启用net changes查询。如果使用的是唯一索引,则必须使用@index_name参数指定索引名称。主键列或唯一索引列必须在捕获的列的列表中。
-- ====================================================
-- Enable a Table for All and Net Changes Queries Template
-- ====================================================
USE <Database_Name,sysname,Database_Name>
GO
EXEC sys.sp_cdc_enable_table
@source_schema = N'<source_schema,sysname,source_schema>',
@source_name = N'<source_name,sysname,source_name>',
@role_name = N'<role_name,sysname,role_name>',
@supports_net_changes = 1
GO
注:如果在启用cdc之前,表中已有主键,则接下来,无法修改该表的主键(改变主键列,删除主键等),除非禁用cdc。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i9JIAtCW-1608688043495)(en-resource://database/5410:1)]
禁用cdc: db_owner权限的用户可以使用sys.sp_cdc_disable_table禁用表级别cdc。如果禁用了所有的表的cdc,则对应的capture jobs也会移除。
删除了一张表之后,相应的cdc元数据也会被删除。
--对表启用CDC:以HumanResources.Department为例
GO
EXEC sys.sp_cdc_enable_table
@source_schema='HumanResources',
@source_name = 'Department',
@role_name = NULL
--检查表HumanResources.Department是否开启CDC:
SELECT name , is_tracked_by_cdc , CASE WHEN is_tracked_by_cdc = 0 THEN
'CDC功能禁用' ELSE 'CDC功能启用' END 描述 FROM sys.tables WHERE OBJECT_ID=
OBJECT_ID('HumanResources.Department');
--返回所有表的变更捕获配置信息
EXECUTE sys.sp_cdc_help_change_data_capture;
GO
--表级别禁用CDC
USE testhvr;
GO
EXECUTE sys.sp_cdc_disable_table
@source_schema = 'dbo',
@source_name = 'test',
@capture_instance = 'all';
仅具有sysadmin和db_owner角色的用户可以管理cdc。
对原表有查询权限的用户才可以看该表的cdc信息。
对启用了CDC的表进行DDL操作(但不能truncate),用户需要有sysadmin角色,或数据库db_owner或db_ddladmin角色。
管理和监控CDC
capture job
capture job使用无参数存储过程sp_MScdc_capture_job进行初始化。
capture job参数
对日志的一次扫描中的最大事务数; 指定最大扫描次数。 控制sp_cdc_scan在读完日志或达到最大扫描次数之后停止(一次触发模式)。或者控制sp_cdc_scan持续运行直到显式的停止(持续模式)。
cleanup job
对于整库change table的清理策略,由一个cleanup job处理。
cleanup job由sp_mscdc_cleanup_job初始化。
使用sp_cdc_cleanup_change_tables清理change table中的数据。
监控cdc进程
两个监控cdc的动态视图: sys.dm_cdc_log_scan_sessions:表中除id为0 的行外,每行代表一个日志扫描会话。等价于执行sp_cdc_scan。
--查看空扫描的会话:
select * from sysy.dm_cdc_log_scan_sessions where empty_scan_count<>0;
--检查延迟:即表上事务提交的时间与change table中捕捉到提交事务时间之间的差值。
--延迟仅对活动会话有效,也就是在empty_scan_count列大于零的会话,延迟为0.
select latency from sys.dm_cdc_log_scan_sessions;
--查询吞吐量
select command_count/duration as [throughput] from sys.dm_cdc_log_scan_sessions;
sys.dm_cdc_errors
CDC中的数据类型限制:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8amVWKRo-1608688043499)(en-resource://database/5294:0)] 如果在同一数据库中启用了cdc和事务复制,事务日志中的变化会首先发送到分发数据库中,然后再写到cdc表中。如果分发有延迟,那么相应的,写到cdc也会有延迟。
使用变化数据
可通过TVF(table-valued functions)查看变化数据。该函数使用两个LSN来查询数据。
TVF中使用的LSN可以通过使用sys.fn_cdc_get_min_lsn查找cdc相关的capture instance的最小lsn;而sys.fn_cdc_get_max_lsn返回最大的。
还有两个对应lsn与时间的函数:sys.fn_cdc_map_time_to_lsn和sys.fn_cdc_map_lsn_to_time。
递增及递减lsn的函数:sys.fn_cdc_increment_lsn和sys.fn_cdc_decrement_lsn。
查询函数
取决于cdc的配置,会有一到两个TVF创建:
- cdc.fn_cdc_get_all_changes_<capture_instance>(必建);返回所有变化。基于行变更选项,update返回一行(行筛选选项“all”)或两行(“all update old”);
- cdc.fn_cdc_get_net_changes_<capture_instance>(当@supports_net_changes设为1)
sys.fn_cdc_get_column_ordinal返回列的序号;sys.fn_cdc_is_bit_set返回基于列的序号的对等位。
-- ==================================================
-- Enumerate Net Changes Using All With Mask Template
-- ==================================================
USE <Database_Name,sysname,Database_Name>
GO
DECLARE @from_lsn binary(10),
@to_lsn binary(10),
@column_ordinal int
SET @from_lsn =
sys.fn_cdc_get_min_lsn('<capture_instance,sysname,capture_instance>')
SET @to_lsn = sys.fn_cdc_get_max_lsn()
SET @column_ordinal = sys.fn_cdc_get_column_ordinal
(N'<capture_instance,sysname,capture_instance>',
N'<column_name,sysname,column_name>')
SELECT *,
sys.fn_cdc_is_bit_set(@column_ordinal, __$update_mask)
AS <column_name,sysname,column_name>_changed
FROM
cdc.fn_cdc_get_net_changes_<capture_instance,sysname,capture_instance>
(@from_lsn, @to_lsn, N'all with mask')
GO
示例:
DECLARE @capture_instance nvarchar(100),
@column_name nvarchar(100)
set @capture_instance='dbo_test'
set @column_name='name'
select sys.fn_cdc_get_column_ordinal(
@capture_instance,
@column_name);
查询函数使用场景
查询函数: cdc.fn_cdc_get_all_changes_<capture_instance>和 cdc.fn_cdc_get_net_changes_<capture_instance>。 使用sys.fn_cdc_get_min_lsn和sys.fn_cdc_get_man_lsn确定lsn区间,然后传递到查询函数的@from_lsn和@to_lsn。
-- ==================================================
-- Enumerate All Changes for the Valid Range Template
-- ==================================================
USE <Database_Name,sysname,Database_Name>
GO
DECLARE @from_lsn binary(10), @to_lsn binary(10)
SET @from_lsn =
sys.fn_cdc_get_min_lsn('<capture_instance,sysname,capture_instance>')
SET @to_lsn = sys.fn_cdc_get_max_lsn()
SELECT * FROM
cdc.fn_cdc_get_all_changes_<capture_instance,sysname,capture_instance>
(@from_lsn, @to_lsn, N'all')
GO
查询自上次更新以来的所有变更
使用sys.fn_cdc_increment_lsn作为新的下边界;使用sys.fn_cdc_get_max_lsn作为新的捕捉作业的上边界。
查询直到当前的所有变更
使用sys.fn_cdc_increment_lsn值传给@from_lsn作为下边界,在确保之前的变化均应用完成的情况下,使用sys.fn_cdc_map_time_to_lsn将当前时间转为lsn,并选取选项“largest less than or equal”。
-- ===========================================
-- Enumerate All Changes Up Until Now Template
-- ===========================================
USE <Database_Name,sysname,Database_Name>
GO
DECLARE @from_lsn binary(10),
@to_lsn binary(10),
@end_time datetime
SET @from_lsn =
sys.fn_cdc_get_min_lsn('<capture_instance,sysname,capture_instance>')
SET @end_time = GETDATE()
DELAY:
IF (sys.fn_cdc_map_lsn_to_time(sys.fn_cdc_get_max_lsn()) <=
@end_time)
BEGIN
WAITFOR DELAY '00:01:00'
GOTO DELAY
END
SET @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal',
@end_time)
SELECT * FROM
cdc.fn_cdc_get_all_changes_<capture_instance,sysname,capture_instance>
(@from_lsn, @to_lsn, N'all')
GO
在所有变更结果集中添加提交时间
数据库change table中每个事务相关的提交时间记录在表cdc.lsn_time_mapping中。可以使用change table中的_$start_lsn与cdc.lsn_time_mapping的start_lsn关联,获取相关信息。
-- ====================================================
---- Append Commit Time to All Changes Result Set Template
====================================================
USE <Database_Name,sysname,Database_Name>
GO
DECLARE @from_lsn binary(10), @to_lsn binary(10)
SET @from_lsn =
sys.fn_cdc_get_min_lsn('<capture_instance,sysname,capture_instance>')
SET @to_lsn = sys.fn_cdc_get_max_lsn()
SELECT q.*, m.tran_end_time AS COMMIT_TIME
FROM
cdc.fn_cdc_get_all_changes_<capture_instance,sysname,capture_instance>
(@from_lsn, @to_lsn, N'all') q
INNER JOIN cdc.lsn_time_mapping m
ON q.__$start_lsn = m.start_lsn
GO
提供了存储过程sys.sp_cdc_generate_wrapper_function以生成可以创建针对cdc查询的个性化包装函数的脚本。
change data capture与其他SQL Server特性
change tracking
cdc与ct可在同一数据库中并存。
数据库镜像
启用cdc的数据库也可以进行镜像。
事务复制
cdc和事务复制可以在同一库中并存。但对于change table的处理,当两者并存时,机制不同。cdc与事务复制使用相同的sp_replcmds读取事务日志中的变化。当启用cdc,SQL Server代理使用sp_replcmds;当启用cdc和事务复制时,Log Reader Agent调用sp_replcmds。
如果仅启用cdc,则capture job调用sp_replcmds;然后启用了事务复制,则会创建log reader agent,删除capture job;如果禁用了事务复制,则会删掉log reader agent,然后重新创建capture job。
当log reader agent同时用于事务复制和cdc时,捕捉到的变化会先写入到分发数据库,然后写到change table中,并一起提交。
恢复或附加一个启用cdc的数据库
SQL Server使用如下逻辑,决定一个数据库在恢复或附加之后是否仍保持启用cdc:
- 如果数据库恢复到相同服务器的相同数据库名,那么cdc保持启用;
- 如果数据库恢复到另一个服务器,那么默认cdc会禁用并且相关的元数据会删除;(如果需要保持cdc启用,在恢复时可使用KEEP_CDC选项)
- 如果数据库分离然后附加到相同或不同服务器,cdc保持启用;
- 如果数据库被附加或恢复到非企业版,并使用了KEEP_CDC选项,那么操作会卡住,因为cdc只有在企业版才可以使用。
contained database (包含的数据库)
cdc不支持contained database。
cdc and always on
当使用always on时,为减少主节点的磁盘负载,变更计算列举应在次节点进行。
Change Tracking
change tracking标记变化行,但是不捕获变化的数据。启用change tracking需要表具有主键。 change tracking可以解决一下问题:
- 用户表改变了哪些行;
- 只标记修改的数据,而不记录该数据修改了多少次等信息;
- 修改的最新数据可以从表中查看;
- 某一行数据是否改变了; *行改变及其相关信息,在同一个事务中记录下来;
启用和禁用change tracking
库级别启用change tracking
在使用change tracking之前,必须现在库级别启用它。
-- ====================================================
-- Alter database with modifyingt change tracking options template
-- ====================================================
USE db_name
GO
ALTER DATABASE <Database_Name,sysname,Database_Name> SET
CHANGE_TRACKING=ON
(
CHANGE_RETENTION = <Retention_Period,int,Retention_Period>
<Retention_Period_Units,int,Retention_Period_Units> ,
AUTO_CLEANUP = <Auto_Cleanup,bit,Auto_Cleanup>
)
GO
--====
示例
--====
ALTER DATABASE test SET CHANGE_TRACKING=on
(
CHANGE_RETENTION = 2 DAYS ,
AUTO_CLEANUP = ON
)
或者使用SQL Server Management Studio:数据库属性之后-> [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QzLNFEs7-1608688043515)(en-resource://database/5424:1)]
可以使用CHANGE_TRACKING_MIN_VALID_VERSION函数来检查两次同步之间的间隔是否太长(即是否有间隔之外的数据已经被清理掉)。
注意,启用change tracking的数据库:
- 必须设置兼容级别为90或以上。否则调用CHANGETABLE函数会报错;
- 使用快照隔离(snapshot isolation)是比对change tracking信息是否一致的最简单方式,所以建议开启快照隔离;
ALTER DATABASE DB_NAME
SET ALLOW_SNAPSHOT_ISOLATION ON
表级别启用change tracking
TRACK_COLUMNS_UPDATED默认设置为off。
--====================================================
-- Alter Table Enable Change Tracking template
-- This template enables the Change Tracking on Table with options
--====================================================
USE DB_NAME
GO
ALTER TABLE <schema_name, sysname, dbo>.<table_name, sysname,
table_name>
ENABLE CHANGE_TRACKING
WITH
(
TRACK_COLUMNS_UPDATED =
<track_columns_updated,bit,<track_columns_updated>
)
GO
---示例:
alter table dbo.test enable change_tracking with (track_columns_updated
= on);
表级别及库级别禁用change tracking
需要先在表级别禁用change tracking,然后才可以在库级别禁用change tracking。
--查看表级别是否启用change tracking:
select * from sys.change_tracking_tables;
--禁用表级别change tracking:
alter table tbl_name disable change_tracking;
然后可以禁用库级别change tracking:
--查看库级别是否启用change tracking:
select * from sys.change_tracking_databases;
--禁用库级别change tracking:
alter database db_name set change_trcking = off;
管理change tracking
目录视图
判断库或表是否启用change tracking:
- sys.change_tracking_databases
- sys.change_tracking_tables
- sys.internal_tables:列出启用change tracking所创建的内部表;
安全性
- 对于表的select权限(至少对主键);
- 该表的view change tracking权限;
change tracking的开销
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uZuB3ILB-1608688043518)(en-resource://database/5426:1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WZ85yyCa-1608688043523)(en-resource://database/5436:1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aFQsvuWg-1608688043526)(en-resource://database/5438:1)]
对于DML的影响
DML更改的每个行,都会记录到change tracking内部表中。对DML操作相关的影响有多方面,例如:
- 主键列的个数;
- 用户表中被改变的行的条数;
- 事务中的操作数;
如果配置了快照隔离,对DML也会有影响。
对于存储的影响
change tracking数据存在以下几种内部表中:
- 内部change table:每个启用change tracking的表都对应一个change table;
- 内部事务表:整库一个事务表;每个提交事务,都记录一条信息到事务表中。
可以使用sp_spaceused过程确认内部表的大小;可以使用sys.internal_tables查看有哪些内部表。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I022N9CN-1608688043528)(en-resource://database/5440:1)]
单向和双向复制应用
单向复制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2A5bAlfY-1608688043530)(en-resource://database/5420:1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EEjqoysF-1608688043532)(en-resource://database/5430:1)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XmfPbke8-1608688043534)(data:image/png;base64,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