butter7372 发表于 2018-9-26 08:29:39

oracle关于坏块修复二

  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)>  3      dbms_rowid.rowid_block_number(rowid) blockno,
  4      dbms_rowid.rowid_row_number(rowid) rowno
  5      from jiujian;

  ROWID                >  ------------------ ---------- ---------- ----------
  AAAMmMAAFAAAAAkAAA          5         36          0
  二 bbed构造坏块
  1 bbed要加载的文件列表
  $ 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的参数选项配置如下
  $ cat bbed.para
  blocksize=8192
  mode=edit
  listfile=/oracle/filelist
  3 运行bbed
  $ bbed parfile=bbed.para
  Password: blockedit

  BBED:>  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

  >  COUNT         512
  LOGFILE         log.bbd
  SPOOL         No
  5 查看bbed可处理的数据文件
  BBED> info

  File#Name                                                       >  ---------                                                      ----------
  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

  >  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
  
  9 设置当前偏移量
  BBED> set offset 8169
  OFFSET          8169
  10 从当前偏移量开始显示数据块内容
  BBED> dump /v
  File: /oracle/CRM2/CRM/zx1.dbf (5)
  Block: 36      Offsets: 8169 to 8191Dba:0x01400024
  -------------------------------------------------------
  7a68616e 67787520 6c6f7665 206f7261 l zhangxu love ora
  636c6502 061dc6                     l cle...?
  
  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
  
  12 查看替换后的数据块内容
  BBED> dump /v
  File: /oracle/CRM2/CRM/zx1.dbf (5)
  Block: 36      Offsets: 8169 to 8191Dba:0x01400024
  -------------------------------------------------------
  6a69756a 69616e20 6c6f7665 206f7261 l jiujian love ora
  636c6502 061dc6                     l cle...?
  
  三 对坏块就行修复
  1 offline,online 改表空间便可看到坏块的效果

  SQL>>
  Tablespace>
  SQL>>
  Tablespace>  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变化
  $ sqlplus / as sysdba

  SQL*Plus:>  Copyright (c) 1982, 2005, Oracle.All rights reserved.
  Connected to:

  Oracle Database 10g Enterprise Edition>  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 差别大啊。

页: [1]
查看完整版本: oracle关于坏块修复二