Welcome 微信登录

首页 / 数据库 / MySQL / Oracle undo坏块测试和修复

UNDO段头块损坏测试与修复,本次案例通过BBED工具模拟UNDO段头坏块,并在没有备份情况下启动数据库;1 查看UNDO段头块位置select header_file, header_block  from dba_segments where segment_name like "_SYSSMU%" order by 2;2 通过BBED工具,破坏UNDO某一段的段头块(file=3 block=280)破坏的方式是直接将其他的数据块覆盖段头块[Oracle11@primary ~]$ bbed parfile=bbed.parPassword:BBED: Release 2.0.0.0.0 - Limited Production on Sat Jul 30 18:00:26 2016Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.************* !!! For Oracle Internal Use only !!! ***************BBED> copy dba 1,1 to dba 3,280BBED> sum apply;Check value for File 3, Block 280:current = 0x599e, required = 0x599e
 BBED> verifyDBVERIFY - Verification startingFILE = /u02/app/oracle/oradata/orcl11/undotbs01.dbfBLOCK = 280Block 280 is corruptCorrupt block relative dba: 0x00400118 (file 0, block 280)Bad header found during verificationData in bad block: type: 11 format: 2 rdba: 0x00400001 last change scn: 0x0000.00000000 seq: 0x1 flg: 0x04 spare1: 0x0 spare2: 0x0 spare3: 0x0 consistency value in tail: 0x00000b01 check value in block header: 0xc8c7 computed block checksum: 0x0DBVERIFY - Verification completeTotal Blocks Examined       : 1Total Blocks Processed (Data) : 0Total Blocks Failing (Data) : 0Total Blocks Processed (Index): 0Total Blocks Failing (Index): 0Total Blocks Empty            : 0Total Blocks Marked Corrupt : 1Total Blocks Influx         : 0Message 531 not found;  product=RDBMS; facility=BBED---通过BBED和DBV检查结果都是file3,block 280损坏[oracle11@primary orcl11]$ dbv file=undotbs01.dbf DBVERIFY: Release 11.2.0.4.0 - Production on Sat Jul 30 18:01:38 2016Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.DBVERIFY - Verification starting : FILE = /u02/app/oracle/oradata/orcl11/undotbs01.dbfPage 280 is marked corruptCorrupt block relative dba: 0x00c00118 (file 3, block 280)Bad header found during dbv: Data in bad block: type: 11 format: 2 rdba: 0x00400001 last change scn: 0x0000.00000000 seq: 0x1 flg: 0x04 spare1: 0x0 spare2: 0x0 spare3: 0x0 consistency value in tail: 0x00000b01 check value in block header: 0xc8c7 computed block checksum: 0x0DBVERIFY - Verification completeTotal Pages Examined       : 392Total Pages Processed (Data) : 0Total Pages Failing (Data) : 0Total Pages Processed (Index): 0Total Pages Failing (Index): 0Total Pages Processed (Other): 45Total Pages Processed (Seg)  : 23Total Pages Failing (Seg)  : 0Total Pages Empty            : 346Total Pages Marked Corrupt : 1Total Pages Influx         : 0Total Pages Encrypted        : 0Highest block SCN            : 1283208 (0.1283208)---模拟异常断电SQL> shutdown abortORACLE instance shut down.---启动数据库,报错ORA-01578SQL> startupORACLE instance started.Total System Global Area  784998400 bytesFixed Size                  2257352 bytesVariable Size           515903032 bytesDatabase Buffers          264241152 bytesRedo Buffers                2596864 bytesDatabase mounted.ORA-01092: ORACLE instance terminated. Disconnection forcedORA-01578: ORACLE data block corrupted (file # 3, block # 280)ORA-01110: data file 3: "/u02/app/oracle/oradata/orcl11/undotbs01.dbf"Process ID: 8265Session ID: 1 Serial number: 5通常UNDO损坏,在没有备份的情况下,可以通过以下方式启动数据库#*.undo_tablespace="UNDOTBS1"     ----注释原UNDO表空间#*.undo_management=AUTO            ----UNDO管理方式改为手动*.undo_management="MANUAL"*.undo_tablespace="SYSTEM"            ---将UNDO表空间改成SYSTEM*._corrupted_rollback_segments=损坏的回滚段    ---屏蔽损坏的UNDO段创建新的回滚段:create undo tablespace UNDOTBS2 datafile "/u02/app/oracle/oradata/orcl11/undotbs02.dbf" size 1M autoextend on;删除旧的回滚段:drop tablespace UNDOTBS1 including contents and datafiles;*.undo_tablespace="UNDOTBS2"*.undo_management=AUTO但是在mount状态下无法查询(创建或删除)回滚段SQL> select * from v$rollname;select * from v$rollname              *ERROR at line 1:ORA-01219: database not open: queries allowed on fixed tables/views only无法创建新的UNDO表空间SQL> create undo tablespace UNDOTBS2 datafile "/u02/app/oracle/oradata/orcl11/undotbs02.dbf" size 1M autoextend on;create undo tablespace UNDOTBS2 datafile "/u02/app/oracle/oradata/orcl11/undotbs02.dbf" size 1M autoextend on*ERROR at line 1:ORA-01109: database not open无法删除旧的UNDO表空间SQL> drop tablespace UNDOTBS1 including contents and datafiles;drop tablespace UNDOTBS1 including contents and datafiles*ERROR at line 1:ORA-01109: database not open在数据库不能OPEN情况下,有两种方式可以查询数据库部分信息;1:strings命令可以查询所有的UNDO回滚段名,包括已经删除的回滚段;[oracle11@primary orcl11]$ strings system01.dbf | grep _SYSSMU | cut -d $ -f 1 | sort -u > listSMU[oracle11@primary orcl11]$ vim listSMU_SYSSMU20_3293637928$_SYSSMU20_379396250$_SYSSMU20_379396250$_SYSSMU13_811223436$........2:BBED工具也可以查询UNDO段名;BBED> set file 1 block 225  -----Oracle 11g版本,undo$表信息一般位于1号文件第225个数据块中        FILE#         1        BLOCK#       225BBED> map File: /u02/app/oracle/oradata/orcl11/system01.dbf (1) Block: 225                                 Dba:0x004000e1------------------------------------------------------------ KTB Data Block (Table/Cluster) struct kcbh, 20 bytes                      @0        struct ktbbh, 48 bytes                   @20       struct kdbh, 14 bytes                      @68       struct kdbt[1], 4 bytes                    @82       sb2 kdbr[25]                             @86      -------含有25个UNDO段 ub1 freespace[6402]                        @136      ub1 rowdata[1650]                          @6538     ub4 tailchk                                @8188    BBED> p kdbrsb2 kdbr[0]                               @86     8078sb2 kdbr[1]                               @88     8011sb2 kdbr[2]                               @90     7944......sb2 kdbr[22]                                @130      6603sb2 kdbr[23]                                @132      6537sb2 kdbr[24]                                @134      6470BBED> x /rnc *kdbr[0]        ----查看0号UNDO段名称col    1[6] @8151: SYSTEMBBED> x /rnc *kdbr[1]        ----查看1号UNDO段名称col 1[20] @8085: _SYSSMU1_4115952380$
如果UNDO段特别多,可以通过EXECL,自动生成多个x /rnc *kdbr[0]......*kdbr[n]命令,再将命令复制粘贴到BBED中,同时获取多个UNDO段名;
 x /rnc *kdbr[0]
  x /rnc *kdbr[1]
  x /rnc *kdbr[2]
  x /rnc *kdbr[3]
 ...... x /rnc *kdbr[24]
 如果不能判断具体哪个回滚段出现问题,可以跳过所有的回滚段*._corrupted_rollback_segments="_SYSSMU1_4115952380$","_SYSSMU2_3882698531$","_SYSSMU3_1780844141$","_SYSSMU4_1137450214$","_SYSSMU5_2972601029$","_SYSSMU6_2318781079$","_SYSSMU7_1865616030$","_SYSSMU8_4279519761$","_SYSSMU9_1551968587$","_SYSSMU10_2324134815$","_SYSSMU11_2069826877$","_SYSSMU12_2242918609$","_SYSSMU13_811223436$","_SYSSMU14_1093125402$","_SYSSMU15_2825991097$","_SYSSMU16_252471872$","_SYSSMU17_3347133763$","_SYSSMU18_1765883319$","_SYSSMU19_1005333767$","_SYSSMU20_3293637928$","_SYSSMU21_3641740596$","_SYSSMU22_3421614834$","_SYSSMU23_138031739$"参数文件:#*.undo_tablespace="UNDOTBS1"#*.undo_management=AUTO*.undo_tablespace="SYSTEM"*.undo_management="MANUAL"*._corrupted_rollback_segments="_SYSSMU1_4115952380$","_SYSSMU2_3882698531$","_SYSSMU3_1780844141$","_SYSSMU4_1137450214$","_SYSSMU5_2972601029$","_SYSSMU6_2318781079$","_SYSSMU7_1865616030$","_SYSSMU8_4279519761$","_SYSSMU9_1551968587$","_SYSSMU10_2324134815$","_SYSSMU11_2069826877$","_SYSSMU12_2242918609$","_SYSSMU13_811223436$","_SYSSMU14_1093125402$","_SYSSMU15_2825991097$","_SYSSMU16_252471872$","_SYSSMU17_3347133763$","_SYSSMU18_1765883319$","_SYSSMU19_1005333767$","_SYSSMU20_3293637928$","_SYSSMU21_3641740596$","_SYSSMU22_3421614834$","_SYSSMU23_138031739$"                   
 SQL> shutdown immediate
 SQL> startupORACLE instance started.Total System Global Area  784998400 bytesFixed Size                  2257352 bytesVariable Size           515903032 bytesDatabase Buffers          264241152 bytesRedo Buffers                2596864 bytesDatabase mounted.Database opened.创建新的UNDO表空间create undo tablespace UNDOTBS2 datafile "/u02/app/oracle/oradata/orcl11/undotbs02.dbf" size 1M autoextend on;删除旧的UNDO表空间drop tablespace UNDOTBS1 including contents and datafiles;修改参数文件*.undo_tablespace="UNDOTBS2"*.undo_management=AUTO#*.undo_tablespace="SYSTEM"#*.undo_management="MANUAL"#*._corrupted_rollback_segments="_SYSSMU1_4115952380$","_SYSSMU2_3882698531$","_SYSSMU3_1780844141$","_SYSSMU4_1137450214$","_SYSSMU5_2972601029$","_SYSSMU6_2318781079$","_SYSSMU7_1865616030$","_SYSSMU8_4279519761$","_SYSSMU9_1551968587$","_SYSSMU10_2324134815$","_SYSSMU11_2069826877$","_SYSSMU12_2242918609$","_SYSSMU13_811223436$","_SYSSMU14_1093125402$","_SYSSMU15_2825991097$","_SYSSMU16_252471872$","_SYSSMU17_3347133763$","_SYSSMU18_1765883319$","_SYSSMU19_1005333767$","_SYSSMU20_3293637928$","_SYSSMU21_3641740596$","_SYSSMU22_3421614834$","_SYSSMU23_138031739$"SQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> startupORACLE instance started.Total System Global Area  784998400 bytesFixed Size                  2257352 bytesVariable Size           515903032 bytesDatabase Buffers          264241152 bytesRedo Buffers                2596864 bytesDatabase mounted.Database opened.SQL> show parameter undoNAME                               TYPE        VALUE------------------------------------ ----------- ------------------------------undo_management                      string      AUTOundo_retention                     integer   900undo_tablespace                      string      UNDOTBS2BBED修改数据块是比较危险的操作,如果某个修改操作有误,可以通过revert或undo命令回退BBED的修改操作;例如:BBED回退3,280块上所有修改BBED> revert dba 3,280All changes made to this block will be rolled back. Proceed? (Y/N) yReverted file "/u02/app/oracle/oradata/orcl11/undotbs01.dbf", block 280BBED> sum apply;Check value for File 3, Block 280:current = 0x3f90, required = 0x3f90UNDO非段头(文件头)块损坏测试与修复undo非段头(文件头)损坏,数据库可以正常启动,在没有备份的情况下,可以通过alert报错信息,找到并删除受损的回滚段SQL> insert into t values(1);      -----插入一条数据,不提交SQL> select usn,status,xacts from v$rollstat;     USN STATUS             XACTS   ---------- ---------------         ----------       0 ONLINE                 0       8 ONLINE                 0       9 ONLINE                 1         ----9号回滚段存在活动事物        10 ONLINE                 0        11 ONLINE                 0        12 ONLINE                 0        24 ONLINE                 0        25 ONLINE                 0        26 ONLINE                 0        27 ONLINE                 0        28 ONLINE                 011 rows selected.---查看回滚段头块位置SQL> SET LINE 100SQL> col segment_name for a30SQL> select segment_name,header_file,header_block from dba_segments where segment_name like "_SYSSMU%" order by 3;SEGMENT_NAME                 HEADER_FILE HEADER_BLOCK------------------------------ ----------- ------------_SYSSMU8_4161384913$                   3            8_SYSSMU9_1458183674$                   3         24_SYSSMU10_2644453179$                    3         40_SYSSMU11_4737420$                     3         56_SYSSMU12_392022772$                   3         72_SYSSMU24_4044825012$                    3         88_SYSSMU25_2098992521$                    3          104_SYSSMU26_2158116475$                    3          120_SYSSMU27_4048022843$                    3          136_SYSSMU28_1413754230$                    3          15210 rows selected.通过BBED工具,手动破坏9号回滚段非头块;[oracle11@primary ~]$ bbed parfile=bbed.parPassword: BBED: Release 2.0.0.0.0 - Limited Production on Sat Aug 13 22:35:38 2016Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.************* !!! For Oracle Internal Use only !!! ***************BBED> copy dba 1,1 to dba 3,25BBED> sum apply;Check value for File 3, Block 25:current = 0xae9a, required = 0xae9aBBED> verifyDBVERIFY - Verification startingFILE = /u02/app/oracle/oradata/orcl11/undotbs01.dbfBLOCK = 25Block 25 is corruptCorrupt block relative dba: 0x00400019 (file 3, block 25)Bad header found during verificationData in bad block: type: 11 format: 2 rdba: 0x00400001 last change scn: 0x0000.00000000 seq: 0x1 flg: 0x04 spare1: 0x0 spare2: 0x0 spare3: 0x0 consistency value in tail: 0x00000b01 check value in block header: 0xae9a computed block checksum: 0x0DBVERIFY - Verification completeTotal Blocks Examined       : 1Total Blocks Processed (Data) : 0Total Blocks Failing (Data) : 0Total Blocks Processed (Index): 0Total Blocks Failing (Index): 0Total Blocks Empty            : 0Total Blocks Marked Corrupt : 1Total Blocks Influx         : 0Message 531 not found;  product=RDBMS; facility=BBED[oracle11@primary orcl11]$ dbv file=undotbs01.dbf DBVERIFY: Release 11.2.0.4.0 - Production on Wed Aug 17 11:39:35 2016Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.DBVERIFY - Verification starting : FILE = /u02/app/oracle/oradata/orcl11/undotbs01.dbfPage 25 is marked corruptCorrupt block relative dba: 0x00c00019 (file 3, block 25)Bad header found during dbv: Data in bad block: type: 11 format: 2 rdba: 0x00400001 last change scn: 0x0000.00000000 seq: 0x1 flg: 0x04 spare1: 0x0 spare2: 0x0 spare3: 0x0 consistency value in tail: 0x00000b01 check value in block header: 0xae9a computed block checksum: 0x0DBVERIFY - Verification completeTotal Pages Examined       : 208Total Pages Processed (Data) : 0Total Pages Failing (Data) : 0Total Pages Processed (Index): 0Total Pages Failing (Index): 0Total Pages Processed (Other): 88Total Pages Processed (Seg)  : 10Total Pages Failing (Seg)  : 0Total Pages Empty            : 119Total Pages Marked Corrupt : 1Total Pages Influx         : 0Total Pages Encrypted        : 0Highest block SCN            : 1570655 (0.1570655)SQL> shutdown abortORACLE instance shut down.SQL> startupORACLE instance started.Total System Global Area  784998400 bytesFixed Size                  2257352 bytesVariable Size           515903032 bytesDatabase Buffers          264241152 bytesRedo Buffers                2596864 bytesDatabase mounted.Database opened.数据库可以正常启动,后台alert日志也没有报错,通过dbv或者bbed工具检查出坏块后,可以手动删除坏块对应的undo段:(1):select * from dba_extents where file_id=xx and xxx between block_id and block_id+blocks-1;(2):DROP ROLLBACK SEGMENT rollback_segment; 或者直接新建UNDO表空间:(1):创建新的UNDO表空间create undo tablespace UNDOTBS2 datafile "/u02/app/oracle/oradata/orcl11/undotbs02.dbf" size 1M autoextend on;(2):删除旧的UNDO表空间drop tablespace UNDOTBS1 including contents and datafiles;UNDO文件头块损坏测试与修复UNDO文件头损坏,无法正常open数据库;SQL> shutdown abortORACLE instance shut down.SQL> startupORACLE instance started.Total System Global Area  784998400 bytesFixed Size                  2257352 bytesVariable Size           515903032 bytesDatabase Buffers          264241152 bytesRedo Buffers                2596864 bytesDatabase mounted.ORA-01122: database file 3 failed verification checkORA-01110: data file 3: "/u02/app/oracle/oradata/orcl11/undotbs01.dbf"ORA-01210: data file header is media corrupt
在没有备份的情况下,需要通过BBED工具进行修复损坏的文件头;修复的方式是通过复制其他数据文件头,并手动修改文件头中相关信息;1、修改数据的DBA,rdba_kcbh 2、修改文件的大小,kccfhfsz 3、修改文件号,kccfhfno 4、修改文件创建时SCN,kcvfhcrs 5、修改文件创建时间,kcvfhcrt 6、修改表空间号,kcvfhtsn  7、修改相对文件号,kcvfhrfn   8、修改表空间的名称, kcvfhtnm 9、修改表空间的长度,kcvfhtln      10、修改检查点的SCN,kcvfhckp 11、修改检查点的时间,kcvcptim  12、修改检查点的计数器,kcvfhcpc 13、修改检查点的控制文件备份的计数器, kcvfhccc 14、如果你修改是1号文件的1号块,他的root rdba的地针是指向了bootstrap$通过BBED修复UNDO文件头坏块过程比较复制,并且BBED工具并不对外公开,也不提供技术支持,使用过程中很容易出现问题,建议在正式环境尽量避免使用BBED工具;可以通过下面网站查看具体修改过程;http://blog.csdn.net/guoyjoe/article/details/31018075BBED工具的安装Oracle 11g版本和以后的版本已经不提供bbed工具了,11g数据库如果需要使用bbed工具,可以拷贝10g或之前版本数据库上的三个文件:[oracle11@primary ~]$ ll -rth bbed_install/total 20K-rw-r--r-- 1 root root 8.5K Sep  8  2012 bbedus.msb-rw-r--r-- 1 root root 1.9K Sep  8  2012 sbbdpt.o-rw-r--r-- 1 root root 1.2K Sep  8  2012 ssbbded.o将文件拷贝到指定目录[oracle11@primary ~]$ cp /home/oracle11/bbed_install/bbedus.msb /u02/app/oracle/product/11.2.0/rdbms/mesg/[oracle11@primary ~]$ cp /home/oracle11/bbed_install/ssbbded.o /u02/app/oracle/product/11.2.0/rdbms/lib/[oracle11@primary ~]$ cp /home/oracle11/bbed_install/sbbdpt.o /u02/app/oracle/product/11.2.0/rdbms/lib/编译[oracle11@primary ~]$ make -f /u02/app/oracle/product/11.2.0/rdbms/lib/ins_rdbms.mk BBED=$ORACLE_HOME/bin/bbed $ORACLE_HOME/bin/bbedbbed默认密码"blockedit"[oracle11@primary ~]$ bbedPassword: BBED: Release 2.0.0.0.0 - Limited Production on Sat Jul 30 14:22:17 2016Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.************* !!! For Oracle Internal Use only !!! ***************BBED>使用BBED工具之前需要创建filelist文件SQL> set linesize 100SQL> col name for a45SQL> spool /home/oracle11/filelist.txtSQL> select file#,name,bytes from v$datafile order by 1;   FILE# NAME                                             BYTES---------- --------------------------------------------- ----------       1 /u02/app/oracle/oradata/orcl11/system01.dbf    775946240       2 /u02/app/oracle/oradata/orcl11/sysaux01.dbf    545259520       3 /u02/app/oracle/oradata/orcl11/undotbs01.dbf    73400320       4 /u02/app/oracle/oradata/orcl11/users01.dbf     5242880       5 /u02/app/oracle/oradata/orcl11/chen01.dbf        1048576SQL> spool off[oracle11@primary ~]$ touch bbed.par[oracle11@primary ~]$ vim bbed.parblocksize=8192listfile=/home/oracle11/filelist.txtmode=edit[oracle11@primary ~]$ bbed parfile=bbed.parPassword: BBED: Release 2.0.0.0.0 - Limited Production on Sat Jul 30 14:36:34 2016Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.************* !!! For Oracle Internal Use only !!! ***************BBED> show         FILE#         1        BLOCK#          1        OFFSET          0        DBA           0x00400001 (4194305 1,1)        FILENAME        /u02/app/oracle/oradata/orcl11/system01.dbf        BIFILE          bifile.bbd        LISTFILE        /home/oracle11/filelist.txt        BLOCKSIZE     8192        MODE            Edit        EDIT            Unrecoverable        IBASE         Dec        OBASE         Dec        WIDTH         80        COUNT         512        LOGFILE       log.bbd        SPOOL         No本文永久更新链接地址