签到成功

知道了

CNDBA社区CNDBA社区

坏块问题以及修复思路

2018-03-13 22:19 3522 0 转载 数据坏块
作者: Marvinn

坏块问题以及修复思路

http://www.cndba.cn/Marvinn/article/2680
http://www.cndba.cn/Marvinn/article/2680

结合各大前辈经验,学习中并用作记录….http://www.cndba.cn/Marvinn/article/2680

坏块类型:http://www.cndba.cn/Marvinn/article/2680

1.物理坏块:http://www.cndba.cn/Marvinn/article/2680http://www.cndba.cn/Marvinn/article/2680

    检测命令:

        1.1、检查一下操作系统的日志看是否有相关的报错。 

        1.2、dd if=报错的文件 of=/dev/null bs=db_block_size 如果不报错是逻辑坏块。

    修复方法:

            1)如果是文件系统且做了raid的,在messages里会显示具体哪个磁盘出问题了,更换磁盘,系统会自动恢复磁盘。

            2)如果是文件系统且没做raid,但有备份和归档,在messages里会显示具体哪个磁盘出问题了,更换磁盘,然后用数据文件备份和归档、在线日志恢复到最后的时间点。

            3)如果是文件系统且没做raid,没有备份,那么就要按下面逻辑坏块处理操作,恢复好坏块后再更换磁盘。

            4)如果是asm管理磁盘阵列(即ASM冗余),将亮红灯的磁盘拔掉,换个新的,系统会自动恢复磁盘。

2.逻辑坏块:http://www.cndba.cn/Marvinn/article/2680http://www.cndba.cn/Marvinn/article/2680

http://www.cndba.cn/Marvinn/article/2680
http://www.cndba.cn/Marvinn/article/2680

    检测命令:

    2.1、dbv命令 (dbv file = xxx.dbf)

    2.2、视图v$database_block_corruption
    2.3、RMAN命令    
        RAMN>BACKUP CHECK LOGICAL VALIDATE DATAFILE n   --指定某个数据文件
        或者
        RMAN>validate datafile 28 block 134 --指定数据文件某个数据块

15:35:51 SCOTT@orclpdb>desc v$database_block_corruption
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 FILE#                                              NUMBER
 BLOCK#                                             NUMBER
 BLOCKS                                             NUMBER
 CORRUPTION_CHANGE#                                 NUMBER
 CORRUPTION_TYPE                                    VARCHAR2(9)
 CON_ID                                             NUMBER

 corruption_type: 坏块类型
     ■ ALL ZERO  - 磁盘上的块头只包含0字节,在ORACLE 7,若它没有被修复,该块可能是有效的,在Oracle 8将会被格式话成标准空块.
    ■ FRACTURED - 数据块头看起来合理,但块前跟块后属于不同版本.
    ■ CHECKSUM  - 数据块的检查值不一致,不确定为什么检查值失败,但可能是数据块中间的扇区版本值不同
    ■ CORRUPT - 数据块被错误标识或者不是一个数据块(比如数据块地址丢失)
    ■ LOGICAL - 逻辑坏块
    ■ NOLOGGING - 数据块中没有重做日志存在(比如,主库上NOLOGGING操作可能在物理备库上产生这种类型的坏块)

    修复方式:
        1)如果是索引坏块,那么直接删除索引,重建索引就好
        命令:
            SQL>DROP INDEX 索引名
            SQL>CREATE INDEX 索引名 ON 表名(字段名)

    2)如果是表坏块,分三种情况:
        2.1、有rman备份,利用rman备份恢复坏块。
        命令:blockrecover datafile file# block block# from backupset;
            或者 
             restore datafile file#;
             recover datafile file#;

        2.2、没有rman备份,只有exp备份,且备份可用,那么可删除这个表,重新导入。

        2.3、如果没有备份,方法如下:
            2.3.1、DBMS_REPAIR包            --(丢失坏块数据)
            2.3.2、使用诊断事件10231,跳过坏块检查,CTAS复制方式,步骤如下:(或者设置事件后,EXP/IMP导入导出)    --(丢失坏块数据)
                 A、 以 tab03的 owner 连入 oracle
                 B、 使用诊断事件 10231,跳过坏块检查
                  SQL> ALTER SYSTEM SET EVENTS '10231 trace name context forever,level 10';
                 C 、创建一个临时表 tab_tmp 的表中除坏块的数据都检索出来
                  SQL>CREATE TABLE tab_tmp as select * from tab03;
                  SQL>ALTER SYSTEM SET EVENTS '10231 trace name context off';
                 D、 更名原表,并把 tab_tmp 更名为 tab03
                  SQL>alter table tab03 rename to tab03_bak;
                  SQL>alter table tab_tmp to tab03; 
                 E、 在 tab03 上重新创建索引、约束、授权、 trigger 等对象 
                 F、 利用表之间的业务关系,把坏块中的数据补足。
                    G,如果要删除之前的表空间,或者表
                 alter database datafile '/u01/oradata/tbs_data01.dbf' offline drop;
                  alter tablespace tbs1 including contents;
                      删除表,drop table  table1 pruge;
             2.3.3、BBED修复
用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
Marvinn

Marvinn

关注

路漫漫其修远兮、吾将上下而求索

  • 99
    原创
  • 0
    翻译
  • 2
    转载
  • 36
    评论
  • 访问:458436次
  • 积分:449
  • 等级:中级会员
  • 排名:第12名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