热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一个事故背后的七个错误

IT界都相信黄油定律,似乎事件的发展总是向着最坏的方向,涂有黄油的一面总是最先着地。实际

IT界都相信黄油定律,似乎事件的发展总是向着最坏的方向,涂有黄油的一面总是最先着地。实际上,黄油定律的根源出自另外一句名言,一个事故背后往往有七个错误。
这是一个比较久远的案例了,有一天,一个朋友在qq上问我,他的一套数据库系统存储故障导致SYSTEM表空间和数据表空间有大量的坏块,现在无法启动了,该怎么办。我第一反应是问他有没有备份,回答是没有。当时我觉得这个事情比较麻烦了,弄不好需要通过dul导出数据。在沟通过程中我了解到他们这套系统是一套较为重要的二线核心系统,所以这类系统他们都搭了Dataguard,不过Dataguard你那边的服务器配置都很低,无法承载业务。既然有Dataguard那就比较简单了,不管那边能不能承载业务,只要数据都在就好办了。于是我建议他们用Dataguard的数据文件来恢复生产的数据库。他听从了我的建议,马上去找数据库维保厂商到场干活了。
本来以为这是件十分简单的事情,没想到最后这个朋友成为了我的客户。第二天早上我查看QQ,发现5点多钟就有一堆留言,那个朋友没有我的手机号,所以只能通过QQ留言。通过QQ我了解到昨晚的数据恢复十分不顺利,问我能不能抓紧飞过去帮他们处置一下。到达现场后,我认真阅读了日志文件,真的让我有点啼笑皆非,所有数据库运维能够遇到的问题几乎都被他们遇到了。关于数据最终的拯救过程十分简单,这里就不细说了,我们来分析一下这个事故背后的错误。

从备库的ALERT LOG上我们看到主库因为故障,与备库的网络通讯中断,备库停止了数据恢复。随后运维人员用只读方式打开了数据库并关闭了

然后再次MOUNT方式启动数据库实例,并且备份了控制文件

上面的操作虽然有点莫名其妙,不过还算正常。后面的操作就不正常了,运维人员在重建控制文件:

重建完控制文件后,进行了一次SWITCHOVER

这次SWITCHOVER是注定要失败的,因为这个数据库还没有完全恢复“END-OF-REDO",这种灾难情况下要运气十分好才有可能能END-OF-REDO。于是开始做recover database

在recover的时候遇到了一个问题,找不到一个归档日志文件。而客户的说法是,他们的归档日志都是保留至少一周的,不可能找不到归档日志。
随后运维人员没有去查找这个归档日志找不到的原因,而是多次重建了控制文件:

并且用resetlog选项创建了控制文件:

其实每次重建控制文件的时候都有警告消息:

标注了部分数据文件处于OFFLINE DROP状态。不过当时运维人员并未深究其原因。而是直接把这些命令拷贝了下来执行了!!!!第一个不可饶恕的错误出现了。

执行了这些命令后,控制文件成功创建了,并且数据库也成功打开了。似乎一切都OK了。没想到,这个打开的数据库只是个样子货,大量的表无法访问,一访问就报错。于是老白就到了现场,用户的目的有两个,一个是把数据拯救出来,一个是分析这次问题的原因,为以后运维引以为戒。
我首先查看了v$datafile:

其中有不少OFFLINE的文件,甚至有很多文件的checkpoint scn都是0。这让我十分诧异。于是我们往前翻看日志:

原来那个重建控制文件还不是第一个错误,真正的错误在20多天前就造就了。从日志可以看出,DBA把standby 文件管理方式设置为manual,然后手工删除了一些名为UNNAMExxxxx的文件。然后把这些文件rename为一个裸设备名。可能各位看客会有点晕了,这种神操作是干什么的呢?老白这种事见得多了,一眼就明白发生了什么。如果我们在主库创建新文件时,备库的裸设备不存在,这样在备库中就会生成一个UNNAMEDxxxxxx的文件,为了将这个文件重新迁移到裸设备上,DBA就做了上述操作。这种失误以前发生过多次,每次都是采用这种方式去解决的,好像每次都成功了。

采用这种方式处理数据文件缺少了一个步骤,就是执行alter database create datafile ... As '....';
从而导致该数据文件一直处于未完成修改的状态,也就是说这条命令并没有正确结束。因此虽然这些裸设备都已经存在了,DATAGUARD一直未对此文件进行REDO APPLY。并且在DATAGUARD中查看这些文件的状态是RECOVER状态。实际上这些文件大多数是空文件,里面并无任何数据。这就能解释我们上面看到的情况了。

由于DATAGUARD中的这些文件本身存在问题,导致这类文件处于非正常状态,由于这些文件最早的是1月份创建的,所以有些文件需要1月份以来的REDO LOG,有些需要4月7日以后的REDO LOG,那个1_87118.dbf就是1月份的归档日志,此时早就被清理了,当时已经无条件进行修复。

所以可以说是一个1月份的错误操作导致了半年后的一次严重事故。类似这样的案例可能很多运维人员都遇到过,可能很多人犯过类似的错误而不自知吧。

其实出现这种问题主要有两个原因,一个是很早的错误没有被发现,导致出现严重后果时出现不可估量的损失。第二个是遇到问题时缺乏可用的应急预案或者专家的指导,操作过程中错误频频,导致小故障变成大故障。



推荐阅读
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 使用SQL命令创建数据库及其语句解析
    使用 `CREATE DATABASE` 命令可以创建一个新的数据库,并指定其名称。该 SQL 语句用于初始化数据库结构,执行后将生成一个新的数据库实例,用于存储相关的数据对象和表。在本例中,通过执行 `CREATE DATABASE 课程管理1`,系统将创建一个名为“课程管理1”的数据库,以便后续的数据管理和操作。 ... [详细]
  • 在使用 SQL Server 时,连接故障是用户最常见的问题之一。通常,连接 SQL Server 的方法有两种:一种是通过 SQL Server 自带的客户端工具,例如 SQL Server Management Studio;另一种是通过第三方应用程序或开发工具进行连接。本文将详细分析导致连接故障的常见原因,并提供相应的解决策略,帮助用户有效排除连接问题。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 解决Parallels Desktop错误15265的方法
    本文详细介绍了在使用Parallels Desktop时遇到错误15265的多种解决方案,包括检查网络连接、关闭代理服务器和修改主机文件等步骤。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 在本文中,我们将探讨如何在Docker环境中高效地管理和利用数据库。首先,需要安装Docker Desktop以确保本地环境准备就绪。接下来,可以从Docker Hub中选择合适的数据库镜像,并通过简单的命令将其拉取到本地。此外,我们还将介绍如何配置和优化这些数据库容器,以实现最佳性能和安全性。 ... [详细]
  • 技术日志:Ansible的安装及模块管理详解 ... [详细]
author-avatar
冬眠2502917261
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有