数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
用ORACLE8i修复数据库坏块的三种方法

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

在进行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




相关文章

相关软件