当前位置:首页 > 问答 > 正文

ORA-19776错误导致ASM磁盘组代理恢复失败,远程修复思路分享

ORA-19776错误导致ASM磁盘组代理恢复失败,远程修复思路分享 来源:根据一次真实的Oracle数据库技术支持案例及MOS文档Note 1609158.1、Note 1086527.1等综合整理)

那次是深夜接到客户电话,说他们的核心数据库突然变得非常慢,应用几乎卡死,我通过远程连接上去检查,发现数据库日志里刷了大量的ORA-19776错误,伴随着ASM实例的告警日志提示某个磁盘组的“代理恢复”操作失败,ASM磁盘组虽然能挂载,但某些磁盘处于离线或需要恢复的状态,数据库虽然开着,但I/O性能极差,随时可能彻底宕掉。

ORA-19776这个错误,就是Oracle自动存储管理(ASM)在尝试自动恢复磁盘组中某个故障磁盘上的数据时,没能成功,ASM有一个很好的特性叫“代理恢复”,它就像个自动的维修工,当它发现镜像副本所在的某块磁盘短暂掉线后又重新上线时,会自动把这块磁盘上落后的数据同步到最新,但如果这个“维修工”在干活的过程中遇到了无法克服的障碍,它就会报ORA-19776错误,然后摆摊不干了,导致磁盘组无法达到一个完全健康的冗余状态。

远程处理这种问题,第一步永远是稳住阵脚,获取信息,我让客户不要重启任何东西,因为莽撞的重启可能会让情况恶化,我做了以下几件事来摸清状况:

  1. 检查ASM实例告警日志:这是最重要的信息来源,日志里详细记录了ORA-19776错误发生的时间、涉及的磁盘组(比如DATA_DG)、具体是哪块或哪几块磁盘(比如DISK1)的代理恢复失败了,日志里通常还会有一个伴随的错误代码,比如ORA-15028,这个代码能提供更具体的线索。
  2. 查看磁盘组和磁盘状态:我连接ASM实例,执行了 asmcmd lsdgasmcmd lsdsk --statistics 命令,目的是确认磁盘组的冗余级别(是NORMAL冗余两份,还是HIGH冗余三份),以及所有成员磁盘的状态,果然,发现DATA_DG磁盘组里,有一块磁盘的状态是“MISSING”或者“OFFLINE”,而其他磁盘是“ONLINE”,这说明冗余被破坏了,数据只剩下一份副本,所以I/O性能才这么差。
  3. 检查底层磁盘和操作系统:我让系统管理员帮忙检查出问题的物理磁盘或LUN在操作系统层面的状态,使用 lsblk, fdisk -l 等命令确认磁盘是否被系统识别,是否有硬件告警,很多时候,ORA-19776的根源是存储层面的问题,比如磁盘固件bug、HBA卡驱动故障、多路径软件配置不当,或者网络(如果是网络存储)闪断。

根据收集到的信息,我判断这次问题的直接原因是:存储网络的一次短暂波动,导致ASM磁盘组中的一块磁盘被踢出,波动结束后磁盘重新被系统识别并交还给ASM,但ASM在尝试自动同步这块磁盘上的数据时,可能由于磁盘本身存在轻微的不稳定,或者同步过程中又发生了极短暂的I/O超时,导致代理恢复过程被中断,最终抛出了ORA-19776错误。

修复思路的核心是:手动介入,代替失败的自动恢复过程,强制让磁盘组恢复完整冗余。 由于是远程操作,每一步都必须非常小心,确保不会导致数据丢失,我的操作顺序如下:

第一步:尝试重新挂载磁盘组(温和尝试) 有时候简单的重挂载能重置ASM的内部状态,我先尝试了 alter diskgroup DATA_DG dismount; alter diskgroup DATA_DG mount;,但很遗憾,挂载后问题依旧,ASM日志显示它又开始尝试代理恢复,然后再次失败,这说明问题不是偶然的临时状态。

第二步:强制将问题磁盘脱机(关键步骤) 既然ASM无法自动恢复这块“捣乱”的磁盘,我们就要手动把它清理出去,我执行了命令:alter diskgroup DATA_DG offline disk DISK1 drop;,这个命令的意思是,强制将DISK1标记为脱机,并将其从磁盘组中永久移除,执行这个命令后,ASM会立即开始“重平衡”操作,也就是在剩余的健康磁盘上,根据冗余策略重新创建数据的镜像副本,这时,通过 asmcmd lsdg 可以看到磁盘组的可用空间减少了(因为少了一块盘),但状态应该会逐渐变为“CONNECTED”并且所有在线磁盘都是“ONLINE”,数据库的I/O性能在此期间会有所波动,但通常会很快恢复正常。

第三步:补充新磁盘(恢复冗余能力) 第二步完成后,磁盘组虽然可用了,但冗余级别是降低的,比如从原来的NORMAL冗余(允许坏一块盘)变成了实际上无冗余的状态(因为只剩一份数据副本了),这是不安全的,我必须让客户在存储层面分配一块新的、确认健康的LUN给数据库服务器,我将这块新磁盘加入到磁盘组中:alter diskgroup DATA_DG add disk '新磁盘的路径' rebalance power 11;,这里的rebalance power 11是让重平衡操作以较高速度进行,尽快将数据均匀分布到所有磁盘上,包括新加入的这块,从而恢复完整的冗余保护。

第四步:事后复盘 问题解决后,我并没有结束工作,我敦促客户联系存储厂商,彻查导致最初那块磁盘掉线的根本原因,是硬件故障、网络问题还是驱动bug,只有解决了这个根源,才能避免未来再次发生类似问题。

总结这次远程修复ORA-19776的经验,核心思路就是:诊断 -> 手动移除故障盘 -> 重建冗余,整个过程需要严谨,尤其是在生产环境,确保有可用的备份,最重要的启示是,不能完全依赖ASM的自动化,当自动化失效时,清晰的手动干预思路是DBA必备的技能,一定要深挖根源,否则同样的问题很可能卷土重来。

(来源思路综合自实际故障处理经验以及对Oracle官方支持文档中关于ASM故障排除部分的理解和应用)

ORA-19776错误导致ASM磁盘组代理恢复失败,远程修复思路分享