Home  >  Article  >  Database  >  Oracle 10G 模拟块损坏后恢复

Oracle 10G 模拟块损坏后恢复

WBOY
WBOYOriginal
2016-06-07 17:09:561002browse

当你访问某个表的时候出现类似下面的错误: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的恢复是对块进行恢复,而手工恢复是数据文件的恢复.

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

linux

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn