我的编程空间,编程开发者的网络收藏夹
学习永远不晚

聊聊数据库的IO丢失问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

聊聊数据库的IO丢失问题

实际上这种设计是有一个前提的,那就是每个已经写盘的IO,都真实地物理落盘了。这是数据库的数据永远保持一致性的前提,如果这个前提出现了漏洞,那么这个理论上的永远一致性就不存在了。

事实上,数据库的IO链路很长,操作系统、RAID卡、HBA卡、SAN交换机缓冲区、集中式存储机头、集中式存储的写缓冲、磁盘的写缓冲、磁盘,等等。我可能还没有罗列完整,因为在不同的环境中,这个链路还会略微不同。在很多层面,IO都会被优化,因此真实的IO落盘并非和我们想象的一样。如果在云环境中,这个IO路径就更为复杂了。

当IO在这些环节中的某个缓冲中丢失了,那么数据库的底层就会丢失IO了,这个IO丢失会引发一系列的数据不一致。比如一个8K的数据块,前半部分已经写盘,但是后半部分的写IO丢失了,这样就会出现“块断裂”,一个数据块的数据不一致了。

MySQL等数据库使用DOUBLE WRITE BUFFER来解决这个问题,PG则采用FULL PAGE WRITE LOG的机制。Oracle则比较粗犷,完全不管这个问题,让底层存储系统来确保写IO的原子性。究其原因,Oracle自从出生开始,就是和高端硬件关联的,和MySQL/PG这些草根的设计思路完全不同。

数据库面对复杂的底层环境,所以无法确保其基础理论的实现,这个可能会出乎一些朋友的意料。Michael Stonebraker老爷子要搞DBOS,其目的是为数据库提供一个完全以数据库的设计理念为基础的底层环境。这个理想很宏大,实现起来恐怕也是困难重重的。因为这些违背数据库设计理念的设计都是为了优化。一个通用的DBOS可能无法适应不同的数据库产品的通用优化需求。DBOS作为一个数据库SAAS服务的基础平台是可行的,成为一个通用的数据库底座任重道远。

当底层IO出现丢失的时候,Oracle处置起来是最为麻烦的,我想很多Oracle的老DBA也都因此赚了不少钱,昨晚我那个朋友就因为帮人打开了一个出现ORA-600[2662]的数据库而赚了1万块钱的外快。这是因为Oracle的控制文件、REDO、UNDO、数据文件一旦因为IO丢失而出现不一致会引发数据库无法打开的问题。

ORA-01113、ORA-600[2662]、ORA-600[3020]、ORA-600 [4000]、ORA-600[4193]、ORA-600[4194]等错误的出现往往就与这些有关。20年前我在ORACLEFANS网站上也发过不少处置类似问题的文章,在微信公众号里我也写过一篇《如何强制打开无法启动的Oracle数据库》,里面简单地介绍了一些处理方法。    

如果出现ORA-600[2662],整个处理过程会麻烦一些,因为数据库启动的时候发现某个数据文件的SCN已经高于数据库的当前SCN。早期我们可以通过adjust_scn事件来往前推进数据库的当前SCN,从而解决这个问题。Oracle 11.2.0.2.6以后,adjust_scn等待事件被废弃了,如果遇到这种情况,用oradebug 修改内存中的CURRENT SCN也可以起作用。从Oracle 12c开始废弃了这种做法,Oracle又提供了一个EVENT 21307096来解决这个问题(详情请参考《Force Open Database after applying Patch 21307096 (Doc ID 2674196.1)》)。

实际上Oracle数据库IO丢失在SYSTEM表空间中才是最麻烦的,因为在SYSTEM表空间中存在bootstrap objects,还有一个system rollback segment。

如果这些对象丢失了IO,那么就需要使用BBED这样的工具去修复才能避开问题,强行打开数据库。强行打开了丢失IO的数据库之后,大部分数据可以顺利导出,如果某些表上还是存在坏块,需要通过跳过坏块的技术来导出表中的数据。一般来说这个数据库已经不能作为生产库使用了,导出数据后重建数据库是最好的做法。

一般来说这些处置手段都是作为最后的处置手段,如果数据库存在备份,而且备份中丢失的数据在合理的范围内,通过备份恢复数据库可能是更好的做法。遇到这样问题的客户往往是比较慷慨的,因此DBA掌握这些技术,还是有价值的。    

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

聊聊数据库的IO丢失问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

聊聊数据库的IO丢失问题

一般来说这些处置手段都是作为最后的处置手段,如果数据库存在备份,而且备份中丢失的数据在合理的范围内,通过备份恢复数据库可能是更好的做法。

面试官让我聊聊 MQ 的数据丢失问题,没想到水这么深

如果每天产生几十TB的数据,难道都写一台机器的磁盘上吗?这明显是不靠谱的啊!
MQ数据丢失2024-12-13

聊聊PG数据库的防误删除问题

实际上在使用比较复杂的方式恢复数据之前,我们还有更好的解决方法,比如使用psql工具的时候,把自动提交关闭,这样的话在第一时间,我们还可以通过DDL ROLLBACK来实现最简单的恢复。养成好的习惯或者规范化操作行为也是避免出大事的最好的方

聊聊国产数据库迁移中的表连接性能问题

实际上SQL最容易出问题的地方还是表连接,单表的访问,哪怕走错了索引,SQL跑的慢点了,影响还没那么严重。表连接的执行计划出问题了,可能在Oracle上秒出的SQL,几个小时都跑不出来。

解决vuex数据丢失问题

本文主要介绍了解决vuex 数据丢失问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-02-02

聊聊使用FURPS模型做数据库选型评估中的一些问题

给出的评估结果可能相去甚远。比如在易用性上,熟悉Mysql的人肯定不会给MYSQL打低分,而对于不熟悉的Postgresql,肯定给出低分,反过来也是如此。并不是说Mysql和Postgresql本身就在这个对比项上就一定有这样的差距,所处

聊聊几个小数取整函数的问题

在c++的cmath库中提供了几个小数取整的函数ceil() floor() round() trunc,我们可以根据不同的场景去选用它们。
c++函数场景2024-12-03

聊聊数据库勒索病毒的防范

勒索病毒问题在全世界十分泛滥,我国的数据库中勒索病毒虽然也不少,但是还不算重灾区。中病毒的大多数都是中小企业,数据库管理水平比较低,备份,容灾等措施也十分不到位。

聊聊数据库的事务隔离级别

数据库的多种事务隔离级别是想为应用开发者提供不同的并发控制,从而适应各种不同的应用应用场景。这在T/S架构流行的80/90年代应用广泛。那时候所有的计算都只能在主机或者小型机上完成,因此数据库提供的这个功能可以大大简化应用开发。

聊聊数据库建表的15个小技巧

今天就跟大家一起聊聊,数据库建表的15个小技巧,希望对你会有所帮助。

聊聊国产数据库的高可用架构

国产数据库大多数已经模仿Oracle构建了自己的完整的高可用架构,以达梦数据库为例,就有一整套对标Oracle的技术栈来确保业务系统的高可用。

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录