您的位置:首页 > 数据库 > Oracle

oracle关于坏块修复二

2012-09-25 12:02 267 查看
oracle10g关于数据库坏块的修复

一:创建测试用表

SQL> create table jiujian(des varchar(30)) tablespace zx;

Table created.

SQL> insert into jiujian values('zhangxu love oracle');

1 row created.

查询该表所在的块

SQL> select rowid,

2 dbms_rowid.rowid_relative_fno(rowid) rel_fno,

3 dbms_rowid.rowid_block_number(rowid) blockno,

4 dbms_rowid.rowid_row_number(rowid) rowno

5 from jiujian;

ROWID REL_FNO BLOCKNO ROWNO

------------------ ---------- ---------- ----------

AAAMmMAAFAAAAAkAAA 5 36 0

二 bbed构造坏块

1 bbed要加载的文件列表

[oracle@oracle ~]$ cat filelist

1 /oracle/CRM2/CRM/system01.dbf 503316480

2 /oracle/CRM2/CRM/undotbs01.dbf 26214400

3 /oracle/CRM2/CRM/sysaux01.dbf 251658240

4 /oracle/CRM2/CRM/users01.dbf 5242880

5 /oracle/CRM2/CRM/zx1.dbf

2 bbed的参数选项配置如下

[oracle@oracle ~]$ cat bbed.para

blocksize=8192

mode=edit

listfile=/oracle/filelist

3 运行bbed

[oracle@oracle ~]$ bbed parfile=bbed.para

Password: blockedit

BBED: Release 2.0.0.0.0 - Limited Production on Tue Sep 25 18:39:16 2012

Copyright (c) 1982, 2005, Oracle. All rights reserved.

************* !!! For Oracle Internal Use only !!! ***************

4 查看配置

BBED> show

FILE# 1

BLOCK# 1

OFFSET 0

DBA 0x00400001 (4194305 1,1)

FILENAME /oracle/CRM2/CRM/system01.dbf

BIFILE bifile.bbd

LISTFILE /oracle/filelist

BLOCKSIZE 8192

MODE Edit

EDIT Unrecoverable

IBASE Dec

OBASE Dec

WIDTH 80

COUNT 512

LOGFILE log.bbd

SPOOL No

5 查看bbed可处理的数据文件

BBED> info

File# Name Size(blks)

----- ---- ----------

1 /oracle/CRM2/CRM/system01.dbf 61440

2 /oracle/CRM2/CRM/undotbs01.dbf 3200

3 /oracle/CRM2/CRM/sysaux01.dbf 30720

4 /oracle/CRM2/CRM/users01.dbf 640

5 /oracle/CRM2/CRM/zx1.dbf 0

6 设置当前数据文件号和当前数据块

BBED> set dba 5,36

DBA 0x01400024 (20971556 5,36)

7 确认下配置是否正确

BBED> show

FILE# 5

BLOCK# 36

OFFSET 0

DBA 0x01400024 (20971556 5,36)

FILENAME /oracle/CRM2/CRM/zx1.dbf

BIFILE bifile.bbd

LISTFILE /oracle/filelist

BLOCKSIZE 8192

MODE Edit

EDIT Unrecoverable

IBASE Dec

OBASE Dec

WIDTH 80

COUNT 512

LOGFILE log.bbd

SPOOL No

8 查找字符zhangxu的位置

BBED> find /c zhangxu TOP

File: /oracle/CRM2/CRM/zx1.dbf (5)

Block: 36 Offsets: 8169 to 8191 Dba:0x01400024

------------------------------------------------------------------------

7a68616e 67787520 6c6f7665 206f7261 636c6502 061dc6

<32 bytes per line>

9 设置当前偏移量

BBED> set offset 8169

OFFSET 8169

10 从当前偏移量开始显示数据块内容

BBED> dump /v

File: /oracle/CRM2/CRM/zx1.dbf (5)

Block: 36 Offsets: 8169 to 8191 Dba:0x01400024

-------------------------------------------------------

7a68616e 67787520 6c6f7665 206f7261 l zhangxu love ora

636c6502 061dc6 l cle...?

<16 bytes per line>

11 用字符jiujian开始从当前偏移量位置进行替换

