--===============================================
对复制一直属于一知半解浑浑噩噩的状态,仅知道一些皮毛,对很多细节没有深入学习过,
如果不对之处,请各位大神批评指正。
*以下讨论的基于事务复制,不考虑同步存储过程的情况
--===============================================
当发布数据库上发生数据修改(增删改)时,会将相关操作写入日志,以保证数据一致性,而对发布表上聚集索引的修改的日志会被标记为‘REPLICATE’。
(PS:从上图中不难看出,在checkpoint时会记录复制相关的信息)
标记为‘REPLICATE’的日志会被日志读取代理器读取,转换成复制事务和命令,然后写入到分发库中的表dbo.MSrepl_transactions和dbo.MSrepl_commands。
为保证订阅服务器上的数据一致性,日志读取代理默认情况下不会将发布数据库中的事务拆分成多个事务存放到分发数据库(可以修改日志读取代理中的MaxCmdsInTran默认值来拆分大事务)
针对事务中修改的每一行数据生成一条或多条复制命令,尤其是对varchar(max)+xml+text等大字段操作(再次感谢肖磊)。
--=====================================
--插入一条数据,生成16条复制命令
INSERT INTO [TestDemo].[dbo].[TB5](C1,C2)
SELECT REPLICATE('AC',10000),1
--查看生成的复制事务和命令
SELECT * FROM dbo.MSrepl_transactions
SELECT * FROM dbo.MSrepl_commands T
WHERE T.xact_seqno=0x00000100000002BA0020
默认日志读取代理配置中,日志读取代理会以间隔5秒的频率查询发布库日志(PollingInterval),每个处理周期从发布数据库的事务日志中读取至多500条事务。当发布服务器上运行大事务时,会导致单个处理周期读取过多事务日志,因此应尽量避免对发布库做大事务修改(PS:大事务对订阅数据库也会造成影响)
PS:设置代理参数ReadBatchThreshold来控制单个处理周期读取最大的命令数(我没在生产服务器上设置过,但发现一片关于这个设置的文章:http://connect.microsoft.com/SQLServer/feedback/details/478792/using-the-readbatchthreshold-parameter-in-logreader-agent-leads-to-slow-performance)
如果发布数据库上事务变更比较频繁时,可以修改PollingInterval参数的值来降低复制延迟(Paddy_张充在生产服务器上配置过)。过小的PollingInterval值会加重发布服务器负载。
当发布数据库上的事务日志被日志读取代理读取后,日志便可以由checkpoint或日志备份截断。
对于复制事务和复制命令,分发代理按照配置参数CommitBatchSize(默认100)和CommitBatchThreshold(默认1000)来将事务打包成一个bacth提交给订阅服务器(肖磊如是说:同时指定CommitBatchSize和CommitBatchThreshold时,也会出现不到命令数和事务数就提交给订阅服务器),分发代理作业按照指定的调度运行。
在分发服务器上,复制清理作业默认按照每10分钟一次的频率执行,查找移除那些无需保留的事务和命令。复制事务和复制命令会按照分发服务器属性设置中指定“事务保持期”来存放,当超过最大事务保持期后,复制事务和复制命令会被清除,未同步的订阅会被标记为“过期”。
如果创建发布时未选择“立即初始化”(发布属性immediate_sync为false)时,复制事务和复制命令已传递给所有订阅,且存放时间超过最小“事务保持期”,复制事务和复制命令便可以被复制清理作业删除。(PS:清理作业不会清楚最后一条事务事务及其相关命令)
--===================================================================
MSDN 快速通道
链接:http://msdn.microsoft.com/zh-cn/library/bb522755.aspx
=====================================================================
日志读取器代理相关配置
MaxCmdsInTran:number_of_commands
默认值:0
指定在日志读取器将命令写入到分发数据库时可分组到一个事务中的语句的最大数目。 如果使用此参数,在发布服务器上的大事务(包含许多命令)应用于订阅服务器时,日志读取器代理和分发代理可将这些大事务拆分为若干个较小的事务。 指定此参数可以减少分发服务器的争用问题并缩短发布服务器与订阅服务器之间的滞后时间。 由于初始事务是以较小的单元应用的,订阅服务器可以在初始事务结束之前访问一个较大的逻辑发布服务器事务的行,因而会破坏事务的原子性。 默认值为 0,这将保持发布服务器的事务边界。
PollingInterval: polling_interval
默认配置值:5秒
对日志进行已复制事务查询的频率(以秒计)。
ReadBatchSize:number_of_transactions
默认值:500
每个处理周期从发布数据库的事务日志中读取的最大事务数目。代理不断读取批次中的事务,直到从该日志中读取所有事务为止。 Oracle 发布服务器不支持该参数。
ReadBatchThreshold:number_of_commands
默认值:0
在复制命令由分发代理发送给订阅服务器之前,从事务日志读取的复制命令的数目。 如果未指定此参数,日志读取器代理会一直读取完此日志,或者读取到 -ReadBatchSize 中指定的数字(事务数)为止。
==============================================================
分发复制代理相关配置
BcpBatchSize:bcp_batch_size
默认值:2147473647
在一次大容量复制操作中发送的行数。 执行 bcp in 操作时,批的大小为要作为一个事务发送到服务器的行数,并且也是分发代理记录 bcp 进度消息之前必须发送的行数。 当执行 bcp out 操作时,将使用固定批大小 1000。
CommitBatchSize:commit_batch_size
默认值:100
发出 COMMIT 语句前要发给订阅服务器的事务数。
CommitBatchThreshold:commit_batch_threshold
默认值:1000
发出 COMMIT 语句前要发给订阅服务器的复制命令数。
MaxBcpThreads:number_of_threads
默认值:处理器数目的 2 倍,最大值为 8。
指定可以并行执行的大容量复制操作的数量。 同时存在的线程和 ODBC 连接的最大数量为 MaxBcpThreads 或显示在分发数据库中同步事务中的大容量复制请求数中较小的那一个。 MaxBcpThreads 的值必须大于 0,并且不存在任何硬编码的上限。 应用于使用并发快照选项在发布服务器上生成的快照时,不管为 MaxBcpThreads 指定了什么数值,都将使用一个线程。
MaxDeliveredTransactions:number_of_transactions
默认值:0
一次同步期间应用于订阅服务器的推送事务或请求事务的最大数量。 值为 0,表示最大值为无穷多个事务。 订阅服务器可使用其他值缩短从发布服务器请求的同步的持续时间。
如果MaxDeliveredTransactions设置为非0,即使订阅配置为连续运行,在传递指定数量的事务后,分发代理便会停止运行,需要重新手动启动。
PollingInterval:polling_interval
默认值:5 秒。
对分发数据库进行已复制事务查询的频率(以秒计)。
--=====================================================================
惯例依旧是妹子