4.块的损坏与恢复
块已经不是Oracle的格式,或者其内部是不一致的,那么这个块就被认为已损坏。块介质恢复是当数据文件是联机时,还原和恢复数据块的技术。如果只有一些块被破坏,那么块介质恢复是较好的恢复选择。
BBED(Block Brower and EDitor)是Oracle的一款内部工具,可以用来直接查看和修改Oracle数据文件块的内容。BBED是一个针对Oracle的二进制编译工具。该工具不受Oracle支持,默认是不生成可执行文件的,在使用钱需要重新编译。
1)编译BBED
直接在Oracle 11gR2的环境中编译BBED,将收到以下错误信息:
$ cd
$ORACLE_HOME/rdbms/lib
$ make –f ins_rdbms.mk
$ORACLE_HOME/rdbms/lib/bbed
……
gcc:
/u01/app/oracle/11.2.0/db_1/rdbms/lib/ssbbded.o: No such file or directory
gcc:
/u01/app/oracle/11.2.0/db_1/rdbms/lib/sbbdpt.o: No such file or directory
Oracle 11gR2环境中编译BBED可执行文件所需要的ssbbded.o和sbbdpt.o对象文件被移除,不过可以从Oracle 10g环境中将这两个文件拷贝到Oracle 11g环境中进行编译。
除了将上面的ssbbded.o和sbbdpt.o文件拷贝到Oracle 11g环境外,BBED还需要用到$ORACLE_HOME/rdbms/mesg目录下的bbedus.msg和bbedus.msb两个信息文件,这几个文件都需要从Oracle 10g中拷贝到Oracle 11g中对应的目录中。下面是将以上4个文件从Oracle 10g中拷贝到Oracle 11g对应目录之后的编译过程:
$ cd $ORACLE_HOME/rdbms/lib
$ make –f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
$ file bbed
$ size bbed
$ ldd bbed
$ cp bbed $ORACLE_HOME/bin/
$ cd /
$ which bbed
/u01/app/oracle/product/11.2.0/db_1/bin/bbed
编译成功后登录BBED,登录时需要密码(默认密码是:blockedit)
$ bbed
2)BBED模拟表数据块的损坏
a.创建测试表
SQL>
create table test.testbbed as select * from dba_tables;
b.创建BBED参数文件
由于BBED无法对ASM进行操作,所以这里将表创建到ACFS文件系统的存储设备上。这里创建两个BBED参数文件,filelist.txt保存要操作的数据文件的ID和路径,bbed.par保存数据文件的块大小、filelist.txt的位置和操作模式:
$ more
filelist.txt
6
/testbbed/tbtbs01.dbf
$ more
bbed.par
blocksize=8192
listfile=filelist.txt
mode=edit
filelist.txt的内容可通过select file_id,file_name from dba_data_filesSQL查询得到。
c.BBED基本操作
ü使用指定的参数文件登录BBED:
$ bbed
parfile=bbed.par
ü显示BBED配置文件中指定的数据文件信息:
BBED> info
ü设置要操作的数据文件:
BBED> set
file 6
ü显示要操作的数据文件的详细信息:
BBED> show
d.模拟坏块
修改文件号为6的第136号块:
BBED>
modify 1000 file 6 block 136
如果修改错误,可以执行revert命令回滚。
e.验证坏块
在BBED执行以下命令验证数据块,发现block 136已经损坏
BBED>
verify
f.使用DBV工具验证
使用DBV工具验证发现file 6 block 136已经损坏
$ dbv
file=/testbbed/tbtbs01.dbf blocksize=8192
g.执行块读取操作
执行一个test.testbbed的全表扫描,收到ORA-01578错误
SQL> alter
system flush buffer_cache;
SQL>
select /*+FULL(T)*/ COUNT(1) FROM TEST.TESTBBED T;
3)RMAN的块恢复
块介质恢复用来恢复一个单独的块或者数据文件中数据块的集合,如果是小数据量的数据丢失或损坏,而不是整个数据文件,这种类型的恢复是很有用的。通常,块损坏会在跟踪文件中报告错误信息。
块级别的数据丢失通常是由以下两个原因造成的:
nI/O错误引起的镜像数据丢失。
n内存损坏,刷新到磁盘。
a.使用RMAN BLOCKRECOVER命令的注意事项
n目标数据库必须在MOUNT或者OPEN状态,如果执行某个数据文件的块介质恢复,那么该数据文件不能是脱机状态。
n块介质恢复不支持基于时间点的块恢复。
n只能在损坏的块上执行块介质恢复。
n块被标记为介质损坏之后是不能访问的,直达恢复完成。
n当使用备份的控制文件加载数据库时,不能执行块的介质恢复。
n必须有一个包含损坏块文件的全备份,块介质恢复不能使用增量备份。
n如果RMAN访问块介质恢复需要特定归档Redo日志文件失败,那么将执行还原FAILOVER,尝试使用RMAN资料库中列出的适合这个操作的所有其它备份,如果没有合适的备份存在执行才会失败。
n数据文件头不能被恢复
n不能在非归档模式下执行块介质恢复。
b.RMAN
BLOCKRECOVER命令的使用方式
RMAN
BLOCKRECOVER命令有以下三种使用方式:
方式1使用BLOCKRECOVER CORRUPTION LIST命令恢复在V$DATABASE_BLOCK_CORRUPTION视图中报告的所有块:
RMAN>
blockrecover corruption list;
方式2使用BLOCKRECOVER命令的时候指定文件号和块号:
RMAN>
blockrecover datafile block ;
方式3执行blockrecover命令的时候指定表空间和数据块地址(DBA):
RMAN> blockrecover
tablespace DBA ;
c.RMAN
BLOCKRECOVER使用的例子
例子1恢复3个数据文件的损坏块:
RMAN>
BLOCKRECOVER DATAFILE 2 BLOCK 12,13 DATAFILE 3 BLOCK 5,98,99 DATAFILE 4 BLOCK
19;
例子2:从数据文件拷贝中还原、恢复一系列块:
RMAN> RUN
{
BLOCKRECOVER
DATAFILE 3 BLOCK 2,3,4,5 TABLESPACE sales DBA 4194405,4194409,4194412 from
DATAFILECOPY;
}
例子3:从指定的tag备份总还原、恢复块
RMAN>
BLOCKRECOVER TABLESPACE SYSTEM DBA 4194404,4194405 FROM TAG “weekly_backup”;
例子4:从用于恢复数据到两天以前的备份中还原、恢复SYSTEM表空间中的两个块:
RMAN>
BLOCKRECOVER TALBESPACE SYSTEM DBA 4194404,4194405 RESOTRE UNTILL TIME ‘sysdate-2’;
例子5:运行备份验证数据库,修复在V$DATABASE_BLOCK_CORRUPTION中记录的所有损坏块:
RMAN>
BACKUP VALIDATE DATABASE;
RMAN>
BLOCKRECOVER CORRUPTION LIST;
4)确定损坏块对应的对象
要确定一个损坏的对象需要知道AFN(Absolute File Numbe,绝对文件号)和BL(Block Number,块号)。AFN和RFN(Relative File Number,相对文件号)通常是相同的,但是也可能不同(特别是如果数据库从Oracle7迁移或者如果使用的是可传输、可插拔的表空间),获得正确的AFN和RFN就显得非常重要,如果指定了错误的AFN将导致找不到对象或错误识别对象。
a.确定AFN和BL
方法1:从ORA-1578得到AFN
ORA-1578之后产生的ORA-1110错误提供AFN号码。
方法2:从DBVERIFY输出获得AFN。
通过使用DBV工具会报告损坏的块,DBV工具通过提供与相关的RDBA、RFN和BL信息。
方法3:从RMAN获得AFN
RMAN在V$DATABASE_BLOCK_CORRUPTION视图报告损坏的块。该视图的字段FILE#表示AFN,字段BLOCK#表示BL。
b.定位损坏的对象
一旦AFN被识别,执行以下SQL语句定位损坏的对象:
SQL>
select *
From DBA_EXTENTS
Where file_id=&AFN
And &BL
BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS-1;