您的位置:首页 > 数据库

ora-01578 数据库坏块处理

2014-04-30 10:02 387 查看
1、使用dbv工具检查报错的数据文件,dbv工具可以检测online或者offline的数据文件
使用oracle用户登录系统,dbv工具在$ORACLE_HOME/bin路径下:
$ id

uid=203(oracle) gid=206(oinstall) groups=202(asmdba),204(dba),205(oper)

$ $ORACLE_HOME/bin/dbv

DBVERIFY: Release 11.2.0.3.0 - Production on Tue Apr 29 22:01:09 2014

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Keyword     Description                    (Default)

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

FILE        File to Verify                 (NONE)

START       Start Block                    (First Block of File)

END         End Block                      (Last Block of File)

BLOCKSIZE   Logical Block Size             (8192)

LOGFILE     Output Log                     (NONE)

FEEDBACK    Display Progress               (0)

PARFILE     Parameter File                 (NONE)

USERID      Username/Password              (NONE)

SEGMENT_ID  Segment ID (tsn.relfile.block) (NONE)

HIGH_SCN    Highest Block SCN To Verify    (NONE)

            (scn_wrap.scn_base OR scn)         

注释:

   

    ① 如果feedback=1000,则验证1000个块显示一个。这个符号

   

    ② USERID --当验证asm文件时,要指定

   

    ③ FILE --用户指定要验证的数据文件名

   

    ④ BLOCKSIZE --指定数据文件的尺寸,缺省值为8192,对于非8192块将收到DBV-00103错误

   

    ⑤ PARFILE --可以像使用expdp/impdp一样,将一些选项置于参数文件里面

   

    ⑥ SEGMENT_ID --校验段,需要表空间ID,数据文件ID,段的头部ID

例如检查asm存储中数据文件的坏块,命令为:
$ dbv file=+DG01/test/datafile/users.264.845009941 userid=system/system

DBVERIFY: Release 11.2.0.3.0 - Production on Tue Apr 29 21:50:54 2014

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

DBVERIFY - Verification starting : FILE = +DG01/test/datafile/users.264.845009941

DBVERIFY - Verification complete

Total Pages Examined         : 640

Total Pages Processed (Data) : 0

Total Pages Failing   (Data) : 0

Total Pages Processed (Index): 0

Total Pages Failing   (Index): 0

Total Pages Processed (Other): 127

Total Pages Processed (Seg)  : 0

Total Pages Failing   (Seg)  : 0

Total Pages Empty            : 513

Total Pages Marked Corrupt   : 0

Total Pages Influx           : 0

Total Pages Encrypted        : 0

Highest block SCN            : 0 (0.0)

注意:如果Total Pages Influx的值大于零,且未存在坏块的情况下,是由于针对open状态的文件运行dbv程序遇到了一个当前正在被DBWn进程写入的数据块。

2、使用sql语句检查损坏的对象
如果报以下错误:
ORA-01578: ORACLE 数据块损坏 (文件号 6,
块号 20)
ORA-01110: 数据文件 6:'F:/ORACLE/PRODUCT/10.2.0/ORADATA/MOVO/BLOCK.DBF'
则sql语句为:
select tablespace_name,segment_type,owner,segment_name fromdba_extents
 where file_id=6 and 20 between block_id and block_id+blocks-1
 
如果损失的是数据,ok
我们可以设置内部事件,使exp跳过这些损坏的block 
SQL> alter system set events='10231 trace name contextforever,level 10';  
 
系统已更改。
 
SQL>
 
注意: 10231 内部事件,设置在全表扫描时跳过损坏的数据块.
 
 
 
然后我们可以导出未损坏的数据:
 
 
C:/Documents and Settings/Administrator>exp skate/skate@movo file=t.dmptables=t
 
 
Export: Release 10.2.0.1.0 - Production on
星期四 6月 12 18:22:492008
 
Copyright (c) 1982, 2005, Oracle. All rights reserved.
 
 
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
已导出 ZHS16GBK
字符集和 AL16UTF16NCHAR
字符集
 
即将导出指定的表通过常规路径...
. . 正在导出表                              T导出了       7102

成功终止导出,
没有出现警告。
 
C:/Documents and Settings/Administrator>
 
 
 
 
这时候数据成功导出.这是我可以drop table,然后recreate这个表,最后在imp数据
 
删除表T:
 
SQL> drop table t;
drop table t
           *
第 1
行出现错误:
ORA-00942: 表或视图不存在
 
 
SQL> drop table skate.t;
 
表已删除。
 
SQL> commit;
 
提交完成。
 
SQL>
 
 
导入数据
 
C:/Documents and Settings/Administrator>imp skate/skate@movo file=t.dmptables=t
 
 
Import: Release 10.2.0.1.0 - Production on
星期四 6月 12 18:29:362008
 
Copyright (c) 1982, 2005, Oracle. All rights reserved.
 
 
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
 
经由常规路径由 EXPORT:V10.02.01
创建的导出文件
已经完成 ZHS16GBK
字符集和 AL16UTF16 NCHAR
字符集中的导入
. 正在将 SKATE
的对象导入到 SKATE
. 正在将 SKATE
的对象导入到 SKATE
. . 正在导入表                            "T"导入了       7102

成功终止导入,
没有出现警告。
 
C:/Documents and Settings/Administrator>
 
 
SQL> select count(*) from skate.t;
 
 COUNT(*)
----------
      7102
 
SQL>
 
现在这个表可以访问了
 
 
在这个例子中我们损失数据为:
 
 7168-7102=66
数据块损坏前:
 
SQL> select count(*) from t;
 
 COUNT(*)
----------
      7168
 
数据块损坏后:
 
SQL> select count(*) from t;
 
 COUNT(*)
----------
      7102
 
 
 
---end----
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息