《Replication的犄角旮旯》系列导读

Replication的犄角旮旯(一)--变更订阅端表名的应用场景

Replication的犄角旮旯(二)--寻找订阅端丢失的记录

Replication的犄角旮旯(三)--聊聊@bitmap

Replication的犄角旮旯(四)--关于事务复制的监控

Replication的犄角旮旯(五)--关于复制identity列

Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)

Replication的犄角旮旯(七)-- 一个DDL引发的血案(下)(聊聊logreader的延迟)

Replication的犄角旮旯(八)-- 订阅与发布异构的问题

Replication的犄角旮旯(九)-- sp_setsubscriptionxactseqno,赋予订阅活力的工具

---------------------------------------华丽丽的分割线--------------------------------------------

前言:这是昨天刚刚发生的案例,尽管事件的起因只是一个简单的DDL操作,但影响面和影响时间可以说是大大超出了预期;我们将在描述本案例的前因后果之后,聊聊如何近似估算DDL的操作进度,以及关于logreader延迟的问题;

前一篇文章《Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)》

http://www.cnblogs.com/diabloxl/p/3844205.html

前因简述:

一个复制节点(即使上级的订阅,又是下级的分发)需要对一个表进行DDL操作,由于需要修改主键,因此将这个表从publication中删除,然后就开始了漫长的DDL操作……

本来需要进行DDL操作的表已经从replication中摘除了,以为不会影响到其他article的复制,结果惨剧还是发生了,原因依旧是VLF对logreader的影响,但这次的问题和以往又有些不同……

=====================华丽丽的分割线=====================

先说说之前遇到的logreader延迟的情况:

1、发布表的写操作

  这里又分为两种情况

  a)大量并发写操作:指大量的小DML操作,特点是事务小、并发多

  b)大事务写操作:指有单个大事务操作,特点是事务大、并发少

2、非发布表的写操作

  指有写操作的表并不是需要复制的表,这里将上述a\b两种情况合并在一起说,这次遇到的是b这个类型;

检查logreader的延迟的利器——sp_replcounters

MSDN上关于这个存储过程的解释:

http://msdn.microsoft.com/zh-cn/LIBRARY/ms190486

无论对于上述哪种情况,如果Replicated transactions持续增加,那就是logreader延迟了,初步的现象就是这个发布下所有的订阅都在延迟;

那上述3种情况的差异呢?

  对于1a)

  Replicated transactions快速增加,replbiginlsn和replnextlsn都会较慢速度的变化;(这里的慢速是相对与正常速度而言,受实际业务环境影响,下同)

  这是由于大量的小DML操作都会快速的提交,但由于大量的日志写入,导致存在大量的活动VLF,因而日志不能被截断;同时,尽管logreader根据replnextlsn去定位下一个要复制的lsn,但由于效率下降,且后面涌入的新事务也在增长,导致恶性循环,从而引起logreader的延迟;

  对于1b)

  Replicated transactions慢速增加,replbiginlsn不变、replnextlsn不变;

  虽然事务并发量很小,但由于单个提交的事务很大,仍然导致大量的活动VLF,从而引起logreader效率下降;

  对于2

  Replicated transactions快速增加,replbiginlsn不变、replnextlsn慢速变化;

  由于非复制的表也需要写日志,且占用了大量VLF,因此logreader需要从大量的VLF中获取需要复制的日志信息,这也同样影响到它的执行效率;

那我们该如何应对呢?

  硬件当然是最有效的手段之一,升级内存、磁盘换成IO卡等可以解决根本问题,但这又不是绝对,一个SQL跑死服务器的情况也绝非不可能;

  1、对于1a的情况,建议有频繁写操作的表,还是能分就分,或者分到多个库中,或者分到多个实例下,原则就是不要让logreader干太多活,毕竟的是个单线程的任务,穿少了也cool,喝多了也吐。

  2、对于1b的情况,本身单个大事务就不是OLTP环境中提倡的,不光是复制延迟,光一堆锁估计机器也受不了;建议拆成多个事务来跑;

  3、对于2来说,尽管要搞的表和复制没有任何关系,但不能忽略VLF对logreader的影响,既然在一个库中,公用日志序列,还是小心为妙;如果是大表的DDL的操作,还是通过停写、建新表、导数据的方法实现,bulk insert的方式或许是对日志影响最小的;

  但bulk insert的方式一般要求停写,而受业务的制约,可能不允许长时间的停写,这该怎么破?

  可以看看我之前的文章《Replication的犄角旮旯(一)--变更订阅端表名的应用场景》,复制回路可以说是为这种需求量身定做的~

