这是上周遇到的一个案例:对已有的硬件进行升级而引发的问题,期间还触发了一个比较严重的BUG,可谓多灾多难;不过值得庆幸的是,在一连串连锁问题出现的时候,并没有出现人工操作失误(这往往是在处理故障中风险最高、影响最大的问题)而扩大故障影响范围;

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

先说一下环境:

我做的是跨机房3节点alwayson:

部署方面:3个节点中,两个位于主机房,同步模式,另外一个位于异地机房,跨子网异步模式;

软件方面:windows 2012+SQLSERVER 2012 SP2+CU3;

硬件方面:由于该系统上线时间较早,除了本地硬盘(RAID 10)用于存放必要的安装程序包外,每个节点各配置了一块IO卡用于存放数据、日志文件以及备份

此前该系统在使用时,应用侧经常出现提交事务抖动(本地机房两节点同步),改为异步模式后应用侧性能表现良好;我们知道,在同步模式下,由于应用端需要等待在同步secondary节点完成日志固化(harden)后才能收到提交或回滚信息,因此两节点间的网络环境,以及磁盘IO能力就成为上述影响的关键;

而在此之前,我们已经对网络进行了优化(详见:《SQLServer 2012之AlwaysOn —— 指定数据同步链路,消除网络抖动导致的提交延迟问题》),因此可以排除网络影响;另外,我们通过对磁盘IO性能的监控(尤其是checkpoint时的影响),最终定位到磁盘IO确实存在压力,最后决定更换IO卡;

在申请设备的时候,我们发现,由于此前的IO卡为第一代产品,与目前最新采购的第三代产品有兼容性问题(无法同时安装),因此需要先将secondary节点从alwayson环境中踢出,重新安装后重新初始化数据,并添加回alwayson环境;这一步按照标准步骤执行,十分顺利;

其次,我们准备切换AG到已更新硬件的节点(此处我们叫他Node_B),结果发现切换过程很顺利(手动故障转移),但切换后不能进行备份(由于后续需要将另外一个节点进行同样的更新硬件操作,不能备份就意味着在重新加回alwayson环境时,不能初始化数据),随即又将服务切回Node_A上(最初的master节点);

随后,我们检查了Node_B的errorlog,发现其中出现如下错误信息:

Information 29-Apr-2014 3:17:24 PM MSSQL$PRD 9012 Server There have been 25958400 misaligned log IOs which required falling back to synchronous IO. The current IO is on file W:\MOUNTLOG\PRDLOG\PRDLOG1.ldf.
Information 29-Apr-2014 3:17:17 PM MSSQL$PRD 9012 Server There have been 25958144 misaligned log IOs which required falling back to synchronous IO. The current IO is on file W:\MOUNTLOG\PRDLOG\PRDLOG1.ldf.

其实从Node_B更换完硬件,并添加回alwayson环境后,就一直再报类似的错误,只是切换比较顺利,我们都忽略了检查errorlog这一关键的步骤;

继续来说上面的错误信息,misaligned是个针对于IO方向的报警,具体的原理可以参考以下文章

http://blogs.msdn.com/b/saponsqlserver/archive/2014/10/02/message-misaligned-log-ios-which-required-falling-back-to-synchronous-io-in-sql-server-error-log.aspx

而导致misaligned的原因,是由于两个节点的IO卡,其物理扇区大小不一致(Node_A为512,Node_B为4096;此处的物理扇区是存储设备底层设置的,与操作系统中format 4K~64K不是一个概念,操作系统格式化的定义是分配单元大小,或称之为簇)。上述链接中对9012错误进行了详细的分析,再此不再赘述;

另一方面,是由于misaligned而导致了切换节点后无法进行备份么?第二天,我又搭了一套类似的环境进行测试,但问题没有重现;于是我们准备用另一套方案进行升级:

既然由于AG中两个节点的物理扇区大小不等导致misaligned,我们准备先在现有AG中再增加一个物理扇区大小为4096的节点(Node_C),然后再切换AG到Node_B后,踢掉Node_A。这样AG中有两个同步关系的节点(Node_A、Node_C,且物理扇区大小均为4096),或许可以实现备份。

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

按照上述方案,我们又安排了一次停机。但这次在切换服务并踢掉Node_A后,不但备份问题没有解决,连AG组也变成正在解析的情况

从下图中,AG组中只能识别到当前节点;

但Node_B仍可以正常的访问(读写正常,listener IP也可以正常使用),而Node_C则无法访问;这种状态极为不合理;

此外,在errorlog中,发现大量remote harden of transaction的报错

执行备份(spid=509)被checkpoint进程阻塞(spid=23),又被DB STARTUP进程阻塞(spid=35)

根据微软工程的分析“这是最近刚刚发现的一个SQL 的bug,只发生在SP2 CU3和CU4上面。即便不做BACKUP,也会发生这样的阻塞。”

这可能是由于SQL Server内部发生了死锁,建议尽快再所有节点上安装以下这个补丁。

http://support.microsoft.com/en-us/kb/3033492

http://support.microsoft.com/en-us/kb/3034679

您可以单独安装hotfix,或者安装SQL 2012 SP2CU5,我们建议您对于所有打过SP2 CU3(5556)和CU4(5569)并且配有AlwaysOn的环境,都尽快打上CU5

http://support.microsoft.com/en-us/kb/3037255/en-us

