oracle坏块修复实例

最近几天发现库里有坏块了,环境是11gR2, linux平台的64位的库。以下是我的修复办法,基于dbms_repair做的在线修复,也可以基于备份rman来修复,archivelog,noarchive log可能修复的方式有所不同。 -->首先从alert.log里面发现如下的错误。 DDE: Problem Key 'ORA 1110' was flood controlled (0x1) (no incident) ORA-01110: data file 8: '/dbTS2/oracle/TESTDB2/oradata3/data/TESTDB2_pool_data_03.dbf' Byte offset to file# 8 block# 570051 is 374890496 Incident 1567129 created, dump file: -->从trace文件里有更详细的描述。 /opt/app/oracle/testdb2/admin/TESTDB2/diag/rdbms/TESTDB2/TESTDB2/incident/incdir_1567129/TESTDB2_o ra_5396_i1567129.trc ORA-01578: ORACLE data block corrupted (file # 8, block # 570051) ORA-01110: data file 8: '/dbTS2/oracle/TESTDB2/oradata3/data/TESTDB2_pool_data_03.dbf' Dump continued from file: /opt/app/oracle/testdb2/admin/TESTDB2/diag/rdbms/TESTDB2/TESTDB2/trace/TESTDB2_ora_5396.trc ORA-01578: ORACLE data block corrupted (file # 8, block # 570051) ORA-01110: data file 8: '/dbTS2/oracle/TESTDB2/oradata3/data/TESTDB2_pool_data_03.dbf' ========= Dump for incident 1567129 (ORA 1578) ======== *** 2013-12-11 07:25:21.257 dbkedDefDump(): Starting incident default dumps (flags=0x2, level=3, mask=0x0) ----- Current SQL Statement for this session (sql_id=7u9gsk798bvrp) ----- SELECT xxxxx FROM APP_CONTROL AC, APP_BILL_PROC BL WHERE APP.DATA_GROUP IS NOT NULL AND BL.PROCESS_ID = APP.NXT_PGM_NAME AND APP.FILE_STATUS IN ('RD', 'IU', 'CN') GROUP BY xxxxxxx -->尝试查看坏块的segment_type,确认一下是Index还是table segment出问题了。查询没有任何结果。 SQL> select segment_name,tablespace_name,segment_type,block_id,file_id,bytes from dba_extents where block_id=570051 and file_id=8; no rows selected -->运行日志中的sql,果断的报错了。 SELECT xxxxx FROM APP_CONTROL AC, APP_BILL_PROC BL WHERE APP.DATA_GROUP IS NOT NULL AND BL.PROCESS_ID = APP.NXT_PGM_NAME AND APP.FILE_STATUS IN ('RD', 'IU', 'CN') GROUP BY xxxxxxx * ERROR at line 1: ORA-01578: ORACLE data block corrupted (file # 8, block # 570051) ORA-01110: data file 8: '/dbTS2/oracle/TESTDB2/oradata3/data/TESTDB2_pool_data_03.dbf' -->只是从相关的表里select count没有任何问题。 SQL> select count(*)from APP_CONTROL; COUNT(*) ---------- 1613 SQL> select count(*)from APP_BILL_PROC ; COUNT(*) ---------- 103 -->再次验证,还是报错。 SELECT xxxxx FROM APP_CONTROL AC, APP_BILL_PROC BL WHERE APP.DATA_GROUP IS NOT NULL AND BL.PROCESS_ID = APP.NXT_PGM_NAME AND APP.FILE_STATUS IN ('RD', 'IU', 'CN') GROUP BY xxxxxxx * ERROR at line 1: ORA-01578: ORACLE data block corrupted (file # 8, block # 570051) ORA-01110: data file 8: '/dbTS2/oracle/TESTDB2/oradata3/data/TESTDB2_pool_data_03.dbf' --通过sys来调用dbms_repair来修复。 SQL> BEGIN 2 DBMS_REPAIR.ADMIN_TABLES ( 3 TABLE_NAME => 'REPAIR_TABLE', 4 TABLE_TYPE => dbms_repair.repair_table, 5 ACTION => dbms_repair.create_action, 6 TABLESPACE => '&tablespace_name'); 7 END; 8 / Enter value for tablespace_name: old 6: TABLESPACE => '&tablespace_name'); new 6: TABLESPACE => 'POOL_DATA'); PL/SQL procedure successfully completed. -->以上的步骤会生成一个表repair_table SQL> desc repair_table Name Null? Type ----------------------------------------- -------- ---------------------------- OBJECT_ID NOT NULL NUMBER TABLESPACE_ID NOT NULL NUMBER RELATIVE_FILE_ID NOT NULL NUMBER BLOCK_ID NOT NULL NUMBER CORRUPT_TYPE NOT NULL NUMBER SCHEMA_NAME NOT NULL VARCHAR2(30) OBJECT_NAME NOT NULL VARCHAR2(30) BASEOBJECT_NAME VARCHAR2(30) PARTITION_NAME VARCHAR2(30) CORRUPT_DESCRIPTION VARCHAR2(2000) REPAIR_DESCRIPTION VARCHAR2(200) MARKED_CORRUPT NOT NULL VARCHAR2(10) CHECK_TIMESTAMP NOT NULL DATE FIX_TIMESTAMP DATE REFORMAT_TIMESTAMP DATE -->来定位schema object中的坏块情况 SQL> set serveroutput on DECLARE num_corrupt INT; SQL> 2 BEGIN 3 num_corrupt := 0; 4 DBMS_REPAIR.CHECK_OBJECT ( 5 SCHEMA_NAME => '&schema_name', 6 OBJECT_NAME => '&object_name', 7 REPAIR_TABLE_NAME => 'REPAIR_TABLE', 8 corrupt_count => num_corrupt); 9 DBMS_OUTPUT.PUT_LINE('number corrupt: ' || TO_CHAR (num_corrupt)); 10 END; 11 / Enter value for schema_name: TSTAPPO2 old 5: SCHEMA_NAME => '&schema_name', new 5: SCHEMA_NAME => 'TSTAPPO2', Enter value for object_name: APP_CONTROL old 6: OBJECT_NAME => '&object_name', new 6: OBJECT_NAME => 'APP_CONTROL', number corrupt: 1 PL/SQL procedure successfully completed. -->查询生成的坏块表,里面有相应的记录。指向的坏块确实是日志中指定的。 SQL> select BLOCK_ID, CORRUPT_TYPE, CORRUPT_DESCRIPTION 2 from REPAIR_TABLE; BLOCK_ID CORRUPT_TYPE ---------- ------------ CORRUPT_DESCRIPTION -------------------------------------------------------------------------------- 570051 6148 -->修复坏块 SQL> DECLARE num_fix INT; 2 BEGIN 3 num_fix := 0; 4 DBMS_REPAIR.FIX_CORRUPT_BLOCKS ( 5 SCHEMA_NAME => '&schema_name', 6 OBJECT_NAME=> '&object_name', 7 OBJECT_TYPE => dbms_repair.table_object, 8 REPAIR_TABLE_NAME => 'REPAIR_TABLE', 9 FIX_COUNT=> num_fix); 10 DBMS_OUTPUT.PUT_LINE('num fix: ' || to_char(num_fix)); 11 END; 12 / Enter value for schema_name: TSTAPPO2 old 5: SCHEMA_NAME => '&schema_name', new 5: SCHEMA_NAME => 'TSTAPPO2', Enter value for object_name: APP_CONTROL old 6: OBJECT_NAME=> '&object_name', new 6: OBJECT_NAME=> 'APP_CONTROL', num fix: 0 PL/SQL procedure successfully completed. -->对于坏块的操作都能够skip SQL> BEGIN DBMS_REPAIR.SKIP_CORRUPT_BLOCKS ( 2 3 SCHEMA_NAME => '&schema_name', 4 OBJECT_NAME => '&object_name', 5 OBJECT_TYPE => dbms_repair.table_object, 6 FLAGS => dbms_repair.SKIP_FLAG); 7 END; 8 / Enter value for schema_name: TSTAPPO2 old 3: SCHEMA_NAME => '&schema_name', new 3: SCHEMA_NAME => 'TSTAPPO2', Enter value for object_name: APP_CONTROL old 4: OBJECT_NAME => '&object_name', new 4: OBJECT_NAME => 'APP_CONTROL', PL/SQL procedure successfully completed. -->再次运行以上的sql,尝试。 SQL> l SELECT xxxxx FROM APP_CONTROL AC, APP_BILL_PROC BL WHERE APP.DATA_GROUP IS NOT NULL AND BL.PROCESS_ID = APP.NXT_PGM_NAME AND APP.FILE_STATUS IN ('RD', 'IU', 'CN') GROUP BY xxxxxxx ;

working....

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-03-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据库新发现

Oracle9i新特性-使用DBMS_METADATA包获得对象DDL语句

从Oracle9i开始Oracle提供了一个新的系统包DBMS_METADATA,可以用于提取对象创建的DDL语句。

972
来自专栏me的随笔

T-SQL基础(五)之增删改

在前面的文章中对T-SQL的查询做了基本总结,接下来我们看下SQL中的另外一个常用操作——数据的修改。

682
来自专栏WindCoder

个人常用语句笔记-SQL

523
来自专栏杨建荣的学习笔记

mysql常用命令

这几天学习了一下mysql,对于mysql的命令总结如下,发现很多方面和oracle还是差别挺大的。 # mysql -uroot -p Enter passw...

3656
来自专栏自由而无用的灵魂的碎碎念

oracle 10g 手动创建scott(tiger) schema

转自:http://cnhtm.itpub.net/post/39970/496967

893
来自专栏杨建荣的学习笔记

关于物化视图疑问(32天)

--初始化操作, 创建两个用户一个,testo,一个test. 在testo上创建表,test上创建物化视图。 SQL> create user testo ...

3315
来自专栏乐沙弥的世界

Oracle 性能相关常用脚本(SQL)

在缺乏的可视化工具来监控数据库性能的情形下,常用的脚本就派上用场了,下面提供几个关于Oracle性能相关的脚本供大家参考。以下脚本均在Oracle 10g测试通...

932
来自专栏数据和云

利用分析函数改写范围判断自关联查询

分析、定位数据库的主要负载是这条语句引起的过程相对简单,通过AWR报告就可以比较容易的完成定位,这里就不赘述了。

954
来自专栏乐沙弥的世界

SQL 基础--> 视图(CREATE VIEW)

视图来源于表,所有对视图数据的修改最终都会被反映到视图的基表中,这些修改必须服从基表的完整性约束,并同样会触发定义

603
来自专栏杨建荣的学习笔记

生产系统调优之_毫秒级的改进 (92天)

生产中有一个sql语句,做了union-all操作,对于时间的要求是极其严格的,目前已经从2秒的改进调整到了1秒以内,在此基础上还想做进一步的调整,因为极其频繁...

3408

扫码关注云+社区