Replication--复制延迟的诊断和解决
要解决复制延迟问题,需要首先定位复制延迟发生点,再找出复制延迟的原因,再做相应处理。
复制延迟发生点:
1. 发布服务器
2. 分发服务器
3. 订阅服务器
4. 发布服务器与分发服务器和分发服务器与订阅服务器之间的网络
延迟测试方式:
1. 使用复制token
参考:http://www.cnblogs.com/TeyGao/p/3521130.html
2. 使用复制存储过程sp_replmonitorhelpXXX
--==========================================================
--参考:http://msdn.microsoft.com/zh-cn/library/ms188073.aspx
--返回发布服务器上属于一个或多个发布的订阅的当前状态信息,
--并为每个返回的订阅返回一行。 在分发服务器上对分发数据库
--执行此存储过程,用于监视复制。 --@publication_type=0:事务发布
--@mode=3:只返回带错误或已生成在达到阈值度量指标时发出的警告的订阅。
EXEC distribution.dbo.sp_replmonitorhelpsubscription
@publisher = null,
@publisher_db = null,
@publication = null,
@publication_type =0,
@mode = 3,
@topnum = 0,
@exclude_anonymous = null,
@refreshpolicy = 0 --===========================================================
--参考:http://msdn.microsoft.com/zh-cn/library/ms186304.aspx
--返回发布服务器上一个或多个发布的当前状态信息。 在分发服务器
--的分发数据库上执行此存储过程,用于监视复制。 --@publication_type=0:事务发布
EXEC distribution.dbo.sp_replmonitorhelppublication
@publisher = null,
@publisher_db = null,
@publication = null,
@publication_type = 1,
@refreshpolicy =0
--==============================================================
3. 使用sp_replcounters
--================================================
--为每个发布数据库返回有关滞后时间、吞吐量和事务计
--数的复制统计信息。 此存储过程在发布服务器的任何数
--据库中执行。
--参考:http://msdn.microsoft.com/zh-cn/library/ms190486.aspx exec sp_replcounters
--================================================
延迟诊断顺序:
1. 如果只有一个订阅延迟,优先检查该订阅服务器
2. 如果有多个订阅延迟,优先检查发布服务器和分发服务器
--==================================================================
发布服务器上延迟分析
原因1: 镜像或ALWAYS ON 阻塞了复制
诊断方式:使用镜像监视器或相关存储过程查看镜像同步情况
处理建议:
建议A:等待镜像同步完成或取消镜像,
建议B:使用TRACE FLAG 1448(慎用)
原因2:磁盘IO存在压力
诊断方式:使用性能计数器查看日志所在磁盘的磁盘队列
处理建议:
建议A:提升日志所在磁盘的性能或将日志文件放于独享磁盘上
原因3:虚拟日志文件数量过多
诊断方式: 使用DBCC LOGINFO来查看虚拟日志数量
处理建议:
建议A: 虚拟日志文件数量应保持一个合理的数量(数量过少和过多都会出现问题)
原因4:数据库事务日志过多,而复制相关日志较少
诊断方式:
--==========================================================
--查看是否因为发布库日志太多导致日志读取慢
Use <published database>
GO
-- Total records in the log
SELECT count(*) FROM ::fn_dblog(NULL, NULL)
GO
-- Records marked for REPLICATION
SELECT count(*) FROM ::fn_dblog(NULL, NULL)
WHERE Description='REPLICATE'
GO
处理建议:
建议A: 设置合理的索引维护及其他会导致大量日志写入操作的运行时间
建议B: 业务拆分,将与复制不相关的业务拆分出去
原因5:复制发布article上有较大事务运行
诊断方式:
--========================================================
--使用发布库日志来查找大事务
--在发布库上运行
SELECT [Transaction ID],COUNT(1) AS LogCount
FROM ::fn_dblog(NULL, NULL) WHERE Description='REPLICATE'
GROUP BY [Transaction ID]
HAVING COUNT(1)>500
--===============================================================
--在分发库上查找大事务
USE distribution
GO
SELECT xact_seqno, COUNT(*) AS [COUNT]
INTO #MSrepl_commands FROM dbo.MSrepl_commands
GROUP BY xact_seqno
HAVING COUNT(*)>100
SELECT t.xact_seqno,t.entry_time,c.[count]
FROM MSrepl_Transactions t INNER JOIN
#MSrepl_commands c ON t.xact_seqno=c.xact_seqno
ORDER BY c.count DESC,t.entry_time
处理建议:
建议A: 按照业务逻辑拆分事务
建议B: 修改复制相关的配置文件设置
--==================================================================
分发服务器上延迟分析
延迟原因1:磁盘IO存在压力
诊断方式:使用性能计数器查看日志所在磁盘的磁盘队列
处理建议:
建议A:提升日志所在磁盘的性能或将日志文件放于独享磁盘上
延迟原因2:分发数据库写日志等待
诊断方式:使用DMV查看在分发数据库上存在写日志等待
处理建议:
建议A:提高磁盘性能
建议B:将不同的发布服务器拆分到不同的分发库上,减少分发库对应的发布数量
延迟原因3:复制分发清理作业和日志读取代理作业相互阻塞
诊断方式:检查分发库上命令数量和事务数量,检查是否因为复制设置不合理保持过多的事务和命令
参考:http://blogs.msdn.com/b/apgcdsd/archive/2012/09/07/10347168.aspx
处理建议:
建议A: 设置合理的事务保持期和发布属性设置
建议B: 修改复制分发清理作业的运行时间
延迟原因4:复制事务表和复制命令表包含过多的数据
诊断方式:检查表中数据分表属于那些发布article
-=============================================================
--当前msrepl_commands表中命令涉及表的分布情况
USE distribution;
GO
WITH cte AS(
SELECT a.xact_seqno,b.entry_time,
REPLACE(CONVERT(NVARCHAR(1024),
SUBSTRING(a.command,17,1024)),'[dbo].[sp_MS','') commands
FROM dbo.MSrepl_commands a(NOLOCK)
JOIN MSrepl_transactions b(NOLOCK)
ON a.xact_seqno=b.xact_seqno
)
SELECT SUBSTRING(commands,9,CHARINDEX(']',commands)-9),COUNT(1)
FROM cte WHERE CHARINDEX(']',commands)>9
GROUP BY SUBSTRING(commands,9,CHARINDEX(']',commands)-9)
ORDER BY COUNT(1) DESC
处理建议:
建议A: 将不同的发布服务器拆分到不同的分发服务器上。
建议B:分析数据变化情况,是否可以减少数据变更
PS: 曾遇到一个案例,按照开发部门需求,搭建复制订阅,该发布表按天记录数据,当天数据变化特别频繁,导致复制延迟较高。调研发现订阅端业务只访问前一天数据,于是在发布端新增一张表,每天凌晨将头一天数据导入此表,并对该表搭建复制订阅。更改前每天要传递数千万次甚至上亿次事务命令给订阅服务器,更改后只需要传递数百万事务命令道订阅服务器。
--==================================================================
订阅服务器上延迟分析
延迟原因1:订阅库上有阻塞
诊断方式:使用DMV检查事务阻塞
处理建议:
建议A:优化订阅上查询
建议B:使用较低事务隔离级别或NOLOCK
延迟原因2:订阅库日志写等待
诊断方式:使用DMV查看在分发数据库上存在写日志等待
处理建议:
建议A:提高磁盘相应速度。
--==================================================================
相关补充:
1.查看阻塞和资源等待:http://www.cnblogs.com/TeyGao/p/3522958.html
2.查看数据库文件级别IO操作情况:
SELECT *
FROM sys.dm_io_virtual_file_stats(DB_ID(),null) AS T2
--====================================================================
Replication--复制延迟的诊断和解决的更多相关文章
- [MySQL] 号称永久解决了复制延迟问题的并行复制,MySQL5.7
一.缘由: 某天看到主从复制延时的告警有点频繁,就想着是不是彻底可以解决一下. 一般主从复制,有三个线程参与,都是单线程:Binlog Dump(主) ----->IO Thread (从) - ...
- 浅谈MySQL Replication(复制)基本原理
1.MySQL Replication复制进程MySQL的复制(replication)是一个异步的复制,从一个MySQL instace(称之为Master)复制到另一个MySQL instance ...
- Chapter 17 Replication 复制
Chapter 17 Replication 复制 Table of Contents 17.1 Replication Configuration 17.2 Replication Implemen ...
- MySQL之 从复制延迟问题排查
一.从库复制延迟问题 1.可能的原因如下(1)主从服务器处于不同的网络之中,由于网络延迟导致:(2)主从服务器的硬件配置不同,从服务器的硬件配置(包括内存,CPU,网卡等)远低于主服务器:(3)主库上 ...
- MySQL 5.7并发复制和mysqldump相互阻塞引起的复制延迟
本来MySQL BINLOG和mysqldump命令属于八竿子打不着的两个事物,但在最近故障排查中,发现主库和从库已经存在很严重的复制延迟,但从库上显示slave_behind_master值为0,复 ...
- MySQL至TiDB复制延迟监控
因生产环境mysql中有较多复杂sql且运行效率低,因此采用tidb作为生产环境的从库进行部分慢sql及报表的读写分离.其中MySQL至TIDB采用Syncer工具同步.关于TIDB的安装及Synce ...
- mysql replication 复制的一些问题
1 过大的复制延迟 mysql 的复制延迟是一个常见问题,现在已经有一些解决方案,如淘宝开发的一些工具 2 没有磁盘空间 复制导致磁盘空间塞满,二进制日志.中继日志或临时文件把磁盘塞满,slave ...
- 转 如何诊断和解决high version count 10.2.0.4 and 11.2.0.4
转自 http://blog.csdn.net/notbaron/article/details/50927492 在Oracle 10g以上的版本,High version count可谓是一个臭名 ...
- 诊断并解决 ORA-4030 错误 (Doc ID 1548826.1)
适用于: Oracle Database - Enterprise Edition - 版本号 8.1.7.4 和更高版本号 本文档所含信息适用于全部平台 用途 怎样诊断 ORA-4030 错误 排错 ...
随机推荐
- Ibatis 测试出SQL
String sql = Brg.Global.Map.BaseBatis.GetRuntimeSql("select_T_JewelleryProductType", _Mode ...
- 使用虚幻引擎中的C++导论(一-生成C++类)
使用虚幻引擎中的C++导论(一) 第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢. 第二,某些细节操作,这篇文章省略了,如果有不 ...
- Orcle基本语句(一)
--创建学生信息表,约束放在所有列定义之后 CREATE TABLE stu_info( stu_id INTEGER, stu_name NVARCHAR2() NOT NULL, stu_sex ...
- MyBatis复习
一.对JDBC的总结 1.数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能. 解决方案:使用数据库连接池管理数据库连接. 2.将sql语句硬 ...
- [已解决]EnvironmentError: mysql_config not found
$ pip install MySQL-python==1.2.5 报错: EnvironmentError: mysql_config not found 原因是缺少包 libmysqlclient ...
- ZZ : Ubuntu:永久修改MAC地址
方法一: 1)编辑“/etc/init.d/rc.local”文件(sudo gedit /etc/init.d/rc.local) 2)在此配置文件的最后面加上如(Ubuntu:修改网卡的MAC地址 ...
- 同一web系统,不同端口的跨域问题
部署web系统的时候,发现了跨域问题,子系统是用Iframe嵌入到系统里面的,导致父窗口获取子系统的webService和图片时发现跨域问题,如下图所示:问题1:父窗口获取子系统的对象跨域 原因:用这 ...
- 清除浮动的 why
如果你想第三个p不被前面的浮动层所影响,就对它进行清除如果没有清除,第三个层就会移到第一个p下面 记住!!浮动是用来布局的~你看你的网页设计图,好几个版块在一条线上就是要浮动了,不需要浮动就是版块跟前 ...
- python--自动删除文件
1.目的:定期自定删除7天前的数据 python脚本如下: #coding=utf-8 import os,time,datetime #需定时删除的目录的上一层路径 data_dir="/ ...
- MongoDB文档、集合、数据库简介
文档 概述 文档是MongoDB的核心概念,是数据的基本单元,非常类似于关系数据库中的行.在MongoDB中,文档表示为键值对的一个有序集.MongoDB使用Javascript shell,文档的表 ...