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

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

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

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

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

当发布数据库上发生数据修改(增删改)时,会将相关操作写入日志,以保证数据一致性,而对发布表上聚集索引的修改的日志会被标记为‘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. Matrix(二分套二分)

    Matrix http://poj.org/problem?id=3685 Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 8 ...

  2. sqlserver查询效率 (转)

    很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解.比如: select * from table1 where name='zhan ...

  3. UpdatePanel中弹出新窗口

    如果允许,在UpdatePanel中使用iframe即可,不允许的话,用下面的方法实现弹窗 要在UpdatePanel中使用FileUpload时,会遇到此问题,或者同类其它情况 <asp:Sc ...

  4. Broadcast总结 service

    有时候离开应用就会接收不到系统的广播是因为系统默认发送的广播都会有一个参数 ntent startIntent = new Intent();startIntent.putExtra("pk ...

  5. dede5.7 GBK 在php5.4环境下 后台编辑器无法显示文章内容

    问题的原因是:是htmlspecialchars,PHP 5.4后GBK编码下默认不支持中文,转换后内容为空,UTF-8编码没有任何问题.   解决方法如下: 在\include\ckeditor\c ...

  6. Linux ldconfig命令

    一.简介 ldconfig是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令--ldconfig. ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/u ...

  7. 抓取访客ip

    $realip = $_SERVER['REMOTE_ADDR'] $proxy_ip = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);//有用到代理 ...

  8. MySql 几个小技巧

    分页查看: 在 mysql 环境下,执行命令: pager more,之后的结果分屏了. 简明扼要地查看表结构: describe table_name

  9. js父子窗口传值以及当前页面在js前台如何获得url参数

    1.首先是父页面用window.open打开窗口 <%@ Page Language="C#" AutoEventWireup="true" CodeBe ...

  10. Tomcat的杂七杂八

    localhost_access_log.2016-01-15.txt  原来这里面有访问记录. /logs/catalina.2016-01-22.log 这里有显示失败的信息 2016-01-23 ...