首页 > 数据库 > Oracle > 正文

用ORACLE8i修复数据库坏块的三种方法

2024-08-29 13:29:15
字体:
来源:转载
供稿:网友



在进行sun cluster双机切换、意外断电或其它情况下,有时会发生共享盘mount不上的情况,需要使用fsck对共享盘进行修复。修复完成后,在数据库启动过程中,却又出现"数据块损坏,无法启动数据库"的现象,此时,可以根据不同的数据块损坏类型,检测并修复错误。在此介绍三种使用oracle8i修复损坏数据块的方法。

一、数据块损坏,错误代码为ora-01578

ora-1115 i/o error reading block

通常后跟ora-737x错误与操作系统错误(如unix中的错误号5)

产生原因:

1. 硬件问题(磁盘控制器问题或磁盘问题)

2. 物理级的数据块损坏(通常由前一原因造成)

3. 处理巨型文件时,后跟错误代码ora-7371

确定故障原因与恢复的方法:

1. 查看alert.log文件中其它ora-1115错误的发生情况:

1) 如果指向不同磁盘的文件,则是磁盘控制器的问题,查看v$datafile,有哪些文件位于该控制器下,转到第二步。

2) 如果指向相同磁盘的不同文件,则是磁盘的问题,转到第二步。

3) 如果指向同一个文件,执行以下语句查找文件名:

select segment_name,segment_type from dba_extents where file_id=<文件号> and <块号> between block_id
and block_id+blocks-1;

其中,文件号与块号是ora-1115中指出的,如果该查询持续指向某表或索引,则重建它们即可。

2. 如果文件是system表空间,或处于noarchivelog模式,关闭数据库,转到第四步。

3. 如果数据库处于archivelog模式,仍应关闭数据库,如果不能关闭数据库,则将相应的数据文件脱机:alter database datafile '文件名' offline;

4. 试着将数据文件拷贝到别的磁盘。

5. 如果拷贝失败,则文件将丢失。

6. startup mount;

7. 将数据文件重命名为成功拷贝到别的磁盘的文件名:

alter database rename file '老路径文件名' to '新路径文件名';

8. alter database open;

9. recover datafile 文件名;

alter database datafile '文件名' online;

二、回滚段需要恢复

如果回滚段处于need recovery状态,需要执行以下步骤进行恢复:

1. 查看所有联机的表空间与数据文件

2. 在init.ora文件中加入event = "10015 trace name context forever,level 10",这将生成一个追踪文件,其中含有事务与回滚的信息。

3. 关闭并重新打开数据库。

4. 查看trace文件,应有error recovery tx(#,#) object #.tx(#,#),指出事务信息,其中object #与sys.dba_objects中的object_id相同。

5. 使用以下查询找出正在进行恢复的对象:

select owner,object_name,object_type,status from dba_objects where  object_id=<object #>;

6. 必须删除该对象以释放回滚块。

三、检测与修复损坏块的常用方法:

(一)使用初始化参数db_block_checking与db_block_checksum。

当块改变时,db_block_checking对块进行逻辑校验。将防止发生10210 与10211错误。

(二)使用dbms_repair包,由dbmsrpr.sql与prvtrpr.plb生成该包在特定表中生成损坏块的信息。

1.dbms_repair.admin_tables用于创建与删除存储损坏块的表。其中table_type为:repair_table(表),orphan_table(索引);action为:create_action(创建表),purge_action(删除无关数据),drop_action(删除表)。例:

dbms_repair.admin_tables('repair_table',dbms_repair.repair_table,dbms_repair.create_action,'temp_data');

2.dbms_repair.check_object检查表、索引、分区中的块损坏。其中object_type为:table_object(表),index_object(索引), repair_table_name(用于存储损坏块信息的表)。例:

dbms_repair.check_object('oratrain','locations',corrupt_count=>:cc);

3.使用以下语句查询块损坏信息:

select object_name, relative_file_no, block_id, marked_corrupt, corrupt_description, repair_description from repair_table;

4.将块标志为损坏的:dbms_repair.fix_corrupt_blocks('oratrain','locations',fix_count=>:fc);

5.跳过损坏块:dbms_repair.skip_corrupt_blocks('oratrain', 'locations');

其中object_type为 :table_object(表),cluster_object(索引)。

6.使用rebuild_freelists重建损坏的空闲列表:dbms_repair.rebuild_freelists

7.使用以下方法查找指向损坏块的索引:

(1) 创建存放指向坏块索引的表

(2) dbms_repair.dump_orphan_keys('oratrain','loc_pk',

orphan_table_name=>'orphan_tab1',key_count=>:kc);

(3) select index_name, count(*) from orphan_key_table where table_name = 'classes' group by index_name;

(4) 重建具有orphan keys的索引

限制:不能分析index-organized tables 与 lob indexes,dump_orphan_keys不能对bitmap与 function-based indexes操作。

(三)使用sql命令analyze table|index … validate structure

utlvalid.sql.创建含有损坏块信息的invalid_rows表,analyze table validate structure cascade同时校验表与索引。

(四)使用dbverify

dbverify是一个外部工具,所以对数据库影响很小。可用于在将备份文件拷贝回原位置前检验备份文件的完好性,并定位数据块损坏。命令如下:

dbv /opt/oracle/db02/oradata/data01.dbf start=1 end=500 logfile=dbv.log

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表