首页 > 数据库 > Oracle > Oracle介质恢复(二)
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的块恢复
块介质恢复用来恢复一个单独的块或者数据文件中数据块的集合,如果是小数据量的数据丢失或损坏,而不是整个数据文件,这种类型的恢复是很有用的。通常,块损坏会在跟踪文件中报告错误信息。
块级别的数据丢失通常是由以下两个原因造成的:
n I/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 <datafile> block <block number>;
方式3 执行blockrecover命令的时候指定表空间和数据块地址(DBA):
RMAN> blockrecover tablespace <talbespace_name> DBA <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;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29840555/viewspace-2122892/ ,如需转载,请注明出处,否则将追究法律责任。