Oracle 10G 模拟块损坏后恢复

php中文网
发布: 2016-06-07 17:09:56
原创
1193人浏览过

当你访问某个表的时候出现类似下面的错误: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;

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

办公小浣熊
办公小浣熊

办公小浣熊是基于商汤大语言模型的原生数据分析产品,

办公小浣熊 460
查看详情 办公小浣熊

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

RMAN> BLOCKRECOVER CORRUPTION LIST;


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

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

linux

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号