數據文件出現壞快的解決之二(設置內部事件使exp跳過壞塊)
http://blog.chinaunix.net/u1/50863/showart_400575.html和數據文件出現壞塊時之五中提到的前幾步一樣,先模擬出壞塊,然后用dbv檢查,此時,不用dbms_repair,而用下面的方法:
1.先exp該表試驗一下
在這種情況下,如果有備份,需要從備份中恢復
如果沒有備份,那么壞塊部分的數據肯定要丟失了
在這個時候導出是不允許的:
E:\>exp eygle/eygle file=t.dmp tables=t
Export: Release 9.2.0.4.0 - Production on 星期一 3月 8 20:54:15 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
連接到: Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production
已導出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即將導出指定的表通過常規路徑 ...
. . 正在導出表 T
EXP-00056: 遇到 ORACLE 錯誤 1578
ORA-01578: ORACLE 數據塊損壞(文件號4,塊號35)
ORA-01110: 數據文件 4: 'E:\ORACLE\ORADATA\EYGLE\BLOCK.DBF'
導出成功終止,但出現警告。
2.當然,對于不同的情況需要區別對待 ,如果損失不是數據而是重要的oracle內部信息,則不能用set event
首先你需要檢查損壞的對象,使用以下SQL:
--------------------------------------------------------------------------------
SQL> SELECT tablespace_name, segment_type, owner, segment_name
2 FROM dba_extents
3 WHERE file_id = 4
4 and 35 between block_id AND block_id + blocks - 1
5 ;
TABLESPACE_NAME SEGMENT_TYPE OWNER
------------------------------ ------------------ -------------------------
SEGMENT_NAME
---------------------------------------------------------------------------
BLOCK TABLE 'EYGLE'
'T'
--------------------------------------------------------------------------------
3.如果損失的是數據,ok,可以設置內部事件,使exp跳過這些損壞的block
10231事件指定數據庫在進行全表掃描時跳過損壞的塊
ALTER SYSTEM SET EVENTS='10231 trace name context forever,level 10' ;
SQL> ALTER SYSTEM SET EVENTS='10231 trace name context forever,level 10' ;
系統已更改。
然后我們可以導出未損壞的數據
SQL> host
Microsoft Windows XP [版本 5.1.2600]
(C) 版權所有 1985-2001 Microsoft Corp.
E:\
E:\>exp eygle/eygle file=t.dmp tables=t
Export: Release 9.2.0.4.0 - Production on 星期一 3月 8 20:57:13 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
連接到: Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production
已導出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即將導出指定的表通過常規路徑 ...
. . 正在導出表 T 8036 行被導出
在沒有警告的情況下成功終止導出。
這時候數據成功導出.
然后我們可以drop table,recreate,然后導入數據
本例中
我們損失了
8192 - 8036 = 156 行數據
4.重建表,再導入
SQL> connect eygle/eygle
已連接。
SQL> drop table t;
表已丟棄。
SQL> host
Microsoft Windows XP [版本 5.1.2600]
(C) 版權所有 1985-2001 Microsoft Corp.
E:\Oracle\ora92\bin>cd \
E:\>imp eygle/eygle file=t.dmp tables=t
Import: Release 9.2.0.4.0 - Production on 星期一 3月 8 21:12:38 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
連接到: Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production
經由常規路徑導出由EXPORT:V09.02.00創建的文件
已經完成ZHS16GBK字符集和AL16UTF16 NCHAR 字符集中的導入
. 正在將EYGLE的對象導入到 EYGLE
. . 正在導入表 "T" 8036行被導入
成功終止導入,但出現警告。
E:\>exit
SQL> select count(*) from t;
COUNT(*)
----------
8036
完成數據恢復
最后如果要取消events設置,做以下操作:
如果你在初始化參數中設置的
注釋之
如果在命令行設置的
alter system set events='10231 trace name context off';
posted on 2009-11-25 22:29 gdufo 閱讀(1133) 評論(0) 編輯 收藏 所屬分類: Database (oracle, sqlser,MYSQL)