IT 邦德

凌晨突发,机房掉电存储故障,BBED一行命令挽救整个数据库!

在Oracle数据库管理领域,BBED(Block Browser and EDitor)是一个充满传奇色彩的底层工具。它被广大DBA誉为“Oracle的终极手术刀”——能力巨大,风险并存。今天,我们将深入解析这个神秘而强大的工具。

数据灾难降临,常规手段全部失效,你该怎么办?今天就带大家一起复盘下这次机房掉电存储故障导致的数据库无法启动。

1.故障现象

由于突然掉电导致存储故障,所以控制文件也损害了,重建控制文件后启动数据库报如下的错误。

Image

2.排查过程

进行深度故障排查,通过以下命令

oradebug setmypid; 
oradebug tracefile_name 
oradebug event 10046 trace name context forever,level 4 
alter database open; 

发现trace文件中显示系统表空间文件需要恢复

Image

介质恢复(Media Recovery)是在数据文件本身不一致,此时查询数据文件头部SCN号发现不一致

SQL> select name,checkpoint_change# from v$datafile_header;
NAME         CHECKPOINT_CHANGE#
-------------------------------------------------- ------------------
/oracle/app/oracle/oradata/system01.dbf       368910
/oracle/app/oracle/oradata/sysaux01.dbf       368910
/oracle/app/oracle/oradata/undotbs01.dbf       368910
/oracle/app/oracle/oradata/users01.dbf         368910
/oracle/app/oracle/oradata/histroy.dbf         368250

3.BBED修复

3.1 什么是BBED?

BBED是Oracle提供的一个底层数据块浏览和编辑工具,允许DBA直接在物理层面查看和修改数据块。它绕过了Oracle的正常访问机制,直接操作数据文件,这使其成为数据恢复的终极手段。

3.2 修改数据块的SCN

现在我们可以看到,经过破坏,histroy.dbf文件的scn与其他正常数据文件的scn不一致,导致了数据库无法打开。要进行介质修复后,才可以打开。

bbed parfile=bbed.par

BBED> p kcvfhckp
struct kcvfhckp, 36 bytes                   @484     
   struct kcvcpscn, 8 bytes                 @484     
      ub4 kscnbas                           @484      0x000ec8ce
      ub2 kscnwrp                           @488      0x0000
   ub4 kcvcptim                             @492      0x3b478a75
   ub2 kcvcpthr                             @496      0x0001
   union u, 12 bytes                        @500     
      struct kcvcprba, 12 bytes             @500     
         ub4 kcrbaseq                       @500      0x00000008
         ub4 kcrbabno                       @504      0x00000025
         ub2 kcrbabof                       @508      0x0010
   ub1 kcvcpetb[0]                          @512      0x02
   ub1 kcvcpetb[1]                          @513      0x00
   ub1 kcvcpetb[2]                          @514      0x00
   ub1 kcvcpetb[3]                          @515      0x00
   ub1 kcvcpetb[4]                          @516      0x00
   ub1 kcvcpetb[5]                          @517      0x00
   ub1 kcvcpetb[6]                          @518      0x00
   ub1 kcvcpetb[7]                          @519      0x00

正常文件的头

BBED> d offset 484 dba 3,1
 File: /oracle/app/oracle/oradata/system01.dbf (3)
 Block: 1                Offsets:  484 to  509           Dba:0x00c00001
------------------------------------------------------------------------
 cec80e00 00000000 758a473b 01000000 08000000 25000000 1000 

异常文件的头

BBED> d offset 484 dba 4,1
 File: /oracle/app/oracle/oradata/histroy.dbf (4)
 Block: 1                Offsets:  484 to  509           Dba:0x01000001
------------------------------------------------------------------------
 3fc60e00 00006d09 7986473b 01000adb 05000000 02000000 1000

修改histroy.DBF文件头

BBED> modify /x cec8 dba 4,1 offset 484
 File: /oracle/app/oracle/oradata/histroy.dbf (4)
 Block: 1                Offsets:  484 to  509           Dba:0x01000001
------------------------------------------------------------------------
 cec80e00 00006d09 7986473b 01000adb 05000000 02000000 1000 7986473b 01000adb 05000000 02000000 1000 

3.3.启动数据库

SQL> alter database open resetlogs
Image

4.注意事项

根据Oracle专家认证指南,使用BBED必须遵循以下原则:

事前备份:操作前必须对数据文件进行完整备份

环境复制:优先在测试环境复现问题

精确操作:每次修改都必须精确计算偏移量和数值

详细记录:记录每个操作步骤和修改内容

团队协作:重要操作需要双人复核

5.总结

BBED是Oracle DBA工具箱中的终极武器,它提供了无与伦比的底层访问能力。然而,正如一句技术格言所说:“能力越大,责任越大”。在使用BBED时,必须极其谨慎,严格遵循操作规程,否则可能造成灾难性后果。

只有在Oracle技术支持明确建议或其他方法无法解决的紧急情况下,才应考虑使用这一工具。对于大多数DBA来说,希望您永远不会有用到BBED的一天,但了解它的存在和基本原理,是专业DBA知识体系的重要组成。