嘉善博客
个人首页管理博客
数据库块损坏后的解决办法

数据块有坏块时,不能访问坏块上的数据,如果没有备份,那么,坏块上的数据就会丢失掉。

>>>>>>

SQL> select count(*) from t1;

  COUNT(*)
----------
       238

已用时间:  00: 00: 00.00

>>>>>>>Table T1总共有238行数据

>>>以dba身份登陆数据库
SQL> conn / as sysdba
已连接。

>>>关闭数据库
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

>>>用UltraEdit编辑数据文件TS_TEST01.DBF,随便改几个地方然后保存,模拟数据块坏掉

>>>启动数据库
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  135338868 bytes
Fixed Size                   453492 bytes
Variable Size             109051904 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
数据库装载完毕。
数据库已经打开。
SQL> conn scott/tiger
已连接。

>>>查询数据的时候报错
SQL> select count(*) from t1;
select count(*) from t1
                     *
ERROR 位于第 1 行:
ORA-01578: ORACLE 数据块损坏(文件号28,块号20)
ORA-01110: 数据文件 28: 'E:ORACLEORADATAORABD02TS_TEST01.DBF'


已用时间:  00: 00: 00.01
SQL> conn / as sysdba
已连接。
SQL> SELECT tablespace_name, segment_type, owner, segment_name
  2  FROM dba_extents
  3  WHERE file_id =28
  4  and 20 between block_id AND block_id + blocks - 1
  5  /

TABLESPACE_NAME SEGMENT_TYPE    OWNER      SEGMENT_NAME
--------------- --------------- ---------- ---------------------------------------------
TS_TEST01       TABLE           SCOTT      T1

>>>这时候的数据表示不可以被exp出来的:

C:Documents and SettingsAdministrator>exp scott/tiger file=c: .dmp tables=t1

Export: Release 9.2.0.1.0 - Production on 星期六 11月 27 12:07:19 2004

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


连接到: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
服务器使用 AL32UTF8 字符集 (可能的字符集转换)

即将导出指定的表通过常规路径 ...
. . 正在导出表                              T1
EXP-00056: 遇到 ORACLE 错误 1578
ORA-01578: ORACLE 数据块损坏(文件号28,块号20)
ORA-01110: 数据文件 28: 'E:ORACLEORADATAORABD02TS_TEST01.DBF'
导出成功终止,但出现警告。

C:Documents and SettingsAdministrator>

>>>这时可以通过设置内部事件,使exp跳过这些损坏的block
SQL> ALTER SYSTEM SET EVENTS='10231 trace name context forever,level 10' ;

系统已更改。

已用时间:  00: 00: 00.00
SQL> host

>>>exp 出数据

SQL>
SQL> conn scott/tiger
已连接。

>>> drop掉旧的Table
SQL> drop table t1;

表已丢弃。

已用时间:  00: 00: 01.03
SQL> host

>>>imp 数据

SQL> conn scott/tiger
已连接。

>>>查询数据,可以看到有损失了54行数据
SQL> select count(*) from t1;

  COUNT(*)
----------
       184

已用时间:  00: 00: 00.00
SQL>



标签: