视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Oracle10G模拟块损坏后恢复
2020-11-09 11:43:54 责编:小采
文档


当你访问某个表的时候出现类似下面的错误:ORA-01578: ORACLE data block corrupted (file # 6, block # 344)ORA-01110: data fil

当你访问某个表的时候出现类似下面的错误:
ORA-01578: Oracle data block corrupted (file # 6, block # 344)
ORA-01110: data file 6: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEST.DBF'
原因就是数据文件中出现了坏块.

下面来模拟一下块损坏和恢复.

1,创建一个比较小的表空间,在这个表空间上建立一个表
create tablespace test datafile 'D:\oracle\product\10.2.0\oradata\BUT\test.dbf' size 10M autoextend off;
create table test tablespace test as select * from all_objects
commit;
select count(*) from test =49313
2,如果想做完全恢复,需要将数据库设为归档模式,具体参照
3,shutdown immedaite 数据库后,备份一份数据文件test.dbf.
4,编辑test.dbf文件,用ultraedit(它在编辑二进制文件的时候是进行替换),编辑文件的中间位置,因为数据文件前面的数据块是控制信息,不是数据.
5,启动数据库,访问表test,出现下面的错误:
SQL> select count(*) from test;
select count(*) from test *
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 5, block # 323)
ORA-01110: data file 5: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\BUT\TEST.DBF'
6,这时候可以通过Oracle提供的dbv工具也可以得到坏块的信息
C:\>dbv file='D:\ORACLE\PRODUCT\10.2.0\ORADATA\BUT\TEST.DBF'
7,恢复和数据文件丢失一样,需要文件级别恢复.把表空间offline:
SQL> alter tablespace test offline;
Tablespace altered.
8,将开始备份的数据文件拷贝回来.
9恢复数据文件,恢复后能够正常访问.
SQL> recover datafile 5;
Media recovery complete.
SQL> alter tablespace test online;
Tablespace altered.
SQL> select count(*) from test;
COUNT(*)
----------
49313

下面这介绍一下RAMN恢复:
RMAN的入门参照
1,在编辑数据文件之前做一个备份:
RMAN> run{
2> allocate channel c1 type disk;
3> backup database format 'D:\oracle\rmanrep\butdb.bpk';
4> }
2,然后shutdown immediate 数据库,可以在rman中也可以在另外一个sqlplus session中完成.
RMAN> shutdown immediate
3,编辑test.dbf文件.
4,startup,在另外一个sqlplus中进行
SQL> startup
SQL> select count(*) from test;
select count(*) from test
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 5, block # 347)
ORA-01110: data file 5: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\BUT\TEST.DBF'
5,对损坏块进行恢复,在RMAN中
RMAN> BACKUP VALIDATE DATABASE; 这一步是校验,不是backup.
验证完成后会把信息记录到V$DATABASE_BLOCK_CORRUPTION,如下:
SQL> select * from V$DATABASE_BLOCK_CORRUPTION;
FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO
---------- ---------- ---------- ------------------ ---------
5 347 1 0 CHECKSUM
5 693 1 0 CHECKSUM

RMAN> blockrecover datafile 5 block 347;
恢复后在另一个session中访问表,提示和上次访问时候的坏块就不一样了,如下:
SQL> select count(*) from test;
select count(*) from test
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 5, block # 693)
ORA-01110: data file 5: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\BUT\TEST.DBF'
在通过RMAN恢复块:
RMAN> blockrecover datafile 5 block 693;

完成后表能够被正常访问了.

在可以 用下面的命令一次恢复所有的坏块,不用像上面那样一个块一个块的恢复.

RMAN> BLOCKRECOVER CORRUPTION LIST;


RMAN的块恢复不需要将表空间offline.
RMAN的恢复是对块进行恢复,而手工恢复是数据文件的恢复.

块损坏只影响坏块所在的数据,该表没有坏块的数据仍然可以访问,其他的表更不受影响.

下载本文
显示全文
专题