ITPub博客

首页 > 数据库 > Oracle > Oracle 数据文件坏块处理

Oracle 数据文件坏块处理

原创 Oracle 作者:ora_pascal1982 时间:2015-04-05 19:22:36 0 删除 编辑
Oracle 数据文件坏块处理
本来写在qq日志里,居然被封了,所以贴过来。 

1.问题:在做rman备份时,发现冷备还原后的数据库出现坏块。

2.解决过程:
图片

t1.
rman备份时报错:
ORA-19566: exceeded limit of 0 corrupt blocks for file D:\ORADATA\LKPSPF_DATA03.DBF
原因,数据文件上有坏块。

t2:
找出
LKPSPF_DATA03.DBF上的表、分析出出现坏块的表、找出所有的坏块:

找出文件编号:

select * from dba_data_files t where t.FILE_NAME = 'D:\ORADATA\LKPSPF_DATA03.DBF';
--D:\ORADATA\LKPSPF_DATA03.DBF12LKPSPF_DATA 
 
找出文件上的表:
select distinct t.segment_name , t.segment_type  from dba_extents t where t.FILE_ID = '12' 
order by t.segment_name, t.segment_type;

/*
IDX_CHECKI_EXAM_NOINDEX
IDX_CHECK_EXAM_NOINDEX
IDX_EXAM_SUB_CLASSINDEX
IDX_INSPECT_DETAIL_INSPECTDATEINDEX
IDX_INSPECT_REPORT_NAMEINDEX
IDX_INSUR_NOINDEX
IDX_ORDERS_PATIINDEX
IDX_ORDERS_SERIALINDEX
IDX_TB_PT_INSPECTINDEX
IDX_TB_PT_INSPECT_DETAILINDEX
MLOG$_TEST_ROWIDTABLE
PK_TEST_IDINDEX
SYS_C0011423INDEX
SYS_C0011424INDEX
SYS_C0011425INDEX
SYS_C0011426INDEX
SYS_C0011427INDEX
SYS_C0011430INDEX
SYS_C0011431INDEX
TB_CHARGETABLE
TB_EMPLOYEE_1TABLE
TB_EMPLOYEE_BAKTABLE
TB_EXPERT_INFO_03181403TABLE
TB_FLUP_PLANTABLE
TB_FLUP_TASKTABLE
TB_INPATI_DIAGTABLE
TB_ORDERSTABLE
TB_OUTPATI_DIAGTABLE
TB_PATITABLE
TB_PATI_FLUP_RULETABLE
TB_PATI_OPERATETABLE
TB_PATI_UNQINDEX
TB_PT_CHECKTABLE
TB_PT_CHECK_ITEMSTABLE
TB_PT_DRUG_USETABLE
TB_PT_INPATI_DIAGTABLE
TB_PT_INSPECTTABLE
TB_PT_INSPECT_DETAILTABLE
TB_PT_PATITABLE
TB_PT_PATI_DIAGTABLE
TB_PT_PATI_OPERATETABLE
TEST_IDTABLE
*/

--使用select count(1) from tablename的办法,找出哪些表上有坏块。
SQL> select count(1) from LKPSPF.TB_ORDERS;
select count(1) from lkpspf.TB_ORDERS
                            *
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 12, block # 608129)
ORA-01110: data file 12: 'D:\ORADATA\LKPSPF_DATA03.DBF'

只有 TB_ORDERS表上有坏块。
但可能不止一个坏块,所以我使用dbv找出这个表上所有坏块。办法是,找出表的segment_id:
select s.TS#, t.header_file, t.header_block , t.owner, t.* from dba_segments t
left join v$tablespace s
on t.tablespace_name = s.NAME 
 where t.segment_name = 'TB_ORDERS';

6.5.1118066

在服务器上,执行dbv工具:
C:\Users\Administrator>dbv logfile=d:\dbv_lkpspf_data03.log userid=lkpspf_mid/ujm7yhn6 segment_id=6.5.1118066

DBVERIFY: Release 11.2.0.1.0 - Production on 星期日 4月 5 15:46:16 2015

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

结果如下:

--分析结果
DBVERIFY - 开始验证: SEGMENT_ID = 6.5.1118066
页 608129 标记为损坏
Corrupt block relative dba: 0x03094781 (file 12, block 608129)
Bad check value found during dbv: 
Data in bad block:
type: 6 format: 2 rdba: 0x03094781
last change scn: 0x0000.bd9419cc seq: 0x1 flg: 0x04
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x19cc0601
check value in block header: 0x1bec
computed block checksum: 0xa500

页 608193 标记为损坏
Corrupt block relative dba: 0x030947c1 (file 12, block 608193)
Bad check value found during dbv: 
Data in bad block:
type: 6 format: 2 rdba: 0x030947c1
last change scn: 0x0000.be1b217e seq: 0x1 flg: 0x04
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x217e0601
check value in block header: 0x27b8
computed block checksum: 0xa500


DBVERIFY - 验证完成

检查的页总数: 2404352
处理的页总数 (数据): 2397422
失败的页总数 (数据): 0
处理的页总数 (索引): 4064
失败的页总数 (索引): 0
处理的页总数 (其他): 2863
处理的总页数 (段)  : 1
失败的总页数 (段)  : 0
空的页总数: 0
标记为损坏的总页数: 2
流入的页总数: 0
加密的总页数        : 0
最高块 SCN            : 3741092406 (0.3741092406) 