但目前的情况是需要先保证alwayson恢复正常,于是我们准备通过停机复制数据文件的方式将数据库迁移到其他alwayson环境下;但在停止sqlserver服务的时候hang住

无奈,只能重启服务器。但神奇的是,重启大法在这里居然是最完美的解决方案。重启后,各种服务均恢复正常;

总结:这个案例比较特殊,在切换过程中遇到了另一个BUG,但好在BUG中出现的内部进程的死锁通过重启得到了释放。另外,对于第一部分提到的misaligned的问题,最好在安装硬件后,先检查一下物理扇区的大小是否一致,以免出现性能问题;

SQLSERVER 2012之AlwaysOn -- 一次硬件升级引发的问题的更多相关文章

  1. SQLSERVER 2012之AlwaysOn -- 同步模式下的网卡性能优化

    本文是基于上一篇<SQLServer 2012之AlwaysOn -- 指定数据同步链路,消除网络抖动导致的提交延迟问题>的问题继续进行优化:具体背景请参照上文:     前后折腾了一个多 ...

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

    原文:SQLServer 2012异常问题(二)--由安装介质引发性能问题 问题描述:生产环境一个数据库从SQLSERVER 2008 R2升级到SQLSERVER 2012 ,同时更换硬件,但迁移后 ...

  3. SQLServer 2012之AlwaysOn —— 指定数据同步链路,消除网络抖动导致的提交延迟问题

    事件起因:近期有研发反应,某数据库从08切换到12环境后,不定期出现写操作提交延迟的问题: 事件分析:在排除了系统资源争用等问题后,初步分析可能由于网络抖动导致同步模式alwayson节点经常出现会话 ...

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

    原文:SQLServer 2012异常问题(一)--故障转移群集+镜像环境导致作业执行失败 先感谢一下我的同事们最先发现此问题,鸣谢:向飞.志刚.海云 最近在生产环境发现一个诡异的问题: 环境:WIN ...

  5. 安装SQLserver 2014(For AlwaysOn)

    SQLserver 2014 AlwaysOn在SQLserver 2012的基础之上,进行了非常大程度的添加.如能够通过"加入 Azure 副本向导"简化了用于 AlwaysOn ...

  6. Sqlserver 2012 Always on技术

    使用了Sqlserver 2012 Always on技术后,假如采用的配置是默认配置,会出现Primary server CPU很高的情况发生,比如默认配置如下: 需要自定义来解决这个问题. 我们先 ...

  7. SQLSERVER 2012计算上一条,下一条数据的函数

    实际需求很普遍,比如求销售数据的每天与头一天的销售增长量.这里用一个汽车行驶数据来做例子: 先初始化数据: CREATE TABLE [dbo].[CarData]( [CarID] [int] NU ...

  8. SQLServer 2012 可视化窗口中,设置“时间”默认值为“当前时间"

    最近,需要在SQLServer 2012中,设置datetime的默认值为当前时间. 通过可视化窗口进行设置,而不是将getdate()函数写在sql语句中,也不是将‘2022-2-2 22:22:2 ...

  9. windows 2008 r2或win7安装SP1补丁,安装sqlserver 2012

    说明:安装sql server 2012时,win7和win2008r2系统都需要打sp1补丁. 1.SP1补丁下载地址(建议用迅雷下载): http://download.microsoft.com ...

随机推荐

  1. Linux网络状态工具ss命令使用详解

    ss命令用于显示socket状态. 他可以显示PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets, Unix dom ...

  2. logging日志模块

    为什么要做日志: 审计跟踪:但错误发生时,你需要清除知道该如何处理,通过对日志跟踪,你可以获取该错误发生的具体环境,你需要确切知道什么是什么引起该错误,什么对该错误不会造成影响. 跟踪应用的警告和错误 ...

  3. GBDT基本理论及利用GBDT组合特征的具体方法(收集的资料)

    最近两天在学习GBDT,看了一些资料,了解到GBDT由很多回归树构成,每一棵新回归树都是建立在上一棵回归树的损失函数梯度降低的方向. 以下为自己的理解,以及收集到的觉着特别好的学习资料. 1.GBDT ...

  4. Eclipse下修改工程名

    汇总下网上的方法. 一. 右键工程:Refactor->Rename,或选中工程按F2,修改名称 二. 右键工程:Properties->Web Project Settings,修改Co ...

  5. Binary Tree Maximum Path Sum

    Given a binary tree, find the maximum path sum. The path may start and end at any node in the tree. ...

  6. setAttribute()和getAttibute(),getParameter()

    request.setAttribute("key",value)方法给主键设置一个值, request.getAttribute("key")方法从上述设置的 ...

  7. 统计学习方法 AdaBoost

    提升方法的基本思路 在概率近似正确(probably approximately correct,PAC)学习的框架中, 一个概念(一个类),如果存在一个多项式的学习算法能够学习它,并且正确率很高,那 ...

  8. Vmware虚拟机克隆的网卡问题

    系统环境:red hat 6.4 在虚拟机上使用克隆后,克隆机没有eth0, 出现eth1并且出错No suitable device found: no device found for conne ...

  9. POJ 2983 Is the Information Reliable? 差分约束

    裸差分约束. //#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #i ...

  10. Odoo10 变化

    官方在 https://www.odoo.com/forum/help-1/question/fyi-what-has-odoo-r-d-been-working-on-lately-106945 发 ...