【問題處理】ORA-01157 ORA-01110

恩強Boy發表於2021-02-01

問題說明

今天一個客戶反映,資料庫透過RMAN 還原後,起庫報 ORA-01157 01110 錯誤

SQL> startup;

ORACLE instance started.

Total System Global Area 16034911968 bytes

Fixed Size                  22533664 bytes

Variable Size             9898578976 bytes

Database Buffers          6039796776 bytes

Redo Buffers                73197552 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 44  - see DBWR trace file

ORA-01110: data file 44 : '/u0 1 / app/oracle /oradata/ users02 .dbf'

原因分析

ORA-01157 錯誤一般是因為後臺程式無法找到其中一個資料檔案,或者資料檔案已經在使用中,無法鎖定它。此時資料庫將禁止對該檔案的訪問,其他檔案不會受到影響。然而,開啟資料庫的例項需要訪問所有線上資料檔案,如果有資料檔案存在上述問題,將會報 ORA-01157 錯誤。

ORA-01157 錯誤通常跟 ORA-01110 錯誤一起出現,可能是 Oracle 作業系統層錯誤,在 background_dump_dest 會生產一個 DBWR 跟蹤檔案,跟蹤檔案可能會有以下資訊

ORA-01157: cannot identify/lock data file 44  - see DBWR trace file
ORA-01110: data file 44 : '/u0 1 / app/oracle /oradata/ users02 .dbf'
ORA-27037: unable to obtain file status
SVR4 Error: 2: No such file or directory
Additional information: 3

解決方法

情況一:資料檔案存在,但是Oracle 找不到它

在這種情況下,資料檔案可能在作業系統層面被重新命名,或者被移動到其他的目錄位置。對於這種情況,需要restore recover 該資料檔案,或將資料檔案移動到原始位置

情況二:資料檔案不存在,或者資料檔案已經被物理刪除或損壞,Oracle 無法識別它

例如,資料檔案可能被截斷或覆蓋,在這種情況下將會伴隨ORA-27046 錯誤 ORA-27046: file size is not a multiple of logical block size In this case

在這種情況下,使用者可以有兩個選擇:

1.  重建該檔案所屬的表空間

這個選項適用於users/index/temporary 表空間。如果表空間是 system 表空間,這就相當於是重建資料庫。這種方法最適合臨時表空間,因為臨時表空間不包含重要資料。如果表空間最近的匯出物件是可用的,或者表空間的表可以透過其他方式進行載入,這種辦法會很有幫助。

重建表空間的步驟如下:

1)  啟動到mount 狀態

SQL> startup mount;

2)  offline 該資料檔案

如果是歸檔模式

SQL> alter database datafile 'filename' offline;

如果是非歸檔模式

SQL> alter database datafile 'filename' offline drop;

3)  開啟資料庫

SQL> alter database open;

4)  刪除該表空間

SQL> drop tablespace tablespace_name including contents and datafiles;

5)  重新建立該表空間

SQL> create tablespace tablespace_name datafile 'filename' size xxx;

6)  將表空間物件物件重新匯入

使用匯入指令碼重新匯入該表空間內的物件。

2.  使用正常恢復程式恢復該資料檔案

對於業務表空間、索引表空間,重新建立不太可能。如果有備份和完整的歸檔日誌情況下,這種是推薦的方法。如果資料庫處於非歸檔模式,只有當要應用到資料檔案的日誌在redo log 範圍內,才能成功進行恢復,這種方法對於只讀表空間比較理想。

步驟如下:

1)  資料庫啟動到mount 狀態

SQL> startup mount;

2)  執行查詢(歸檔模式)

SQL> SELECT V1.GROUP#, MEMBER, SEQUENCE#, FIRST_CHANGE# FROM V$LOG V1, V$LOGFILE V2 WHERE V1.GROUP# = V2.GROUP# ;

這個查詢將列出所有的redo log 和他們各自的順序和最先更改的編號

3)  執行查詢(非歸檔模式)

SQL> SELECT FILE#, CHANGE# FROM V$RECOVER_FILE;

如果CHANGE# 大於日誌的最小 FIRST_CHANGE# ,則可以恢復資料檔案;如果 CHANGE# 小於日誌的最小 FIRST_CHANGE# ,則無法恢復資料檔案

4)  恢復資料檔案

SQL> recover datafile 'filename';

5)  確認提示的每個日誌,直到收到 Media Recovery Complete ,如果提示輸入不存在的歸檔日誌, Oracle 可能需要一個或多個 redolog 來進行恢復。

6)  開啟資料庫

SQL> alter database open;

 

 

---- end ----

 

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31529886/viewspace-2754982/,如需轉載,請註明出處,否則將追究法律責任。

相關文章