发下了2个坏块。

至此,已经找出数据文件中所有的坏块: (file 12, block 608129), (file 12, block 608193)

 t3:
使用rman修复坏块,但因为归档丢失,无法恢复。

RMAN> recover datafile 18 block 58630;

启动 recover 于 05-4月 -15
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=101 设备类型=DISK

通道 ORA_DISK_1: 正在还原块
通道 ORA_DISK_1: 正在指定要从备份集还原的块
正在还原数据文件 00018 的块
通道 ORA_DISK_1: 正在读取备份片段 D:\BACKUP\8AQ3E0SK_1_1.BAK
通道 ORA_DISK_1: 段句柄 = D:\BACKUP\8AQ3E0SK_1_1.BAK 标记 = TAG20150403T030347
通道 ORA_DISK_1: 已从备份片段 1 还原块
通道 ORA_DISK_1: 块还原完成, 用时: 00:01:55

正在开始介质的恢复

线程 1 序列 189799 的归档日志已作为文件 D:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\PATISPF\ARCHIVELOG\
2015_04_05\O1_MF_1_189799_BL1QWN9C_.ARC 存在于磁盘上
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: recover 命令 (在 04/05/2015 16:08:29 上) 失败
RMAN-06053: 无法执行介质恢复, 因为缺少日志
RMAN-06025: 没有找到线程 1 序列 189710 的归档日志的备份以及起始 SCN 3732445011 来还原
RMAN-06025: 没有找到线程 1 序列 189709 的归档日志的备份以及起始 SCN 3732422874 来还原

 t4:
使用 sys.
dbms_repair修复:fix_corrupt_blocks修复失败、skip_corrupt_blocks忽略坏块、导出可以用数据、删除坏块的表。
准备:
--建repaire表:repair_table
SQL> begin
 dbms_repair.admin_tables(
table_type=>dbms_repair.repair_table,
action=>dbms_repair.create_action,
tablespace=>'USERS'
 );
 7  end;
 8  /

PL/SQL procedure successfully completed.

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

-- 检查坏块:
SQL> declare
 2    cc number;
 3  begin
 4    dbms_repair.check_object(
 5      schema_name=>'LKPSPF',
 6      object_name=>'TB_ORDERS',
 7      object_type=>dbms_repair.table_object,
 8      repair_table_name=>'REPAIR_TABLE',
 9      corrupt_count=>cc
10    );
11    dbms_output.put_line(cc);
end;
13  /
--查询坏块:
SQL> col REPAIR_DESCRIPTION for a50
SQL> select block_id, repair_description from repair_table;
608129 mark block software corrupt
608193 mark block software corrupt 
 

与dbv分析结果相同。

--使用 
fix_corrupt_blocks 恢复坏块,但没有成功。
SQL> declare 
  2    cc number;
  3  begin
  4    dbms_repair.fix_corrupt_blocks(
  5      'LKPSPF',
  6      'TB_ORDERS',
  7      fix_count=>cc
  8    );
  9    dbms_output.put_line(cc);
 10  end;
 11  /

--只能跳过坏块,使用
skip_corrupt_blocks过程。
 SQL> declare
  2    cc number;
  3  begin
  4    dbms_repair.skip_corrupt_blocks(
  5      schema_name=>'LKPSPF',
  6      object_name=>'TB_ORDERS'
  7    );
  8    dbms_output.put_line(cc);
  9  end;
 10  /

--此时,tb_orders表可以可以使用,但坏块中记录丢失了。
select count(1) from LKPSPF.TB_ORDERS;
66545839

--坏块还在数据文件中,仍就不能使用rman备份。
 
 RMAN> backup datafile 'D:\ORADATA\LKPSPF_DATA03.DBF';

Starting backup at 05-APR-15
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=258 device type=DISK
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00012 name=D:\ORADATA\LKPSPF_DATA03.DBF
channel ORA_DISK_1: starting piece 1 at 05-APR-15
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: failure of backup command on ORA_DISK_1 channel at 04/05/2015 17:21:20
ORA-19566: exceeded limit of 0 corrupt blocks for file D:\ORADATA\LKPSPF_DATA03.DBF

--此时,需要把 
TB_ORDERS表中的数据使用ctas方式迁移到其他表TB_ORDERS_NEW中。然后删除 TB_ORDERS表。

 
t5:
再次执行rman备份:备份成功。
RMAN> backup datafile 'D:\ORADATA\LKPSPF_DATA03.DBF';

Starting backup at 05-APR-15
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=192 device type=DISK
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00012 name=D:\ORADATA\LKPSPF_DATA03.DBF
channel ORA_DISK_1: starting piece 1 at 05-APR-15
channel ORA_DISK_1: finished piece 1 at 05-APR-15
piece handle=D:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\PATISPF\BACKUPSET\2015_04_05\O1_MF_NNNDF_TAG20150405T180409_BL224SSF_.BKP tag=TAG20150405T180409 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:35
Finished backup at 05-APR-15
 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29121762/viewspace-1502613/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-08-16

  • 博文量
    9
  • 访问量
    32453