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



在进行SUN CLUSTER双机切换、意外断电或其它情况下有时会发生共享盘MOUNT不上情况需要使用FSCK对共享盘进行修复修复完成后在数据库启动过程中却又出现\"数据块损坏无法启动数据库\"现象此时可以根据区别数据块损坏类型检测并修复在此介绍 3种使用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步

2) 如果指向相同磁盘区别文件则是磁盘问题转到第 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模式关闭数据库转到第 4步

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 \'文件名\' _disibledevent=> 2、回滚段需要恢复

如果回滚段处于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. 必须删除该对象以释放回滚块

3、检测和修复损坏块常用思路方法:

()使用化参数DB_BLOCK_CHECKING和DB_BLOCK_CHECKSUM

当块改变时DB_BLOCK_CHECKING对块进行逻辑校验将防止发生10210 和10211

( 2)使用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 indexesDUMP_ORPHAN_KEYS不能对bitmap和 function-based indexes操作

( 3)使用SQL命令ANALYZE TABLE|INDEX … VALIDATE STRUCTURE

utlvalid.sql.创建含有损坏块信息INVALID_ROWS表ANALYZE TABLE VALIDATE STRUCTURE CASCADE同时校验表和索引

( 4)使用DBVERIFY

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

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



Tags:  数据库修复工具 sql数据库修复 access数据库修复 数据库修复

延伸阅读

最新评论

发表评论