BBED> modify /c jiujian

Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y

File: /oracle/CRM2/CRM/zx1.dbf (5)

Block: 36 Offsets: 8169 to 8191 Dba:0x01400024

------------------------------------------------------------------------

6a69756a 69616e20 6c6f7665 206f7261 636c6502 061dc6

<32 bytes per line>

12 查看替换后的数据块内容

BBED> dump /v

File: /oracle/CRM2/CRM/zx1.dbf (5)

Block: 36 Offsets: 8169 to 8191 Dba:0x01400024

-------------------------------------------------------

6a69756a 69616e20 6c6f7665 206f7261 l jiujian love ora

636c6502 061dc6 l cle...?

<16 bytes per line>

三 对坏块就行修复

1 offline,online 改表空间便可看到坏块的效果

SQL> alter tablespace zx offline;

Tablespace altered.

SQL> alter tablespace zx online;

Tablespace altered.

SQL> select * from jiujian;

select * from jiujian

*

ERROR at line 1:

ORA-01578: ORACLE data block corrupted (file # 5, block # 36)

ORA-01110: data file 5: '/oracle/CRM2/CRM/zx1.dbf'

SQL> select * from v$database_block_corruption;

FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO

---------- ---------- ---------- ------------------ ---------

5 28 1 0 CHECKSUM

2 运行blockrecover datafile 5 block 36; 修复该数据块

RMAN> blockrecover datafile 5 block 36;

Starting blockrecover at 25-SEP-12

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=154 devtype=DISK

channel ORA_DISK_1: restoring block(s)

channel ORA_DISK_1: specifying block(s) to restore from backup set

restoring blocks of datafile 00005

channel ORA_DISK_1: reading from backup piece /backup/05nkkvst_1_1

channel ORA_DISK_1: restored block(s) from backup piece 1

piece handle=/backup/05nkkvst_1_1 tag=TAG20120908T000444

channel ORA_DISK_1: block restore complete, elapsed time: 00:00:04

starting media recovery

media recovery complete, elapsed time: 00:00:03

Finished blockrecover at 25-SEP-12

3 检查数据块的修复过程注意视图v$database_block_corruption变化

[oracle@oracle ~]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Tue Sep 25 19:02:04 2012

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production

With the Partitioning, OLAP and Data Mining options

SQL> select * from jiujian;

DES

------------------------------

zhangxu love oracle

注意视图v$database_block_corruption 还有坏块的记录!!

SQL> select * from v$database_block_corruption;

FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO

---------- ---------- ---------- ------------------ ---------

5 28 1 0 CHECKSUM

4 重新验证下数据文件以清除视图v$database_block_corruption关于坏块的记录

RMAN> backup validate datafile 5;

Starting backup at 25-SEP-12

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=144 devtype=DISK

channel ORA_DISK_1: starting full datafile backupset

channel ORA_DISK_1: specifying datafile(s) in backupset

input datafile fno=00005 name=/oracle/CRM2/CRM/zx1.dbf

channel ORA_DISK_1: backup set complete, elapsed time: 00:00:15

Finished backup at 25-SEP-12

SQL> select * from v$database_block_corruption;

no rows selected

四 测试下命令blockrecover corruption list能干啥 (此处已经重新构造了坏块)

RMAN> blockrecover corruption list;

Starting blockrecover at 25-SEP-12

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=142 devtype=DISK

starting media recovery

media recovery complete, elapsed time: 00:00:00

Finished blockrecover at 25-SEP-12

注意上面的恢复过程没有读取备份片

-------------------------------------------------------------------

2 查询表jiujian

SQL> select * from jiujian;

select * from jiujian

*

ERROR at line 1:

ORA-01578: ORACLE data block corrupted (file # 5, block # 36)

ORA-01110: data file 5: '/oracle/CRM2/CRM/zx1.dbf'

3 注意此处,已经清除了 v$database_block_corruption 中关于坏块的记录

SQL> select * from v$database_block_corruption;

总结:看来10g的blockrecover仅仅清除 v$database_block_corruption中关于坏块的记录,并不修复数据块,和11g的recover corruption list 差别大啊。
本文出自 “myblog” 博客,请务必保留此出处http://jiujian.blog.51cto.com/444665/1006030
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: