Oracle 数据库通过BBED模拟UNDO坏块
说明:
文章整理自2016-11-12我在ITPUB博客发布的《Oracle_UNDO 坏块测试和修复》
https://blog.itpub.net/29785807/viewspace-2128326/
注意:文章发布时间较久,可能存在错误,仅供参考,请勿用于生产环境。
一:BBED工具模拟UNDO段头块损坏二:BBED工具模拟UNDO非段头块损坏三:BBED工具的安装四:通过BBED工具恢复DELETE误删除的数据

一:BBED工具模拟UND 段头坏块,并进行恢复
本次案例通过 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)
破坏的方式是直接将其他的数据块覆盖段头块
[cjc-db01@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 损坏
[cjc-db01@primary orcl11]$ dbv file=undotbs01.dbfDBVERIFY: 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-01578
SQL> 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 回滚段名,包括已经删除的回滚段
[cjc-db01@primary orcl11]$ strings system01.dbf | grep _SYSSMU | cut -d $ -f 1 | sort -u > listSMU[cjc-db01@primary orcl11]$ vi 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# 225
BBED> 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 6470
BBED> x rnc *kdbr[0] ---- 查看0 号UNDO 段名称col 1[6] @8151: SYSTEM
BBED> 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 immediateSQL> 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 UNDOTBS2
BBED 修改数据块是比较危险的操作,如果某个修改操作有误,可以通过 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 280
BBED> sum apply;Check value for File 3, Block 280:current = 0x3f90, required = 0x3f90

二:BBED工具模拟UNDO非段头块损坏
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 号回滚段非头块;
[cjc-db01@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 = 0xae9a
BBED> 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
[cjc-db01@primary orcl11]$ dbv file=undotbs01.dbfDBVERIFY: 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_kcbh2 、修改文件的大小,kccfhfsz3 、修改文件号,kccfhfno4 、修改文件创建时SCN ,kcvfhcrs5 、修改文件创建时间,kcvfhcrt6 、修改表空间号,kcvfhtsn 7 、修改相对文件号,kcvfhrfn 8 、修改表空间的名称, kcvfhtnm9 、修改表空间的长度,kcvfhtln 10 、修改检查点的SCN ,kcvfhckp11 、修改检查点的时间,kcvcptim 12 、修改检查点的计数器,kcvfhcpc13 、修改检查点的控制文件备份的计数器, kcvfhccc14 、如果你修改是1 号文件的1 号块,他的root rdba 的地针是指向了bootstrap$
通过BBED 修复UNDO 文件头坏块过程比较复杂,并且BBED 工具并不对外公开,也不提供技术支持,使用过程中很容易出现问题,建议在正式环境尽量避免使用BBED 工具;
可以参考查下来链接;
http://blog.csdn.net/guoyjoe/article/details/31018075

三:BBED工具的安装
Oracle 11g 版本和以后的版本已经不提供bbed工具了,11g 数据库如果需要使用bbed 工具,可以拷贝10g 或之前版本数据库上的三个文件:
[cjc-db01@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
将文件拷贝到指定目录
[cjc-db01@primary ~]$ cp /home/cjc-db01/bbed_install/bbedus.msb /u02/app/oracle/product/11.2.0/rdbms/mesg/[cjc-db01@primary ~]$ cp /home/cjc-db01/bbed_install/ssbbded.o /u02/app/oracle/product/11.2.0/rdbms/lib/[cjc-db01@primary ~]$ cp /home/cjc-db01/bbed_install/sbbdpt.o /u02/app/oracle/product/11.2.0/rdbms/lib/
编译
[cjc-db01@primary ~]$ make -f /u02/app/oracle/product/11.2.0/rdbms/lib/ins_rdbms.mk BBED=$ORACLE_HOME/bin/bbed $ORACLE_HOME/bin/bbed
bbed 默认密码" blockedit"
登录
[cjc-db01@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/cjc-db01/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
[cjc-db01@primary ~]$ touch bbed.par[cjc-db01@primary ~]$ vim bbed.parblocksize=8192listfile=/home/cjc-db01/filelist.txtmode=edit
[cjc-db01@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/cjc-db01/filelist.txt BLOCKSIZE 8192 MODE Edit EDIT Unrecoverable IBASE Dec OBASE Dec WIDTH 80 COUNT 512 LOGFILE log.bbd SPOOL No

四:通过BBED工具恢复DELETE误删除的数据
参考我的另一篇文章:《Oracle delete误操作数据恢复(BBED)》
Oracle delete误操作chenjuchao,公众号:IT小ChenOracle delete误操作数据恢复(BBED)
注意:仅供参考,请勿用于生产环境
###chenjuchao 20240224###