热门标签 | 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月份的错误操作导致了半年后的一次严重事故。类似这样的案例可能很多运维人员都遇到过,可能很多人犯过类似的错误而不自知吧。

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



推荐阅读
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 从Oracle安全移植到国产达梦数据库的DBA实践与攻略
    随着我国对信息安全和自主可控技术的重视,国产数据库在党政机关、军队和大型央企等行业中得到了快速应用。本文介绍了如何降低从Oracle到国产达梦数据库的技术门槛,保障用户现有业务系统投资。具体包括分析待移植系统、确定移植对象、数据迁移、PL/SQL移植、校验移植结果以及应用系统的测试和优化等步骤。同时提供了移植攻略,包括待移植系统分析和准备移植环境的方法。通过本文的实践与攻略,DBA可以更好地完成Oracle安全移植到国产达梦数据库的工作。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
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社区 版权所有