当前位置: 首页 > BACKUP & RESTORE > 正文

           11GORACLE提供DBMS_DDL_INTERNAL.SWAP_BOOTSTRAP直接切换boostrap表到用户指定的表,但是前提数据库必须启动到upgrade状态,如果bootstrap块损坏,数据库都不能启动,当然也不能使用DBMS_DDL_INTERNAL.SWAP_BOOTSTRAPDBMS_DDL_INTERNAL.SWAP_BOOTSTRAP这个工具还是有很多作用的,将在后面会测试。

           下面是测试直接使用dd清除bootstrap$表的块,再使用dd其它数据库的块来恢复bootstrap$ge 。注意下面测试平台,请非在生产环境测试。

1 环境介绍

是在linux平台,ORACLE 11.2.0.3环境下,其它的环境没有做测试

www.cdhtz.com > select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE    11.2.0.3.0      Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production
www.cdhtz.com > !uname -a
Linux orcl9i 2.6.9-89.EL #1 Mon Apr 20 10:22:29 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
2 BOOTSTRAP$
www.cdhtz.com > select open_mode from v$database;
OPEN_MODE
--------------------
READ WRITE
www.cdhtz.com > select name from v$dbfile;

NAME
--------------------------------------------------------------------------------
/oracle/app/oracle/oradata/orcl1123/system01.dbf
/oracle/app/oracle/oradata/orcl1123/sysaux01.dbf
/oracle/app/oracle/oradata/orcl1123/undo1.dbf
/oracle/app/oracle/oradata/orcl1123/user02.dbf
/oracle/app/oracle/oradata/orcl1123/user01.dbf
这里可以看到BOOTSTRAP$表使用的块是520到527
www.cdhtz.com > @extent.sql
Enter value for owner: sys
Enter value for segment_name: bootstrap$
Enter value for tablespace_name:

                          FILE                  BLOCK                     
OWNER:SEGMENT_NAME          ID   FNO  EXTENT_ID BEGIN_END                 
------------------------ ----- ----- ---------- ------------------------- 
SYS.BOOTSTRAP$               1     1          0 520~527                   
******************************                                            
Total:                                                                                                                                                                                                                      
www.cdhtz.com > shutdown immediate;                                       
Database closed.                                                          
Database dismounted.                                                      
ORACLE instance shut down.
3 dd数据文件
这里dd数据的时候,千万要记住在conv=notrunc增加上,不然后果就悲剧了
www.cdhtz.com > !dd if=/dev/zero of=/oracle/app/oracle/oradata/orcl1123/system01.dbf bs=8192 seek=520 count=8 conv=notrunc 
8+0 records in                                                                                                             
8+0 records out
4 数据库报坏块
www.cdhtz.com > startup                                                     
ORACLE instance started.                                                    

