• Oracle Recovery Tools修复空闲坏块


    我们经常遇到由于某种原因,表上面有坏块,通过event或者dbms包跳过坏块,然后重建该表之后,但是dbv和rman检查坏块依旧存在(而且导致常规情况下rman无法正常备份),最近在Oracle Recovery Tools工具中增加的这种异常数据块修复功能,通过试验重现类似故障:
    创建表并进行破坏

    C:\Users\XFF>sqlplus / as sysdba
     
    SQL*Plus: Release 11.2.0.4.0 Production on 星期一 8月 8 14:00:34 2022
     
    Copyright (c) 1982, 2013, Oracle.  All rights reserved.
     
     
    连接到:
    Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
     
    SQL> create tablespace ts_test datafile 'e:/oradata/test/ts_test.dbf' size 128M autoextend on;
     
    表空间已创建。
     
    SQL> create table t_xifenfei tablespace ts_test
      as
      select * from dba_objects;
     
    表已创建。
     
    SQL> alter system checkpoint;
     
    系统已更改。
     
    SQL> set pages 100
    SQL> select file_id,block_id,blocks from dba_extents where segment_name='T_XIFENFEI';
     
       FILE_ID   BLOCK_ID     BLOCKS
    ---------- ---------- ----------
             5        128          8
             5        136          8
             5        144          8
             5        152          8
             5        160          8
             5        168          8
             5        176          8
             5        184          8
             5        192          8
             5        200          8
             5        208          8
             5        216          8
             5        224          8
             5        232          8
             5        240          8
             5        248          8
             5        256        128
             5        384        128
             5        512        128
             5        640        128
             5        768        128
             5        896        128
             5       1024        128
             5       1152        128
             5       1280        128
     
    已选择25行。
     
     
    SQL> SELECT COUNT(1) FROM T_XIFENFEI;
     
      COUNT(1)
    ----------
         86048
     
    SQL> shutdown immediate;
    数据库已经关闭。
    已经卸载数据库。
    ORACLE 例程已经关闭。
     
     
    C:\Windows\system32>dd of=e:/oradata/test/ts_test.dbf  if=/dev/zero bs=1k seek=1419 conv=notrunc count=1
    rawwrite dd for windows version 0.6beta3.
    Written by John Newbigin <jn@it.swin.edu.au>
    This program is covered by terms of the GPL Version 2.
     
    notrunc
    1+0 records in
    1+0 records out
     
     
    SQL> startup
    ORACLE 例程已经启动。
     
    Total System Global Area 3206836224 bytes
    Fixed Size                  2285512 bytes
    Variable Size             754974776 bytes
    Database Buffers         2432696320 bytes
    Redo Buffers               16879616 bytes
    数据库装载完毕。
    数据库已经打开。
    SQL> select count(1) from t_xifenfei;
    select count(1) from t_xifenfei
                         *
    第 1 行出现错误:
    ORA-01578: ORACLE 数据块损坏 (文件号 5, 块号 177)
    ORA-01110: 数据文件 5: 'E:\ORADATA\TEST\TS_TEST.DBF'

    跳过坏块重建该表

    SQL> alter session set events '10231 trace name context forever, level 10';
     
    会话已更改。
     
    SQL> create table t_xifenfei_bak tablespace ts_test
      as select * from t_xifenfei;
     
    表已创建。
     
    SQL> select count(1) from t_xifenfei_bak;
     
      COUNT(1)
    ----------
         85968
     
    SQL> drop table t_xifenfei purge;
     
    表已删除。
     
    SQL> rename t_xifenfei_bak to t_xifenfei;
     
    表已重命名。
     
    SQL> select count(1) from t_xifenfei;
     
      COUNT(1)
    ----------
         85968

    检查坏块情况
    通过rman和dbv检查,均表明file 5 block 177为坏块

    C:\Users\XFF>dbv file=E:\ORADATA\TEST\TS_TEST.DBF
     
    DBVERIFY: Release 11.2.0.4.0 - Production on 星期一 8月 8 17:25:57 2022
     
    Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
     
    DBVERIFY - 开始验证: FILE = E:\ORADATA\TEST\TS_TEST.DBF
    页 177 标记为损坏
    Corrupt block relative dba: 0x014000b1 (file 5, block 177)
    Bad check value found during dbv:
    Data in bad block:
     type: 6 format: 2 rdba: 0x014000b1
     last change scn: 0x0000.000ebc27 seq: 0x2 flg: 0x04
     spare1: 0x0 spare2: 0x0 spare3: 0x0
     consistency value in tail: 0xbc270602
     check value in block header: 0x5b2a
     computed block checksum: 0xbb32
     
     
     
    DBVERIFY - 验证完成
     
    检查的页总数: 16384
    处理的页总数 (数据): 2456
    失败的页总数 (数据): 0
    处理的页总数 (索引): 0
    失败的页总数 (索引): 0
    处理的页总数 (其他): 155
    处理的总页数 (段)  : 0
    失败的总页数 (段)  : 0
    空的页总数: 13772
    标记为损坏的总页数: 1
    流入的页总数: 0
    加密的总页数        : 0
    最高块 SCN            : 967616 (0.967616)
     
    RMAN> backup validate check logical datafile 5;
     
    启动 backup 于 08-8月 -22
    使用目标数据库控制文件替代恢复目录
    分配的通道: ORA_DISK_1
    通道 ORA_DISK_1: SID=118 设备类型=DISK
    通道 ORA_DISK_1: 正在启动全部数据文件备份集
    通道 ORA_DISK_1: 正在指定备份集内的数据文件
    输入数据文件: 文件号=00005 名称=E:\ORADATA\TEST\TS_TEST.DBF
    通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
    数据文件列表
    =================
    文件状态 标记为损坏 空块 已检查的块 高 SCN
    ---- ------ -------------- ------------ --------------- ----------
    5    FAILED 0              13744        16384           967621
      文件名: E:\ORADATA\TEST\TS_TEST.DBF
      块类型 失败的块 已处理的块
      ---------- -------------- ----------------
      数据       1              2457
      索引      0              0
      其他      0              183
     
    验证找到一个或多个损坏的块
    有关详细信息, 请参阅跟踪文件 C:\APP\XFF\diag\rdbms\test\test\trace\test_ora_22284.trc
    完成 backup 于 08-8月 -22
     
    SQL> select * from v$database_block_corruption ;
     
         FILE#     BLOCK#     BLOCKS CORRUPTION_CHANGE# CORRUPTIO
    ---------- ---------- ---------- ------------------ ---------
             5        177          1                  0 CHECKSUM

    查询坏块所属对象
    没有查询到该坏块所属对象,证明该block为游离块[不属于任何数据对象,是空闲块,但是损坏]

    SQL> SELECT OWNER, SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, A.PARTITION_NAME
      2    FROM DBA_EXTENTS A
      3   WHERE FILE_ID = &FILE_ID
      4     AND &BLOCK_ID BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS - 1;
    输入 file_id 的值:  5
    原值    3:  WHERE FILE_ID = &FILE_ID
    新值    3:  WHERE FILE_ID = 5
    输入 block_id 的值:  177
    原值    4:    AND &BLOCK_ID BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS - 1
    新值    4:    AND 177 BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS - 1
     
    未选定行

    通过Oracle Recovery Tools工具进行修复
    20220808173940


    再次检查坏块
    通过工具修复之后,dbv和rman检查均正常
    C:\Users\XFF>rman target /
     
    恢复管理器: Release 11.2.0.4.0 - Production on 星期一 8月 8 17:59:26 2022
     
    Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
     
    已连接到目标数据库: TEST (DBID=2410248200)
     
    RMAN> backup validate check logical datafile 5;
     
    启动 backup 于 08-8月 -22
    使用目标数据库控制文件替代恢复目录
    分配的通道: ORA_DISK_1
    通道 ORA_DISK_1: SID=54 设备类型=DISK
    通道 ORA_DISK_1: 正在启动全部数据文件备份集
    通道 ORA_DISK_1: 正在指定备份集内的数据文件
    输入数据文件: 文件号=00005 名称=E:\ORADATA\TEST\TS_TEST.DBF
    通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
    数据文件列表
    =================
    文件状态 标记为损坏 空块 已检查的块 高 SCN
    ---- ------ -------------- ------------ --------------- ----------
    5    OK     0              13745        16384           967621
      文件名: E:\ORADATA\TEST\TS_TEST.DBF
      块类型 失败的块 已处理的块
      ---------- -------------- ----------------
      数据       0              2456
      索引      0              0
      其他      0              183
     
    完成 backup 于 08-8月 -22
     
     
    C:\Users\XFF>dbv file=E:\ORADATA\TEST\TS_TEST.DBF
     
    DBVERIFY: Release 11.2.0.4.0 - Production on 星期一 8月 8 17:56:45 2022
     
    Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
     
    DBVERIFY - 开始验证: FILE = E:\ORADATA\TEST\TS_TEST.DBF
     
     
    DBVERIFY - 验证完成
     
    检查的页总数: 16384
    处理的页总数 (数据): 2456
    失败的页总数 (数据): 0
    处理的页总数 (索引): 0
    失败的页总数 (索引): 0
    处理的页总数 (其他): 183
    处理的总页数 (段)  : 0
    失败的总页数 (段)  : 0
    空的页总数: 13745
    标记为损坏的总页数: 0
    流入的页总数: 0
    加密的总页数        : 0
    最高块 SCN            : 967621 (0.967621)
     
     
    SQL> select * from v$database_block_corruption ;
     
    未选定行
  • 相关阅读:
    ....
    CodeForces 375A(同余)
    POJ 2377 Bad Cowtractors (最小生成树)
    POJ 1258 AgriNet (最小生成树)
    HDU 1016 Prime Ring Problem(全排列)
    HDU 4460 Friend Chains(bfs)
    POJ 2236 Wireless Network(并查集)
    POJ 2100 Graveyard Design(尺取)
    POJ 2110 Mountain Walking(二分/bfs)
    CodeForces 1059B Forgery(模拟)
  • 原文地址:https://www.cnblogs.com/xifenfei/p/16562976.html
Copyright © 2020-2023  润新知