ITPub博客

首页 > 数据库 > Oracle > Oracle介质恢复(二)

Oracle介质恢复(二)

Oracle 作者:itpublzy 时间:2016-08-03 11:05:10 0 删除 编辑

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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-09-02

  • 博文量
    5
  • 访问量
    1422