--===============================================

对复制一直属于一知半解浑浑噩噩的状态,仅知道一些皮毛,对很多细节没有深入学习过,

如果不对之处,请各位大神批评指正。

*以下讨论的基于事务复制,不考虑同步存储过程的情况

--===============================================

当发布数据库上发生数据修改(增删改)时,会将相关操作写入日志,以保证数据一致性,而对发布表上聚集索引的修改的日志会被标记为‘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 秒。
对分发数据库进行已复制事务查询的频率(以秒计)。
--=====================================================================

惯例依旧是妹子

Replication--复制事务和复制命令的更多相关文章

  1. SQL Server ->> 高可用与灾难恢复(HADR)技术之 -- Transaction Replication(事务复制)

    复制类型: 1)事务型复制:通过复制事务日志到订阅点重做的方式,属于增量型复制: 2)合并型复制:通过触发器和元数据表追踪表数据改变,同样属于增量型复制: 3)快照型复制:通过创建数据库快照,并把快照 ...

  2. Replication:事务复制 Subscriber的主键列是只读的

    在使用Transactional Replication时,Subscriber 被认为是“Read-Only”的 , All data at the Subscriber is “read-only ...

  3. 第五篇 Replication:事务复制-How it works

    本篇文章是SQL Server Replication系列的第五篇,详细内容请参考原文. 这一系列包含SQL Server事务复制和合并复制的详细内容,从理解基本术语和设置复制的方法,到描述它是如何工 ...

  4. 第三篇 Replication:事务复制-发布服务器

    本篇文章是SQL Server Replication系列的第三篇,详细内容请参考原文. 发布服务器是所有复制数据的源头.每一个发布服务器上可以定义多个发布.每一个发布包含一组项目(项目在同一个数据库 ...

  5. 【译】第五篇 Replication:事务复制-How it works

    本篇文章是SQL Server Replication系列的第五篇,详细内容请参考原文. 这一系列包含SQL Server事务复制和合并复制的详细内容,从理解基本术语和设置复制的方法,到描述它是如何工 ...

  6. 【译】第三篇 Replication:事务复制-发布服务器

    本篇文章是SQL Server Replication系列的第三篇,详细内容请参考原文. 发布服务器是所有复制数据的源头.每一个发布服务器上可以定义多个发布.每一个发布包含一组项目(项目在同一个数据库 ...

  7. mariadb multi-source replication(mariadb多主复制)

    下文一起来看看mariadb multi-source replication(mariadb多主复制)例子,希望对各位有帮助.   mariadb multi-source replication( ...

  8. 【RDB】MariaDB 之事务、复制、集群

    目录 简介 安装启动 权限 事务 脏读.不可重复读.幻读 MVCC 复制 异步复制 半同步复制 GTID复制 集群(Galera) 配置 监控(Zabbix) 简介 环境: CentOS 7.4.17 ...

  9. MySQL 数据库事务与复制

    好久没有写技术文章了,因为一直在思考 「后端分布式」这个系列到底怎么写才合适. 最近基本想清楚了,「后端分布式」包括「分布式存储」和 「分布式计算」两大类. 结合实际工作中碰到的问题,以寻找答案的方式 ...

随机推荐

  1. 解决windows 下mysql 表名自动转成小写的问题

    由于web用的是mvc,数据库用的是mysql.为了方便开发,在windows7下面也安装了个mysql,今天在创建表的时候,遇到了个棘手的问题.所有的表名都转成了小写,这不是我要的,作为处女座,是不 ...

  2. 64位windows+32位JDK8+32位eclipse是可以的

  3. 85. Maximal Rectangle (Graph; Stack, DP)

    Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and ...

  4. Python调shell

    os.system(cmd) 函数返回cmd的结束状态码,阻塞调用. os.popen(cmd) 函数返回cmd的标准输出,阻塞调用. (status, output) = commands.gets ...

  5. UVa 10763 Foreign Exchange(map)

    Your non-profitorganization (iCORE - international Confederationof Revolver Enthusiasts) coordinates ...

  6. python 安装scikit!!!

    首先,吐槽一下,真的是折腾好几天,一会更新这个,一会更新那个,总是各种奇葩问题诸如此类: cannot import check-build pip有新版本,需要更新(黄字) 其中scipy出错最多, ...

  7. vmware搭建vSAN提示磁盘不合格或者看不到磁盘的解决办法

    1.如果磁盘不合格,或者在创建磁盘组的时候看不到该磁盘,一般的原因都是该磁盘有其他分区,可以使用下面的方法来解决 a.首先开启esxi主机的ssh功能 b.登陆到esxi的后台 c. ls /dev/ ...

  8. [leetcode]242. Valid Anagram验证变位词

    Given two strings s and t , write a function to determine if t is an anagram of s. Example 1: Input: ...

  9. 动态加载JS,并执行回调函数

    有些时候我们需要动态的加载一些JS,并在JS加载完成后执行一些回调函数. var loadscript = { $$: function (id) { return document.getEleme ...

  10. 移动端 输入框 如果类型是number,用户也可以输入汉字和字母

    <input type="number" id="input-age" placeholder="请输入你的年龄" /> //i ...