加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡阳站长网 (https://www.0734zz.cn/)- 数据集成、设备管理、备份、数据加密、智能搜索!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

静默错误:Oracle数据库是如何应对和处理的 ?

发布时间:2018-09-09 21:35:13 所属栏目:MySql教程 来源:盖国强
导读:技术沙龙 | 邀您于8月25日与国美/AWS/转转三位专家共同探讨小程序电商实战 这两天,关于腾讯云『因为静默错误,把创业公司的数据彻底搞丢了』的事件已经传遍了整个互联网,引发了广泛的热议和讨论。 终极故障回放 腾讯云已经于8月7日公布了最近这次事故的根

数据由Oracle写入,并在到达磁盘之前被操作系统或硬件组件干预破坏。这些组件可能包括操作系统,文件系统,卷管理器,设备驱动程序,主机总线适配器和SAN交换结构。虽然Oracle可以在读取数据时检测到损坏,但Oracle可能会在几天或几个月后才读取数据。到那时,用于恢复数据的良好备份可能不再可用。

将块写入不正确的位置

Oracle向磁盘上的特定位置发出写入。不知何故,操作系统或存储系统将块写入错误的位置。这可能导致两个损坏:破坏磁盘上的有效数据并丢失已提交事务中的数据。

Oracle以外的程序对Oracle数据的错误写入

Oracle数据文件可能被非Oracle应用程序覆盖。非Oracle进程或程序可能会意外覆盖Oracle数据文件的内容。这可能是由于应用程序软件,操作系统中的错误或人为错误(例如,意外地将正常操作系统文件复制到Oracle数据文件上)。

损坏的第三方备份

将备份复制到磁带时可能会发生数据损坏。这种类型的损坏特别有害,因为备份用于修复数据损坏。因此,如果备份也已损坏,则无法恢复任何丢失的数据。对于第三方备份尤其如此(其中磁盘存储单元直接将数据复制到备份设备而不通过Oracle。)

可能的HARD检查

在实现Oracle HARD功能的存储系统中,Oracle服务器可以通过大量检查来验证Oracle块结构,块完整性和块位置。如果块在写入时未通过验证,则存储器拒绝写入,从而保护数据的完整性。在系统管理操作期间也可以选择性地禁用HARD验证检查,这可能会暂时使数据处于不一致状态。

关于这里描述的一种情形,让我想到在2010年我帮助用户进行恢复的一个案例,当时记录在博客上,原文:

http://www.eygle.com/archives/2010/11/recover_archivelog_corruption.html

引用一下,用现在的定义就应该属于『静默错误』的范畴:

最近在紧急故障处理时,帮助用户恢复数据库遇到了一则罕见的归档日志损坏案例,在这里和大家分享一下,看看是否有人遇到过类似的问题。

在进行归档recover时,数据库报错,提示归档日志损坏:

  1. ***  
  2. Corrupt block seq: 37288 blocknum=1.  
  3. Bad header found during deleting archived log  
  4. Data in bad block - seq:810559520. bno:170473264. time:707406346  
  5. beg:21280 cks:21061  
  6. calculated check value: 9226  
  7. Reread of seq=37288, blocknum=1, file=/ARCH/arch_1_37288_632509987.dbf, found same corrupt data  
  8. Reread of seq=37288, blocknum=1, file=/ARCH/arch_1_37288_632509987.dbf, found same corrupt data  
  9. Reread of seq=37288, blocknum=1, file=/ARCH/arch_1_37288_632509987.dbf, found same corrupt data  
  10. Reread of seq=37288, blocknum=1, file=/ARCH/arch_1_37288_632509987.dbf, found same corrupt data  
  11. Reread of seq=37288, blocknum=1, file=/ARCH/arch_1_37288_632509987.dbf, found same corrupt data  
  12. *** 

信息比较详细,说37288号归档日志Header损坏,无法读取数据。

提一个小问题:如果你遇到了这样的错误?会怎样思考?

如果这个归档日志损坏了,其实我们仍然有办法跳过去,继续尝试恢复其他日志,但是客户数据重要,不能容忍不一致性,这时候就只能放弃部分数据,由前台重新提交数据了。这在业务上可以实现,也就不是大问题了。

好了,问题是为什么日志会损坏?是如何损坏的?

我首先要做的就是,看看日志文件的内容,通过最简单的命令将日志文件中的内容输出出来:

  1. strings arch_1_37288_632509987.dbf > log.txt 

然后检查生成的这个日志文件,我们就发现了问题。

在这个归档日志文件中,被写入了大量的跟踪文件内容,其中开头部分就是一个跟踪文件的全部信息。

这是一种我从来没有遇到过的现象,也就是说,当操作系统在写出跟踪文件时,错误的覆盖掉了已经存在的归档文件,最后导致归档日志损坏,非常奇妙,从所未见。

最后我的判断是,这个故障应当是操作系统在写出时出现了问题,存在文件的空间仍然被认为是可写的,这样就导致了写冲突,出现这类问题,应当立即检查硬件,看看是否是硬件问题导致了如此严重的异常(日志做了掩码脱敏)。

  1. Dump file /ADMIN/bdump/erp_p007_19216.trc  
  2. Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production  
  3. With the Partitioning, OLAP and Data Mining options  
  4. ORACLE_HOME = /DBMS/erp/erpdb/10g  
  5. Linux  
  6. eygle.com  
  7. 2.6.9-34.ELhugemem  
  8. #1 SMP Fri Feb 24 17:04:34 EST 2006  
  9. i686  
  10. Instance name: erp  
  11. Redo thread mounted by this instance: 1  
  12. Oracle process number: 22  
  13. Unix process pid: 19216, image: oracle@eygle.com (P007)  
  14. *** SERVICE NAME:() 2010-11-10 10:37:26.247  
  15. *** SESSION ID:(2184.1) 2010-11-10 10:37:26.247  
  16. *** 2010-11-10 10:37:26.247  
  17. KCRP: blocks claimed = 61, eliminated = 0  
  18. ----- Recovery Hash Table Statistics ---------  
  19. Hash table buckets = 32768  
  20. Longest hash chain = 1  
  21. Average hash chain = 61/61 = 1.0  
  22. Max compares per lookup = 0  
  23. Avg compares per lookup = 0/61 = 0.0  
  24. ----------------------------------------------  
  25. ----- Recovery Hash Table Statistics ---------  
  26. Hash table buckets = 32768  
  27. Longest hash chain = 1  
  28. Average hash chain = 61/61 = 1.0  
  29. Max compares per lookup = 1  
  30. Avg compares per lookup = 1426/1426 = 1.0  
  31. ----------------------------------------------  
  32. GPAYMENTdxn  
  33. AP_CHECKS  
  34. Q(xn  
  35. .1=N  
  36. Gxn  
  37. .1=N  
  38. ^0e   
  39. ^0e!  
  40. ^0e"  
  41. ^0e#  
  42. ^0e$  
  43. ^0e%  
  44. ^0e&  
  45. ^0e'  
  46. ^0e(  
  47. ^0e)  
  48. ^0e*  
  49. ^0e+  
  50. ^0e+  
  51. ^0e&  
  52. ^ij1  
  53. R0:b  
  54. Q(xn  
  55. PaymentsN  
  56. a'VND  
  57. Userxn  
  58. AP_INVOICE_PAYMENTS  
  59. 105273  
  60. 5406105305-20101020-003  
  61. 3001CASH CLEARING  
  62. CREATED  
  63. Dump file /ADMIN/bdump/erp_p002_19206.trc  
  64. Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production  
  65. With the Partitioning, OLAP and Data Mining options  
  66. ORACLE_HOME = /DBMS/erp/erpdb/10g  
  67. Linux  
  68. eygle.com  
  69. 2.6.9-34.ELhugemem  
  70. #1 SMP Fri Feb 24 17:04:34 EST 2006  
  71. i686  
  72. Instance name: erp  
  73. Redo thread mounted by this instance: 1  
  74. Oracle process number: 17  
  75. Unix process pid: 19206, image: oracle@eygle.com (P002)  
  76. *** SERVICE NAME:() 2010-11-10 10:37:26.263  
  77. *** SESSION ID:(2187.1) 2010-11-10 10:37:26.263  
  78. *** 2010-11-10 10:37:26.263  
  79. KCRP: blocks claimed = 84, eliminated = 0  
  80. ----- Recovery Hash Table Statistics ---------  
  81. Hash table buckets = 32768  
  82. Longest hash chain = 1 
  83. Average hash chain = 84/84 = 1.0  
  84. Max compares per lookup = 0  
  85. Avg compares per lookup = 0/84 = 0.0  
  86. ----------------------------------------------  
  87. ----- Recovery Hash Table Statistics --------  
  88. Hash table buckets = 32768  
  89. Longest hash chain = 1  
  90. Average hash chain = 84/84 = 1.0  
  91. Max compares per lookup = 1  
  92. Avg compares per lookup = 880/880 = 1.0  
  93. ----------------------------------------------  
  94. ^A&A  
  95. ^1b#  
  96. ^1b!  
  97. ^1b"  
  98. ^0e'  
  99. ^Mj8  
  100. ^;&3  
  101. 2010PS_Legal Entity  
  102. ^6&L  
  103. Eoi_VND  
  104. Quick Payment: ID=47708 

如此少见的案例,在此与大家分享。

(编辑:衡阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读