一個10g的庫斷電後,打開時出現ora-01200的錯誤:
SQL> connect / as sysdba;
已鏈接到空閒例程。
SQL> startup;
ORACLE 例程已經啓動。linux
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 155192196 bytes
Database Buffers 448790528 bytes
Redo Buffers 7135232 bytes
數據庫裝載完畢。
ORA-01122: 數據庫文件 17 驗證失敗
ORA-01110: 數據文件 17: 'D:ORACLEPRODUCT10.2.0ORADATAORCLZL9EPRDAT.DBF'
ORA-01200: 255360 的實際文件大小小於 264960 塊的正確大小數據庫
ORA-01200錯誤的官方解釋以下:windows
ORA-01200 actual file size of string is smaller than correct size of string blocks服務器
Cause: The size of the file as returned by the operating system is smaller than the size of the file as indicated in the file header and the control file. Somehow the file has been truncated. Maybe it is theoracle
result of a half completed copy.app
Action: Restore a good copy of the datafile and do recovery as needed.ide
意思是說只有找備份進行恢復.看來問題比較嚴重, 這個文件中保存中ZLHIS的病歷數據,丟失了對客戶的損失太大. 操做系統的文件大小小於數據文件頭記錄的大小,咱們能否在數據文件末尾"增長"一段空的字節呢?在linux下可使用dd命令產生這種文件,再附加到數據文件末尾.windows下也提供了一個fsutil命令,能夠用來產生指定字節數的空文件.ui
--1.首先須要計算,空文件的字節數:
(264960-255360) * 8192 = 78643200
--2.產生一個指定字節數的空文件.
C:Documents and SettingsAdministrator>fsutil file createnew c:append.dbf 78643200
已建立文件 c:append.dbf
--3.附加到數據文件末尾
C:Documents and SettingsAdministrator>type c:append.dbf >>D:ORACLEPRODUCT
10.2.0ORADATAORCLZL9EPRDAT.DBFthis
通過這麼處理後,數據庫已經能夠mount起來了:spa
SQL> startup;
ORACLE 例程已經啓動。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 155192196 bytes
Database Buffers 448790528 bytes
Redo Buffers 7135232 bytes
數據庫裝載完畢。
ORA-01172: 線程 1 的恢復中止在塊 259285 (在文件 17 中)
ORA-01151: 若是須要, 請使用介質恢復以恢復塊和還原備份
在打開數據庫時候,發覺沒法作實例恢復,提示恢復的文件就是剛纔損壞的數據文件:
SQL> select name from v$datafile where file#=17;
NAME
--------------------------------------------------------------------------------
D:ORACLEPRODUCT10.2.0ORADATAORCLZL9EPRDAT.DBF
嘗試介質恢復, 出現了討厭的ORA-00600錯誤:
SQL> recover database;
ORA-00283: 恢復會話因錯誤而取消
ORA-12801: 並行查詢服務器 P000 中發出錯誤信號
ORA-10562: Error occurred while applying redo to data block (file# 17, block#
258754)
ORA-10564: tablespace ZL9EPRDAT
ORA-01110: data file 17: 'D:ORACLEPRODUCT10.2.0ORADATAORCLZL9EPRDAT.DBF'
ORA-10560: block type '0'
ORA-00600: internal error code, arguments: [4552], [1], [0], [], [], []
某些數據文件塊已經損壞,沒法應用redo中的日誌,這部分數據可能已經損壞,決定捨棄這部分數據.使用_allow_resetlogs_corruption參數跳過redo日誌文件
SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile;
系統已更改。
SQL> shutdown immediate;
ORA-01109: 數據庫未打開
已經卸載數據庫。
ORACLE 例程已經關閉。
SQL> startup mount;
ORACLE 例程已經啓動。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 155192196 bytes
Database Buffers 448790528 bytes
Redo Buffers 7135232 bytes
數據庫裝載完畢。
直接作不徹底恢復,會提示歸檔日誌找不到,不用理會,嘗試用resetlogs打開數據庫,仍是失敗!! fuck!!
SQL> recover database until cancel;
ORA-00279: 更改 181426480 (在 06/11/2009 18:15:23 生成) 對於線程 1 是必需的
ORA-00289: 建議:
E:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG2009_06_11O1_MF_1_
8980_%U_.ARC
ORA-00280: 更改 181426480 (用於線程 1) 在序列 #8980 中
指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: 沒法打開歸檔日誌
'E:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG2009_06_11O1_MF_1
_8980_%U_.ARC'
ORA-27041: 沒法打開文件
OSD-04002: 沒法打開文件
O/S-Error: (OS 2) 系統找不到指定的文件。
ORA-00308: 沒法打開歸檔日誌
'E:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG2009_06_11O1_MF_1
_8980_%U_.ARC'
ORA-27041: 沒法打開文件
OSD-04002: 沒法打開文件
O/S-Error: (OS 2) 系統找不到指定的文件。
ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 將出現以下錯誤
ORA-01194: 文件 1 須要更多的恢復來保持一致性
ORA-01110: 數據文件 1: 'D:ORACLEPRODUCT10.2.0ORADATAORCLSYSTEM01.DBF'
SQL> alter database open resetlogs;
alter database open resetlogs
*
第 1 行出現錯誤:
ORA-03113: 通訊通道的文件結束
這時候,查看後臺的alertORCL.log文件,有以下錯誤:
Thu Jun 11 22:59:58 2009
Errors in file e:oracleproduct10.2.0adminorclbdumporcl_smon_2064.trc:
ORA-00600: internal error code, arguments: [4193], [34756], [34760], [], [], [], [], []
查詢metalink獲得上述錯誤主要是跟undo有關:
PURPOSE:
This article discusses the internal error "ORA-600 [4193]", what
it means and possible actions. The information here is only applicable
to the versions listed and is provided only for guidance.
ERROR:
ORA-600 [4193] [a] [b]
VERSIONS:
versions 6.0 to 10.1
DESCRIPTION:
A mismatch has been detected between Redo records and Rollback (Undo)
records.
We are validating the Undo block sequence number in the undo block against
the Redo block sequence number relating to the change being applied.
This error is reported when this validation fails.
ARGUMENTS:
Arg [a] Undo record seq number
Arg [b] Redo record seq number
FUNCTIONALITY:
KERNEL TRANSACTION UNDO
IMPACT:
PROCESS FAILURE
POSSIBLE ROLLBACK SEGMENT CORRUPTION
設置undo表空間爲手動管理,再打數據庫成功!!!
SQL> connect / as sysdba;
已鏈接到空閒例程。
SQL> startup mount;
ORACLE 例程已經啓動。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 155192196 bytes
Database Buffers 448790528 bytes
Redo Buffers 7135232 bytes
數據庫裝載完畢。
SQL> show parameter undo;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
SQL> alter system set undo_management=manual scope=spfile;
系統已更改。
SQL> shutdown immediate;
ORA-01109: 數據庫未打開
已經卸載數據庫。
ORACLE 例程已經關閉。
SQL> startup mount;
ORACLE 例程已經啓動。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 155192196 bytes
Database Buffers 448790528 bytes
Redo Buffers 7135232 bytes
數據庫裝載完畢。
SQL> alter database open;
數據庫已更改。
SQL> alter user system identified by his;
用戶已更改。
最後就是export數據,重建數據庫.