Total System Global Area 2137886720 bytes                                   
Fixed Size                  2230072 bytes                                   
Variable Size            1493174472 bytes                                   
Database Buffers          637534208 bytes                                   
Redo Buffers                4947968 bytes                                   
Database mounted.                                                           
ORA-01092: ORACLE instance terminated. Disconnection forced                 
ORA-00704: bootstrap process failure                                        
ORA-01578: ORACLE data block corrupted (file # 1, block # 520)              
ORA-01110: data file 1: '/oracle/app/oracle/oradata/orcl1123/system01.dbf'  
Process ID: 14852                                                           
Session ID: 1 Serial number: 5   
这里可以看到数据库启动的时候报520是坏块的错误     
下面来看看10046生成的TRACE文件信息
www.cdhtz.com > oradebug setmypid                                            
Statement processed.                                                         
www.cdhtz.com > oradebug event 10046 trace name context forever,level 12;    
Statement processed.                                                         
www.cdhtz.com > oradebug tracefile_name;                                     
/oracle/app/oracle/diag/rdbms/orcl1123/orcl1123/trace/orcl1123_ora_15095.trc 
WAIT #182936778792: nam='instance state change' ela= 874 layer=2 value=1 waited=1 obj#=-1 tim=1416486056350145             
WAIT #182936778792: nam='db file sequential read' ela= 9 file#=1 block#=520 blocks=1 obj#=-1 tim=1416486056350361          
Hex dump of (file 1, block 520)   
这里可以看到dump 520这个块的内容,从这里可以看到块完全是一个空块                                                                                        
Dump of memory from 0x00000000B2F66000 to 0x00000000B2F68000                                                               
0B2F66000 0000A200 00400208 00000000 01010000  [......@.........]                                                          
0B2F66010 00000000 00000000 00000000 00000000  [................]                                                          
        Repeat 509 times                                                                                                   
0B2F67FF0 00000000 00000000 00000000 00000001  [................]                                                          
Corrupt block relative dba: 0x00400208 (file 1, block 520)                                                                 
Completely zero block found during buffer read                                                                             
Reading datafile '/oracle/app/oracle/oradata/orcl1123/system01.dbf' for corruption at rdba: 0x00400208 (file 1, block 520) 
WAIT #182936778792: nam='Disk file Mirror Read' ela= 4 fileno=1 blkno=520 filetype=0 obj#=-1 tim=1416486056351002          
Reread (file 1, block 520) found same corrupt data (no logical check)                                                      
...............
Byte offset to file# 1 block# 520 is 4259840                                                                                             
Incident 464209 created, dump file: /oracle/app/oracle/diag/rdbms/orcl1123/orcl1123/incident/incdir_464209/orcl1123_ora_15095_i464209.trc
ORA-01578: ORACLE data block corrupted (file # 1, block # 520)                                                                           
ORA-01110: data file 1: '/oracle/app/oracle/oradata/orcl1123/system01.dbf'                                                               

ORA-00704: bootstrap process failure                                                                                                     
ORA-01578: ORACLE data block corrupted (file # 1, block # 520)                                                                           
ORA-01110: data file 1: '/oracle/app/oracle/oradata/orcl1123/system01.dbf'                                                               
ORA-00704: bootstrap process failure                                                                                                     
ORA-01578: ORACLE data block corrupted (file # 1, block # 520)                                                                           
ORA-01110: data file 1: '/oracle/app/oracle/oradata/orcl1123/system01.dbf'                                                               

*** 2014-11-20 20:20:58.149                                                                                                              
USER (ospid: 15095): terminating the instance due to error 704                                                                           
EXEC #182936778792:c=726890,e=1999361,p=1,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=0,tim=1416486058194414                                      
ERROR #182936778792:err=1092 tim=1416486058194441

5 DD复制其它数据库块

www.cdhtz.com > !dd if=/oracle/app/oracle/oradata/test/system01.dbf of=/oracle/app/oracle/oradata/orcl1123/system01.dbf bs=8192 count=8 seek=520 skip=520 conv=notrunc
8+0 records in
8+0 records out
这里直接使用dd复制其它数据库的块过来,因为bootstrap$在相同的版本内容都是一致的,其实基本上不会发生变化的。其实使用DD复制还可以使用system undo段的。

[oracle@www.htz.pw sql]$sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Thu Nov 20 20:23:16 2014

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to an idle instance.

www.cdhtz.com > startup
ORACLE instance started.

Total System Global Area 2137886720 bytes
Fixed Size                  2230072 bytes
Variable Size            1493174472 bytes
Database Buffers          637534208 bytes
Redo Buffers                4947968 bytes
Database mounted.
Database opened.
这里看到数据库已经正常启动
下面查看一下块的kcbh的信息
www.cdhtz.com > select instance_name,status from v$instance;

INSTANCE_NAME    STATUS
---------------- ------------
orcl1123         OPEN

BBED> set block 520
        BLOCK#          520

BBED> map
 File: /oracle/app/oracle/oradata/orcl1123/system01.dbf (0)
 Block: 520                                   Dba:0x00000000
------------------------------------------------------------
 Unlimited Data Segment Header

 struct kcbh, 20 bytes                      @0      

 struct ktech, 72 bytes                     @20     

 struct ktemh, 16 bytes                     @92     

 struct ktetb[1], 8 bytes                   @108    

 struct ktshc, 8 bytes                      @4148   

 struct ktsfs_seg[1], 20 bytes              @4156   

 struct ktsfs_txn[16], 320 bytes            @4176   

 ub4 tailchk                                @8188   

BBED> p kcbh
struct kcbh, 20 bytes                       @0      
   ub1 type_kcbh                            @0        0x10
   ub1 frmt_kcbh                            @1        0xa2
   ub1 spare1_kcbh                          @2        0x00
   ub1 spare2_kcbh                          @3        0x00
   ub4 rdba_kcbh                            @4        0x00400208
   ub4 bas_kcbh                             @8        0x00000252
   ub2 wrp_kcbh                             @12       0x0000
   ub1 seq_kcbh                             @14       0x01
   ub1 flg_kcbh                             @15       0x04 (KCBHFCKV)
   ub2 chkval_kcbh                          @16       0xe443
   ub2 spare3_kcbh                          @18       0x0000
BBED> set block 519
        BLOCK#          519

BBED> map
 File: /oracle/app/oracle/oradata/orcl1123/system01.dbf (0)
 Block: 519                                   Dba:0x00000000
------------------------------------------------------------
 KTB Data Block (Index Leaf)

 struct kcbh, 20 bytes                      @0      

 struct ktbbh, 72 bytes                     @20     

 struct kdxle, 32 bytes                     @92     

 sb2 kd_off[359]                            @124    

 ub1 freespace[234]                         @842    

 ub1 rowdata[7044]                          @1076   

 ub4 tailchk                                @8188   

BBED> p kcbh
struct kcbh, 20 bytes                       @0      
   ub1 type_kcbh                            @0        0x06
   ub1 frmt_kcbh                            @1        0xa2
   ub1 spare1_kcbh                          @2        0x00
   ub1 spare2_kcbh                          @3        0x00
   ub4 rdba_kcbh                            @4        0x00400207
   ub4 bas_kcbh                             @8        0x005cea63
   ub2 wrp_kcbh                             @12       0x0000
   ub1 seq_kcbh                             @14       0x01
   ub1 flg_kcbh                             @15       0x06 (KCBHFDLC, KCBHFCKV)
   ub2 chkval_kcbh                          @16       0x8f8a
   ub2 spare3_kcbh                          @18       0x0000
这里发现2个块的SCN值完全不一样,怀疑ORACLE在启动的时候没有去验证BOOTSTRAP$块的SCN值的情况,后面再去测试一下
6 DBV验证数据文件
www.cdhtz.com > !dbv file=/oracle/app/oracle/oradata/orcl1123/system01.dbf

DBVERIFY: Release 11.2.0.3.0 - Production on Thu Nov 20 22:32:26 2014

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

DBVERIFY - Verification starting : FILE = /oracle/app/oracle/oradata/orcl1123/system01.dbf
Page 392 is marked corrupt
Corrupt block relative dba: 0x00400188 (file 1, block 392)
Completely zero block found during dbv:

Page 393 is marked corrupt
Corrupt block relative dba: 0x00400189 (file 1, block 393)
Completely zero block found during dbv:

Page 394 is marked corrupt
Corrupt block relative dba: 0x0040018a (file 1, block 394)
Completely zero block found during dbv:

Page 395 is marked corrupt
Corrupt block relative dba: 0x0040018b (file 1, block 395)
Completely zero block found during dbv:

Page 396 is marked corrupt
Corrupt block relative dba: 0x0040018c (file 1, block 396)
Completely zero block found during dbv:

Page 397 is marked corrupt
Corrupt block relative dba: 0x0040018d (file 1, block 397)
Completely zero block found during dbv:

Page 398 is marked corrupt
Corrupt block relative dba: 0x0040018e (file 1, block 398)
Completely zero block found during dbv:

Page 399 is marked corrupt
Corrupt block relative dba: 0x0040018f (file 1, block 399)
Completely zero block found during dbv:

这里报393与399是由于I_FILE1索引的原因,在之前DD清空I_FILE1块。
原来做的操作
www.cdhtz.com > !dd if=/dev/zero of=/oracle/app/oracle/oradata/orcl1123/system01.dbf bs=8192 seek=392 count=8 conv=notrunc
8+0 records in
8+0 records out

DBVERIFY - Verification complete

Total Pages Examined         : 96000
Total Pages Processed (Data) : 64163
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 13644
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 3531
Total Pages Processed (Seg)  : 1
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 14654
Total Pages Marked Corrupt   : 8
Total Pages Influx           : 0
Total Pages Encrypted        : 0
Highest block SCN            : 1080566554 (0.1080566554)

recover bootstrap$ corrupt block with dd tool:等您坐沙发呢!

发表评论

gravatar

? razz sad evil ! smile oops grin eek shock ??? cool lol mad twisted roll wink idea arrow neutral cry mrgreen

快捷键:Ctrl+Enter