select distinct t.segment_name , t.segment_type from dba_extents t where t.FILE_ID = '12'
*/
--使用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