Replication的犄角旮旯(七)-- 一个DDL引发的血案(下)(聊聊logreader的延迟)的更多相关文章

  1. Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)

    <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...

  2. 一个字母引发的血案 java.io.File中mkdir()和mkdirs()

    一个字母引发的血案 明天开始放年假了,临放假前有个爬虫的任务,其中需要把网络图片保存到本地,很简单,马上写完了代码: //省略部分代码... Long fileId= (Long) data.get( ...

  3. SQL实战——04. 查找所有已经分配部门的员工的last_name和first_name以及dept_no (一个逗号引发的血案)

    查找所有已经分配部门的员工的last_name和first_name以及dept_noCREATE TABLE `dept_emp` (`emp_no` int(11) NOT NULL,`dept_ ...

  4. 一个链接引发的血案---------服务器 IO及网络流量暴涨解决历程

    在这里介绍一次因为更改网站地址而引发服务器IO读取速度,网络流入流出速度暴涨10倍的解决经历. 环境:Ubuntu + Nginx + php-cgi + Wordpress 事情是这样的,现在网站使 ...

  5. 一个NULL引发的血案

    go sql.stmt query 发生了一个NULL值,所以发现了error, 发现服务不停的初始化sql stmt, 导致连接数过多,服务就变得很慢. 首先,我在初始化的之前,要判断这个是否是NU ...

  6. 【原创】经验分享:一个Content-Length引发的血案(almost....)

    前言 上周在工作中遇到一个问题,挺有意思,这里记录一下.上周在工作中遇到一个问题,挺有意思,这里记录一下.标题起的很唬人,这个问题差点引发血案,花哥还是很严谨的一个人,后面备注了almost.... ...

  7. String属于“假引用类型”,代码为证(一个String引发的血案...)

    一直以为String是引用类型,今天写了个浅拷贝的测试,发现String有基本类型的特征. class A{ public int a = 555; } class User implements C ...

  8. 一个JS引发的血案

    转载一篇大师傅的文章: 原文链接:http://xn--i2r.ml/index.php/2017/08/05/39.html 又到了周末,闲来无聊,挖挖补天 找了个目标,发现一个站 查看源码发现一个 ...

  9. Matlab一个错误引发的血案:??? Error using ==> str2num Requires string or character array input.

    Matlab总遇到一些神奇的问题,让人摸不着头脑.昨天编写程序的时候遇到一个让我十分火大的问题,也是自己的matlab基础不好吧. 先描述一下问题,再GUI界面有个listbox,Tag属性是’lis ...

随机推荐

  1. XtraGrid RepositoryItemCheckEdit 显示状态以及单选多选问题

    RepositoryItemCheckEdit默认有三种状态,选中状态.未选中状态和半选中状态(半选中状态通常用在TreeList中如果父节点下的子节点有选中的有未选中的,则父节点状态为半选中状态). ...

  2. Oracle Cursor

    1.概念 游标:从字面来理解就是游动的光标.用数据库语言来描述,游标是映射在结果集中一行数据上的位置实体,有了游标,用户就可以访问结果集中的任意一行数据了.将游标放置到某行后,即可对该行数据进行操作, ...

  3. 终端 git log 修改样式

    git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d ...

  4. python 入门学习之环境搭载

    1.常用python 2.7 需要在我的电脑环境变量进行环境搭载 2.用notepad++进行编辑器适配,选择python语言 在输入运行程序名里面输入cmd /k x: & cd " ...

  5. JSON的一点:

    目录一:把 JSON 文本转换为 JavaScript 对象二:JSON 实例 - 来自字符串的对象 一.把 JSON 文本转换为 JavaScript 对象JSON 最常见的用法之一,是从 web ...

  6. 对象的比较与排序:IComparable和IComparer接口

    IComparable和ICompare 接口是.net framework 中比较对象的标准方式,这两个接口提供一个返回值类似(大于0 等于0 小于0)的比较方法,二者区别如下: . ICompar ...

  7. MMS搜索功能修改

    高通平台的MMS源码中提供了搜索功能,但要先选择分类(名字,号码,信息内容,彩信主题),再输入字符,根据分类进行搜索. 而在Contacts中却不需要分类,直接根据输入字符搜索任意匹配字段.相比之下, ...

  8. php发展起源

    PHP原始为Personal Home Page的缩写,已经正式更名为 "PHP: Hypertext Preprocessor".注意不是“Hypertext Preproces ...

  9. adb devices 端口占用

    一. 1.通过cmd命令,输入adb devices查看连接设备时,报错 2 .通过adb nodaemon server  查看adb server绑定的端口.提示“通过每个套接字地址只能使用一次” ...

  10. kiosk-mode,免密码登陆, sideload Windows Store apps 等

    MVVM带来的性能问题及其解决方案  MVVM 和语言性能提示:https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/mt628050. ...