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的块恢复

块介质恢复用来恢复一个单独的块或者数据文件中数据块的集合,如果是小数据量的数据丢失或损坏,而不是整个数据文件,这种类型的恢复是很有用的。通常,块损坏会在跟踪文件中报告错误信息。

块级别的数据丢失通常是由以下两个原因造成的:

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值