您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

Oracle 10G 模拟块损坏后恢复

2024/6/6 19:13:51发布26次查看
当你访问某个表的时候出现类似下面的错误: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的恢复是对块进行恢复,而手工恢复是数据文件的恢复.
块损坏只影响坏块所在的数据,该表没有坏块的数据仍然可以访问,其他的表更不受影响.

该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product