一个非常罕见的SQLServer镜像异常的排查处理过程

本周一晚上,收到一个数据库镜像SUSPEND和SYNCHRONIZING状态来回切换的告警,看到这个错误,其实也蛮常见的。

我们的修复步骤一般是这样的:

1. ALTER DATABASE *** SET PARTNER RESUME

如果这个步骤还不行,就需要触发一个事务,因为偶尔我们遇到SYNCHRONIZING状态的,可以触发事务修复,其原因可能是镜像由于网络原因冰了一下

2. CREATE TABLE dbo.tb_repair_mirroring_****(ID int), 然后删除该表

当这个修复也是失败后,我们就需要尝试先拿掉镜像,然后再重新应用一下,当然这个成功的前提必须保证MASTER/SLAVE的事务日志是可以前滚的,也就是事务日志链没有丢失或者破坏

3. ALTER DATABASE *** SET PARTNER OFF, 然后重新应用ALTER DATABASE *** SET PARTNER = ‘TCP://***‘(类似语句)

4.上述若不能修复,剩下唯一的修复办法是重建镜像,直到现在,这个都是能够解决问题的,可以说是最后一个招数

但遗憾的是,所有的方法都用了也没能修复,还是不断的出现这个错误。

errorlog主库:

2014-12-17 15:57:30.640 spid33s Error: 1453, Severity: 16, State: 1.

2014-12-17 15:57:30.640 spid33s ‘TCP://***‘, the remote mirroring partner for database ‘***‘, encountered error 3624, status 1, severity 20. Database mirroring has been suspended.  Resolve the error on the remote server and resume mirroring, or remove mirroring and re-establish the mirror server instance.

备库:

2014-12-17 00:00:42.97 spid41s Error: 17066, Severity: 16, State: 1.
2014-12-17 00:00:42.97 spid41s SQL Server Assertion: File: <loglock.cpp>, line=807 Failed Assertion = ‘result == LCK_OK‘. This error may be timing-related. If the error p ersists after rerunning the statement, use DBCC CHECKDB to check the database for structural integrity, or restart the server to ensure in-memory data structures are not corr upted.

看起来像数据页有问题,查了相关报错又像是BUG,同时自身也生成了很多dump文件,进一步分析情况:

主库异常DB目前的TPS,3000左右

begin tranDECLARE @value intDECLARE @value2 intselect @value=CONVERT(int,cntr_value) from sys.dm_os_performance_counters

where object_name like ‘MSSQL$***:database%%‘and instance_name=‘***‘ and counter_name like ‘Transactions/sec%%‘

waitfor delay ‘00:00:01‘

select @value2=CONVERT(int,cntr_value) from sys.dm_os_performance_counters

where object_name like ‘MSSQL$***:database%%‘and instance_name=‘***‘ and counter_name like ‘Transactions/sec%%‘

select @[email protected]

commit tran

主库发送队列在增加

begin tranDECLARE @value intDECLARE @value2 intselect @value=CONVERT(int,cntr_value) from sys.dm_os_performance_counters

where counter_name = ‘Log Send Queue KB‘ and instance_name=‘***‘;

waitfor delay ‘00:00:01‘

select @value2=CONVERT(int,cntr_value) from sys.dm_os_performance_counters

where counter_name = ‘Log Send Queue KB‘ and instance_name=‘***‘;

select @value*1./1024 as first_second_MB,@value2*1./1024 as second_second_MB,(@[email protected])*1./1024 as diff_MB

commit tran

时而追上

备库的应用队列

begin tranDECLARE @value intDECLARE @value2 intselect @value=CONVERT(int,cntr_value) from sys.dm_os_performance_counters

where counter_name = ‘Redo Queue KB‘ and instance_name=‘***‘

waitfor delay ‘00:00:01‘

select @value2=CONVERT(int,cntr_value) from sys.dm_os_performance_counters

where counter_name = ‘Redo Queue KB‘ and instance_name=‘***‘;

select @value*1./1024 as first_second_MB,@value2*1./1024 as second_second_MB,(@[email protected])*1./1024 as diff_MB

commit tran

备库的应用速度大概在 14MB

begin tranDECLARE @value bigintDECLARE @value2 bigintselect @value=CONVERT(bigint,cntr_value)*1./1024/1024 from sys.dm_os_performance_counters

where counter_name = ‘Redo Bytes/sec‘ and instance_name=‘***‘;

waitfor delay ‘00:00:01‘

select @value2=CONVERT(bigint,cntr_value)*1./1024/1024 from sys.dm_os_performance_counters

where counter_name = ‘Redo Bytes/sec‘ and instance_name=‘******scard‘;

select (@[email protected]) as speed_MB

commit tran

