SQL Server提高事务复制效率优化(一)总体概述
- 使用SSD磁盘,有钱的可以使用PCI-e卡,SSD做RAID10,所有节点部署在内网。
- 更改事务隔离级别为READ_COMMITTED_SNAPSHOT。说实话,SQL Server默认事务隔离级别是读已提交,但是没有多版本的概念,需要设置为READ_COMMITTED_SNAPSHOT才是我们理解上的读已提交。如果不设置这个,照样会读写互相阻塞。
- 在创建订阅之前,先将目标数据库的恢复模式改成简单,能够减少日志
- ALTER DATABASE [数据库名称] SET RECOVERY SIMPLE WITH NO_WAIT
2.发布、订阅设计:
- 仅发布需要的数据,对于将日志写入数据库而且还要同步复制的,DBA可直接拒绝。
- 表中存在大量非聚集索引,发布时可以不勾选复制非聚集索引选项。经过测试,虽然数据库引擎是在应用完快照最后创建索引的,但创建时间很长,有时甚至会出错。可以在后期手工建立。我们采用导出脚本方式,然后只保留非聚集索引的脚本在订阅库中建立。
- 如果资源允许,单独建立一个分发服务器。发布和分发服务器在一个服务器上会增加性能损耗,尤其是分发服务器下面有多个订阅服务器时。
- 分发库默认是distribution库,会有专门的作业对该库进行清理,名字就叫“分发清除:distribution”。但这个进程清除分发库的效率太低了,会导致分发库积累大量数据,需要修改运行间隔和每次清楚的数据量。详见之前的随笔:distribution库过大的问题
- 合理使用订阅方式,如果选择推送订阅,势必加大分发服务器的压力,但延迟低 ;如果选择请求订阅,代理服务是在订阅服务器上,减少了分发服务器压力,但延迟会增加。
- 快照代理的生成。对于生成几百GB数据库的快照,采用SSD盘可能在10分钟左右。但会造成很高的性能损耗,要在业务非高峰期生成快照。快照代理文件也要放在SSD盘上,如果资源允许,单独一个驱动盘也可以。
- 如果已经有备份了,那么可以通过备份直接来初始化订阅,省去了生成快照和应用快照的步骤。
- 新发布新的表对象,对于发布库很大的情况下重新初始化是不实际的,可以增量发布,详见sqlserver同步后在不重新初始化快照的情况下新增表
- 对于已发布的表有批处理更新,一种方法是将批量更新分成若干小批量执行,减小事务处理的数据量;另一种方法是通过存储过程执行更改,并将存储过程发布。推荐第一种
- 将项目分布在多个发不上,这样相当于变向的实现了多线程并行发布,当然也可以通过参数实现并行,下面会讲到
- 降低复制代理的详细级别,在初始测试、监视或调试期间除外。 减小分发代理或合并代理的 –HistoryVerboseLevel 参数和 –OutputVerboseLevel 参数。这样可以减少为跟踪代理历史记录和输出而插入的新行数。相反,具有相同状态的以前的历史记录消息将更新为新的历史记录信息。提高测试、监视和调试的详细级别,这样就可以获得有关代理活动的尽可能多的信息。在系统开销不是很大的情况下,建议使用默认值1,本身这点对性能消耗可以忽略。
- 增大快照代理的BcpBatchSize参数,-BcpBatch参数表示一个批事务的行数。
- 将快照代理的- MaxNetworkOptimization设置为1,减少将不必要的信息发送到订阅服务器上。
- 使用快照代理、分发代理的 –MaxBcpThreads 参数(指定的线程数不应超过计算机上的处理器数)。此参数指定创建和应用快照时可以并行执行的大容量复制操作的数目。
- 为分发代理使用 –SubscriptionStreams 参数。 –SubscriptionStreams 参数可以显著提高聚合复制吞吐量。它使到一台订阅服务器的多个连接可以并行应用批量更改,同时在使用单线程时保持多个事务特征的存在。如果有一个连接无法执行或提交,则所有连接将中止当前批处理,而且代理将用单独的流重试失败的批处理。在重试阶段完成之前,订阅服务器上会存在临时事务不一致。失败的批处理成功提交后,订阅服务器将恢复到事务一致状态。官方文档有这个参数,但增加这个参数报错。
- 增大分发代理的 -CommitBatchSize 和CommitBatchThreshold参数的值。 提交一组事务的开销是固定的;通过不经常提交大量事务,就可以将开销分散在大量数据上。但是,增大此参数的优势因应用更改的开销由其他因素(例如包含日志的最大磁盘 I/O)限制而降低。另外,需要考虑以下权衡问题:任何导致分发代理重新开始的失败必须回滚并重新应用大量事务。对于不可靠的网络,越小的值导致失败的几率越小,如果导致失败,将回滚并重新应用较少量事务。
- 增大日志读取器代理的 -ReadBatchSize 参数的值。-ReadBatchSize 表示日志读取器代理和分发代理支持事务读取和提交操作的批大小。批大小的默认值为 500 个事务。日志读取器代理从日志中读取特定数量的事务,而不管这些事务是否标记为复制。将大量事务写入发布数据库,而其中只有一小部分标记为复制时,则应使用 -ReadBatchSize 参数增加日志读取器代理的读取批大小。此参数不适用于 Oracle 发布服务器。
- 为日志读取器代理使用 –MaxCmdsInTran 参数。–MaxCmdsInTran 参数指定日志读取器向分发数据库写入命令时组成一个事务的语句的最大数量。使用此参数能够使日志读取器代理和分发代理在订阅服务器上应用命令时将发布服务器上的大事务(由许多命令组成)分成若干个较小的事务。指定此参数可以减少分发服务器的争用问题并缩短发布服务器与订阅服务器之间的滞后时间。由于初始事务是以较小的单元应用的,订阅服务器可以在初始事务结束之前访问一个较大的逻辑发布服务器事务的行,因而会破坏事务的原子性。默认值为 0,这将保持发布服务器的事务边界。官方文档有该参数,但实际设置里面没有。
- 减小日志读取器代理和分发代理的 -PollingInterval 参数的值。 -PollingInterval 参数指定为要复制的事务查询已发布数据库的事务日志的频率。默认值为 5 秒。如果减小此值,日志的轮询将更加频繁,这会使事务从发布数据库传递到分发数据库的滞后时间较低。但是,应该对较低滞后时间的需要和因频繁轮询导致的服务器上增加的负荷之间进行平衡。
SQL Server提高事务复制效率优化(一)总体概述的更多相关文章
- SQL Server提高事务复制效率优化(四)修改数据同步过程优化
1.原理 我说的数据修改同步过程指的是在快照生成完毕,分发代理将快照应用于订阅服务器完成订阅服务器初始化后,发布服务器后续的更改同步到订阅服务器过程,这也就是我们常常关注的延迟.此过程主要 ...
- SQL Server提高事务复制效率优化(二)快照初始化优化
测试数据表量1500w+,使用初始化默认的快照代理参数,复制的三个过程包括快照初始化,订阅初始化和数据修改复制,主要对快照代理.分发代理.日志读取代理分别作了参数优化,并给出优化前后的对照实验测试. ...
- SQL Server提高事务复制效率优化(三)订阅初始化优化
初始化订阅主要是由分发代理分发和应用快照代理之前生成的快照,所以优化的主体是分发代理. 1.初始化订阅 首先在本地创建一个订阅,发布服务器.分发服务器和订阅服务器都在同一台服务器上,仅为了测试生产环境 ...
- SQL Server 2000事务复制问题
2000现在用的估计不多了,把之前收集的一些复制问题整理发布出来.可能都是些很白很二的问题,但人总是由最初的无知不断成长●-● SQL Server 2000事务复制问题服务器A(发布) 服务器B(分 ...
- SQL Server提高并发查询效率
同事写了个程序用创建多个线程使用ado同时对同个数据库进行相同的查询,涉及2张数据表的联查.当线程数非常多的情况下,读取数据的效率就会变得很慢,例如50个线程同时查询大概3000条数据,查询完成后通过 ...
- Sql Server 2012 事务复制遇到的问题及解决方式
1.订阅服务器提示:作业失败.无法确定所有者 WIN-01Q6JB46CHV\Administrator(拥有作业XXX)是否有服务器访问权限(原因:无法获取有关 Windows NT 组/用户'WI ...
- SQL Server 2005同步复制
原文:SQL Server 2005同步复制 以下实现复制步骤(以快照复制为例) 运行平台SQL SERVER 2005 一.准备工作: 1.建立一个 WINDOWS 用户,设置为管理员权限,并设置密 ...
- SQL Server 之 事务与隔离级别实例讲解
SQL Server 之 事务与隔离级别实例讲解 SQL Server 实现了6个隔离级别来防止并发情况下,类似企图并发的访问或修改同一数据时问题的发生.本文将带你体验全部6个隔离级别.正如你接下来将 ...
- 通过SQL Server 2008数据库复制实现数据库同步备份
SQL Server 2008数据库复制是通过发布/订阅的机制进行多台服务器之间的数据同步,我们把它用于数据库的同步备份.这里的同步备份指的是备份服务器与主服务器进行 实时数据同步,正常情况下只使用主 ...
随机推荐
- polyfill之javascript函数的兼容写法——Array篇
1. Array.isArray(obj) if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype. ...
- [Maven] - Eclipse "maven compiler plugin" 冲突解决
刚安装最新的Maven 3.2.5,在eclipse中使用maven的Run As->Maven Install,总会提示: Failed to execute goal org.apache. ...
- iOS10 权限配置
升到iOS10之后,需要设置权限的有: 麦克风权限:Privacy - Microphone Usage Description 是否允许此App使用你的麦克风? 相机权限: Privacy - Ca ...
- MyBatis学习(三)、动态SQL语句
三.动态SQL语句 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Orac ...
- office2016与visio2016不能“并存”的问题分析
现象: 先安装了office2016专业增强版,再安装visio2016时出现提示 搜集了相关资料,可以通俗的理解为:已经安装了离线客户端版的office后,不能再安装在线版visio. 之后,将of ...
- C#中Validating和Validated事件
http://blog.sina.com.cn/s/blog_6116673a0100fpeo.html 待解读
- Spring 事务注解 错误问题
碰到个问题,在一个springmvc项目中,设置好事务,然后在service上添加@Transactional注解,只要一添加这个注解,该service就无法被spring创建成功, error cr ...
- Python 之 时间字符串、时间戳、时间差、任意时间字符串转换时间对象
1. 时间字符串 --> 时间戳 1) time 模块 timestring = '2016-12-21 10:22:56' print time.mktime(time.strptime(ti ...
- Linux disk_partition_dev_马士兵_note
一般装Linux会遇到的问题: 找不到硬件驱动 现在主流的一些硬件 不支持Linux驱动 尽量找主流的硬件,尽量找老一点的硬件 装系统: 1.记下 系统 ---->到时候要找驱动 2 ...
- [源码]ObjectIOStream 对象流 ByteArrayIOStream 数组流 内存流 ZipOutputStream 压缩流
1.对象流 import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File ...