坏块问题以及修复思路
结合各大前辈经验,学习中并用作记录….
坏块类型:
1.物理坏块:
检测命令:
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.逻辑坏块:
检测命令:
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修复