假设忽略主库新产生的日志,追上主库需要的时间 32min,如果再算上主库新产生的大概在40min多

select 27338.278320/14/60 =32.545569428566

再排查

select cntr_value,* from sys.dm_os_performance_counterswhere counter_name in(‘Log Send Flow Control Time (ms)‘,‘Bytes Sent/sec‘,‘Log Bytes Sent/sec‘,‘Log Compressed Bytes Sent/sec‘,‘Log Harden Time (ms)‘,‘Log Send Flow Control Time (ms)‘,

‘Log Send Queue KB‘,‘Mirrored Write Transactions/sec‘,‘Pages Sent/sec‘,

‘Send/Receive Ack Time‘,‘Sends/sec‘,‘Transaction Delay‘ )

and instance_name=‘***‘;

Send/Receive Ack Time:

Milliseconds that messages waited for acknowledgement from the partner, in the last second.

This counter is helpful in troubleshooting a problem that might be caused by a network bottleneck, such as unexplained failovers, a large send queue, or high transaction latency. In such cases, you can analyze the value of this counter to determine whether the network is causing the problem.

问题是否可能出现在网络上,该主机TOA(网络组件)已经升级了,但是备机的TOA未升级

等待确认的时间稳定在800ms左右,对比升级TOA的主机在100ms左右,当然这个也跟对比实例的tps相关,但目前发现有问题的地方可能是这里

begin tranDECLARE @value bigintDECLARE @value2 bigintselect @value=CONVERT(bigint,cntr_value) from sys.dm_os_performance_counters

where counter_name = ‘Send/Receive Ack Time‘ and instance_name=‘***‘;

waitfor delay ‘00:00:01‘

select @value2=CONVERT(bigint,cntr_value) from sys.dm_os_performance_counters

where counter_name = ‘Send/Receive Ack Time‘ and instance_name=‘***‘;

select (@[email protected]) as ‘Send/Receive Ack Time‘

commit tran

半小时候发现发送队列又变大了,发送速度又是

备库的应用队列减小的也非常慢

后续我们跟用户沟通了维护时间做了checkdb,但并未发现没有坏页,说明数据是ok的,那么问题可能在日志了。

恰好我们发现了数据日志的一直较大,并且收缩数据库日志无效,查看等待的类型,发现是ACTIVE_TRANSATION, 一般,正常的情况是等待LOG BACKUP和DATABAE MIRRORING(只针对RDS环境,环境更复杂的,等待的类型更多) ,这样我们就感觉有点眉目了。

log_reuse_wait_desc 为 ACTIVE_TRANSACTION

ACTIVE_TRANSACTION:事务处于活动状态(所有恢复模式)。

  • 一个长时间运行的事务可能存在于日志备份的开头。在这种情况下,可能需要进行另一个日志备份才能释放空间。
  • 事务被延迟(仅适用于 SQL Server 2005 Enterprise Edition 及更高版本)。“延迟的事务”是有效的活动事务,因为某些资源不可用,其回滚受阻。

首先我们查看是否有事务在阻塞日志被截断:

DBCC OPENTRAN(***‘)

发现了重大的线索,有个277号进程是阻塞元凶(用户自己发起了一个事务),分析了这个277号进程,是用户在查系统视图的脚本,其中,一段是SELECT语句,其他的在BUFFER里面差不多,总之就是有个事务在里面

15号的事务今天19号,导致中间的日志全是活动日志无法截断,跟用户确认kill掉后,再次 dbcc opentran(‘***‘)

发现结果一直在变化,可以理解为活动日志一直在往前走(越来越少),再次备份后活动日志恢复到7G左右,重搭成功。

终于在不影响用户的情况下成功解决,我们差点就要让他停业务做重启了(还未必能重启成功),也再次证明团队的力量是巨大的,大家的细心是解决问题的关键。

https://connect.microsoft.com/SQLServer/feedback/details/412955/

http://stackoverflow.com/questions/4192730/sqlbulkcopy-mirroring-failed

http://msdn.microsoft.com/zh-cn/library/ms188290(v=sql.105).aspx

http://msdn.microsoft.com/zh-cn/library/ms189931.aspx

http://msdn.microsoft.com/zh-cn/library/ms176064.aspx

http://msdn.microsoft.com/zh-cn/library/ms178037(v=sql.105).aspx

时间: 2024-10-15 16:06:50

一个非常罕见的SQLServer镜像异常的排查处理过程的相关文章

SQLServer 2012异常问题(一)--故障转移群集+镜像环境导致作业执行失败

