Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

3

积分

0

好友

0

主题
1#
发表于 2012-4-15 17:14:45 | 查看: 5474| 回复: 2
您好,咨询一下,当oracle出现物理的坏块,已经知道是表的物理坏块(Data file corruption  :table ),从oracle方面有没有什么方法来避免数据下次再次存储到坏块,除了换磁盘或者做磁盘的坏块扫描。

只有如下的解决方法:?? 对效率影响?
****
DB_BLOCK_CHECKSUM can be set to TRUE in the INIT.ORA file.When a block is changed and being written to disk from memory, DBWR calculatesa checksum for the block by summing up its contents and writes it in the blockalong with it on disk.  The next time when the block is being read by theforeground process, it calculates the checksum again for the block that isbeing read and compared with the checksum already written in the block ondisk.  If both are different then theblock has been corrupted on disk and so the block is not read into memory sothat it prevents cache corruption.  There is an overhead associated with this parameter since thechecksum is calculated each time it is read and written.
****

[ 本帖最后由 快乐神仙 于 2012-4-15 17:41 编辑 ]
2#
发表于 2012-4-15 20:38:41
先说一点 题外话 关于 如何绕过 存在 讹误corruption的 data  block (有数据的块):

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options

SQL> create tablespace mac datafile '/s01/mac.dbf' size 20M;

Tablespace created.



SQL>  create table maclean tablespace mac as select * from dba_objects;

Table created.


SQL> alter system checkpoint;

System altered.


RMAN> backup tablespace mac;


[oracle@vrh8 ~]$ bbed filename=/s01/mac.dbf blocksize=8192 mode=edit password=blockedit

BBED: Release 2.0.0.0.0 - Limited Production on Sun Apr 15 08:25:31 2012

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

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

BBED> set block 20
        BLOCK#          20

BBED> map /v
File: /s01/mac.dbf (0)
Block: 20                                    Dba:0x00000000
------------------------------------------------------------
KTB Data Block (Table/Cluster)

struct kcbh, 20 bytes                      @0      
    ub1 type_kcbh                           @0      
    ub1 frmt_kcbh                           @1      
    ub1 spare1_kcbh                         @2      
    ub1 spare2_kcbh                         @3      
    ub4 rdba_kcbh                           @4      
    ub4 bas_kcbh                            @8      
    ub2 wrp_kcbh                            @12      
    ub1 seq_kcbh                            @14      
    ub1 flg_kcbh                            @15      
    ub2 chkval_kcbh                         @16      
    ub2 spare3_kcbh                         @18      

struct ktbbh, 96 bytes                     @20      
    ub1 ktbbhtyp                            @20      
    union ktbbhsid, 4 bytes                 @24      
    struct ktbbhcsc, 8 bytes                @28      
    b2 ktbbhict                             @36      
    ub1 ktbbhflg                            @38      
    ub1 ktbbhfsl                            @39      
    ub4 ktbbhfnx                            @40      
    struct ktbbhitl[3], 72 bytes            @44      

struct kdbh, 14 bytes                      @124     
    ub1 kdbhflag                            @124     
    b1 kdbhntab                             @125     
    b2 kdbhnrow                             @126     
    sb2 kdbhfrre                            @128     
    sb2 kdbhfsbo                            @130     
    sb2 kdbhfseo                            @132     
    b2 kdbhavsp                             @134     
    b2 kdbhtosp                             @136     

struct kdbt[1], 4 bytes                    @138     
    b2 kdbtoffs                             @138     
    b2 kdbtnrow                             @140     

sb2 kdbr[79]                               @142     

ub1 freespace[824]                         @300     

ub1 rowdata[7064]                          @1124   

ub4 tailchk                                @8188  



BBED> corrupt
Block marked media corrupt.



SQL> alter system flush buffer_cache;

System altered.

SQL> select count(*) from maclean;
select count(*) from maclean
                     *
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 17, block # 20)
ORA-01110: data file 17: '/s01/mac.dbf'



SQL>    declare
  2      begin
  3      dbms_repair.skip_corrupt_blocks (
  4         schema_name => 'SYS',
  5         object_name => 'MACLEAN',
  6         object_type => dbms_repair.table_object,
  7         flags => dbms_repair.skip_flag);
  8      end;
  9      /

PL/SQL procedure successfully completed.

SQL>  select table_name, skip_corrupt from dba_tables  where table_name = 'MACLEAN';

TABLE_NAME                     SKIP_COR
------------------------------ --------
MACLEAN                        ENABLED




SQL>  select count(*) from maclean;

  COUNT(*)
----------
     50634

SQL> select count(*) from dba_objects;

  COUNT(*)
----------
     50713

回复 只看该作者 道具 举报

3#
发表于 2012-4-15 20:55:03
再回答 LZ的疑问:


"当oracle出现物理的坏块,已经知道是表的物理坏块(Data file corruption  :table ) 从oracle方面有没有什么方法来避免数据下次再次存储到坏块"


物理讹误也分几种情况:

1.block fracture 即在写入datafile block的物理I/O时 不完整地写入了块内容
2.物理损坏 即发生坏道、扇区, 物理数据块无法读取


对于第一种情况 ,物理数据块所在的 磁道、扇区并没有机械损坏,所以这些物理块是可以被重用的


SQL> drop table maclean;

Table dropped.

SQL> create table maclean1 tablespace mac as select * from dba_objects;

Table created.

SQL> alter system checkpoint;

System altered.


SQL> select count(*) from maclean1;

  COUNT(*)
----------
     50707



对于第二种情况 只能绕过这类 物理损坏的 数据块

例如 重建 表空间 或 在原数据文件的基础上 加入新的 数据文件

并指定 该 存在讹误的表空间上的 数据段使用 新加入的 没有 物理损坏的 数据文件, 例如


alter table maclean allocate extent (datafile 'NO_CORRUPTION_DATAFILE' size 1000M);

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-12-24 03:33 , Processed in 0.044588 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569