原文:SQLServer 2012异常问题(一)--故障转移群集+镜像环境导致作业执行失败 先感谢一下我的同事们最先发现此问题,鸣谢:向飞.志刚.海云 最近在生产环境发现一个诡异的问题: 环境:WINDOWS 2012+SQLSERVER 2012 SP1,双节点的故障转移群集+单节点的SQLSERVER 2012 SP1实例(镜像) 生产数据库是从SQLSERVER 2008R2迁移到2012的,迁移过程很顺利,按照一般经验,可能导致数据库所有者丢失,因此在迁移后手动修改数据库所有者为sa,与

SQLServer 2012异常问题(二)--由安装介质引发性能问题

原文:SQLServer 2012异常问题(二)--由安装介质引发性能问题 问题描述:生产环境一个数据库从SQLSERVER 2008 R2升级到SQLSERVER 2012 ,同时更换硬件,但迁移后发现性能明显下降,应用写入.读取性能下降的比较厉害: 向微软寻求帮助后得出答案,原来这与SQLSERVER的安装介质有关. 大致意思是说由于NUMA架构可以自行管理内存池,在安装了CAL的EE后,由于限制只能使用20个cores,同样内存则只能管理到20个cores涉及到的NUMA的对应的内存空间(

CentOS服务器上搭建Gitlab安装步骤、中文汉化详细步骤、日常管理以及异常故障排查

一, 服务器快速搭建gitlab方法 可以参考gitlab中文社区 的教程 centos7安装gitlab:https://www.gitlab.cc/downloads/#centos7 centos6安装gitlab:https://www.gitlab.cc/downloads/#centos6 如下方法按照官网来操作,手工安装过于麻烦.当前测试平台为小鸟云的三个月centos 7测试机. 1. 安装配置依赖项 如想使用Postfix来发送邮件,在安装期间请选择'Internet Site

一个由进程内存布局异常引起的问题

一个由进程内存布局异常引起的问题 前段时间业务反映某类服务器上更新了 bash 之后,ssh 连上去偶发登陆失败,客户端吐出错误信息如下所示:图 - 0 该版本 bash 为部门这边所定制,但实现上并没有改动原有逻辑,只是加入了些监控功能,那么这些错误从哪里来呢? 是 bash 的锅吗 从上面的错误信息可以猜测,异常是 bash 在启动过程中分配内存失败所导致,看起来像是某些情况下该进程错误地进行了大量内存分配,最后导致内存不足,要确认这个事情比较简单,动态内存分配到系统调用这一层上主要就两种方

【HAVENT原创】Docker 创建一个新的 Node 镜像,并发布到 DockerHub

下面我将在 Window10 系统下面生成一个新的 Node 镜像,并发布的 DockerHub. 1. 将带有 Dockerfile 的项目目录放到用户根目录 C:\Users\havent.liu\wehotel-app 2. 启动 Docker Quickstart Terminal,根据 Dockerfile 生成一个基础镜像 $ docker build -t havent/node6 havent-node6 附:dockerfile 基础镜像代码 FROM node:6-alpin

怀疑服务器存在异常流量排查日记,使用ifconfig,nethogs等命令

怀疑服务器存在异常流量排查日记一.用ifconfig查看网卡流量[email protected] ~]# ifconfigeth4 Link encap:Ethernet HWaddr 00:50:56:0A:A6:E9 inet addr:192.168.1.91 Bcast:192.168.1.255 Mask:255.255.255.0inet6 addr: fa70::220:58af:faba:6e8/64 Scope:LinkUP BROADCAST RUNNING MULTICA

MySQL redo lock 死锁问题排查 &amp; 解决过程

版权声明:本文由 MySQL redo lock 死锁问题排查 & 解决过程 张青林 原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/181 来源:腾云阁 https://www.qcloud.com/community 周一上班,首先向同事了解了一下上周的测试情况,被告知在多实例场景下 MySQL Server hang 住,无法测试下去,原生版本不存在这个问题,而新版本上出现了这个问题,不禁心头一颤,心中不禁感到奇怪

Mysql死锁如何排查:insert on duplicate死锁一次排查分析过程

前言 遇到Mysql死锁问题,我们应该怎么排查分析呢?之前线上出现一个insert on duplicate死锁问题,本文将基于这个死锁问题,分享排查分析过程,希望对大家有帮助. 死锁案发还原 表结构: CREATE TABLE `song_rank` ( `id` int(11) NOT NULL AUTO_INCREMENT, `songId` int(11) NOT NULL, `weight` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`

C#发送邮件异常:根据验证过程,远程证书无效

今天在做发送邮件功能时,开始用qq邮箱和163邮箱都可以正常发送,后再改用我公司的邮箱和smtp时竟然报错了. 异常提示-----"根据验证过程,远程证书无效",后来通过查询资料解决该问题,上代码: using log4net; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Mail; using System.Net.Secur