oracle日誌文件相關問題彙總

oracle日誌文件相關問題彙總。

1:條件一:

正常關閉數據庫的情況下(shutdown immediate或者shutdown nomal),redo文件全部丟失。
此種情況下,由於是正常關閉數據庫,數據文件,redo文件以及控制文件SCN是一直的,redo文件中的所有操作記錄都已經歸檔,所以如果在這種情況下丟失所有redo的話,恢復是很簡單的,一般思路是:
Startup mount
Recover database until cancel;
Alter database open resetlogs;(執行此命令後,oracle會重新建立redo文件)
執行完以上操作後,馬上全備數據庫。
具體恢復方法很多,主要有一下幾種:
試驗一:
用命令清空日誌組方法
1、查看原來表中數據
SQL>; conn test/test
Connected.
SQL>; select * from test;
       TEL
----------
         1
         2
         3
2、插入新數據
SQL>; insert into test values(4);
1 row created.
SQL> commit;
Commit complete.
3、 正常關閉數據庫
4、 利用os command刪除所有redo文件。
5、 啓動數據庫
SQL>startup
ORACLE instance started.
Total System Global Area  353862792 bytes
Fixed Size                   730248 bytes
Variable Size             285212672 bytes
Database Buffers           67108864 bytes
Redo Buffers                 811008 bytes
Database mounted.
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/T3/ORACLE/oradata/ORA9/redo01.log'
6、 查看當前日誌狀態
SQL>; select * from v$log;
GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIME
------------- ----------
         1          1          2  104857600          1 YES INACTIVE
       487837 01-9月 -05
         2          1          4  104857600          1 NO  CURRENT
       487955 01-9月 -05
         3          1          3  104857600          1 YES INACTIVE
       487839 01-9月 -05
看來redo01.log不是當前日誌,對於這類非當前日誌可以直接clear,系統會重新自動生成一個redo文件。
7、SQL> alter database clear logfile group 1;
Database altered.
7、 繼續啓動db
SQL>; alter database open;
alter database open
*
ERROR at line 1:
ORA-00313: open failed for members of log group 2 of thread 1
ORA-00312: online log 2 thread 1: '/T3/ORACLE/oradata/ORA9/redo02.log'
8、 看來redo也得恢復,但是redo02是當前redo,直接clear是不行的
SQL>; alter database clear logfile group 2;
alter database clear logfile group 2
*
ERROR at line 1:
ORA-00350: log 2 of thread 1 needs to be archived
ORA-00312: online log 2 thread 1: '/T3/ORACLE/oradata/ORA9/redo02.log'
嘗試clear unarchived logfile group ,報錯:
SQL> alter database clear unarchived logfile group 2;
alter database clear unarchived logfile group 2
*
ERROR at line 1:
ORA-00313: open failed for members of log group 2 of thread 1
ORA-00312: online log 2 thread 1: '/T3/ORACLE/oradata/ORA9/redo02.log'
ORA-27037: unable to obtain file status
SVR4 Error: 2: No such file or directory
Additional information: 3
看來他是因爲找不到這個文件,從有效的備份中cp一個過來看看
SQL>! cp /T3/ORACLE/oradatabak/redo02* /T3/ORACLE/oradata/ORA9
SQL>alter database clear unarchived logfile group 2;
Database altered.
搞定……….
9、 按照oracle的某些做法也是可以的
SQL>alter database clear unarchived logfile group 1 unrecoverable datafile;
Database altered.
10、但是對於非當前日誌就都可以,下面看看redo03
SQL>;  alter database clear logfile group 3;
Database altered.
結論:
如果數據庫是正常shutdown,非當前日誌都可以直接clear來重新生成,而且不丟失數據,因爲正常關閉db,數據已經寫入dbf文件了。唯獨當前日誌不可以,當前日誌必須首先從有效的備份中拷貝一個日誌文件過來,然後用
alter database clear unarchived logfile group n 或alter database clear unarchived logfile group n,除此之外,還可以用下面的方法來做

試驗方法二:
用cancel模式恢復數據庫
前面的出錯提示,步驟都一樣,唯獨恢復的方法不一樣
SQL>startup
ORACLE instance started.
Total System Global Area  353862792 bytes
Fixed Size                   730248 bytes
Variable Size             285212672 bytes
Database Buffers           67108864 bytes
Redo Buffers                 811008 bytes
Database mounted.
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/T3/ORACLE/oradata/ORA9/redo01.log'
看看丟失了哪些redo
SQL> host ls /T3/ORACLE/oradarta/ORA9/redo*
/T3/ORACLE/oradarta/ORA9/redo*: No such file or directory
看來redo都丟了
直接recover
SQL>recover database until cancel;
Media recovery complete.
這個時候redo還沒有生成
SQL>; host ls /T3/ORACLE/oradata/ORA9/redo*
/T3/ORACLE/oradata/ORA9/redo*: No such file or directory
啓動數據庫
SQL>; alter database open ;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
SQL>alter database open resetlogs;
Database altered.
(注意,這裏必須用resetlogs,否則會錯誤的
SQL>alter database open noresetlogs;
alter database open noresetlogs
*
ERROR at line 1:
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/T3/ORACLE/oradata/ORA9/redo01.log'
SQL>
Resetlogs其實就是根據控制文件讓系統自動重新生成redo,如果noresetlog的話,就不會重新生成redo,缺少了文件,db自然無法啓動)
SQL>host ls /T3/ORACLE/oradata/ORA9/redo*
/T3/ORACLE/oradata/ORA9/redo01.log  /T3/ORACLE/oradata/ORA9/redo02.log  /T3/ORACLE/oradata/ORA9/redo03.log
檢驗
SQL>select * from test.test;
       TEL
----------
         1
         2
         3
         4
數據一點兒都沒有丟失。
結論:
如果數據庫是正常關閉的,用recover database until cancel可以輕鬆恢復或者說重新建立所有的redo,不再區分是否是當前日誌,而且由於正常關閉,不會丟失任何數據,唯一可能丟失的情況就是如果日誌還沒有歸檔。
這種恢復方法 由於要resetlogs,所以在恢復完成後,日誌清零,以前的備份不再起作用,所以建議立即備份。
SQL>archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /T3/ORACLE/arch
Oldest online log sequence     0
Next log sequence to archive   1
Current log sequence           1
SQL>;
實驗三:
通過重新生成控制文件來恢復redo
前面的都一樣,只是處理方法不一樣
SQL>; startup
ORACLE instance started.
Total System Global Area  353862792 bytes
Fixed Size                   730248 bytes
Variable Size             285212672 bytes
Database Buffers           67108864 bytes
Redo Buffers                 811008 bytes
Database mounted.
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/T3/ORACLE/oradata/ORA9/redo01.log'
SQL>alter database backup controlfile to trace;
Database altered.
SQL>; shutdown immediate
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
2、 修改一下剛纔生成的那個文件
CREATE CONTROLFILE REUSE DATABASE "ORA9"  RESETLOGS  ARCHIVELOG
--  SET STANDBY TO MAXIMIZE PERFORMANCE
    MAXLOGFILES 50
    MAXLOGMEMBERS 5
    MAXDATAFILES 100
    MAXINSTANCES 1
    MAXLOGHISTORY 226
LOGFILE
  GROUP 1 '/T3/ORACLE/oradata/ORA9/redo01.log'  SIZE 100M,
  GROUP 2 '/T3/ORACLE/oradata/ORA9/redo02.log'  SIZE 100M,
  GROUP 3 '/T3/ORACLE/oradata/ORA9/redo03.log'  SIZE 100M
-- STANDBY LOGFILE
DATAFILE
  '/T3/ORACLE/oradata/ORA9/system01.dbf',
  '/T3/ORACLE/oradata/ORA9/undotbs01.dbf',
  '/T3/ORACLE/oradata/ORA9/cwmlite01.dbf',
  '/T3/ORACLE/oradata/ORA9/drsys01.dbf',
'/T3/ORACLE/oradata/ORA9/example01.dbf',
  '/T3/ORACLE/oradata/ORA9/indx01.dbf',
  '/T3/ORACLE/oradata/ORA9/odm01.dbf',
  '/T3/ORACLE/oradata/ORA9/tools01.dbf',
  '/T3/ORACLE/oradata/ORA9/users01.dbf',
  '/T3/ORACLE/oradata/ORA9/xdb01.dbf',
  '/T3/ORACLE/oradata/ORA9/test01.dbf'
CHARACTER SET ZHS16GBK
;
另存爲一個腳本,運行
SQL>@clone.sql
Control file created.
SQL>alter database open resetlogs;
Database altered.
SQL>;
搞定……………
結論:這種方法的關鍵是重新創建控制文件,後面的步驟和前面的道理一樣的。
前面的三種方法都是假設db是正常關閉的,數據已經寫入數據庫文件中,所以不會有數據存在於redo中,所以clear的話也不會有數據丟失。
試驗五:丟失當前日誌組的成員
1、SQL>; select * from v$logfile;
GROUP# STATUS  TYPE MEMBER
---------- ------- ---------- ----------
3         ONLINE
/T3/ORACLE/oradata/ORA9/redo03.log
2         ONLINE
/T3/ORACLE/oradata/ORA9/redo02.log
1         ONLINE
/T3/ORACLE/oradata/ORA9/redo01.log
GROUP# STATUS  TYPE MEMBER
---------- ------- ------- -----------
1         ONLINE
/T3/ORACLE/oradata/ORA9/redo01a.log
2         ONLINE
/T3/ORACLE/oradata/ORA9/redo02a.log
3         ONLINE
/T3/ORACLE/oradata/ORA9/redo03a.log
SQL>; select * from v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIME
------------- ----------
         1          1          2  104857600          2 YES INACTIVE
       554599 02-9月 -05
         2          1          3  104857600          2 YES INACTIVE
       554601 02-9月 -05
3          1          4  104857600          2 NO  CURRENT
       554603 02-9月 -05
SQL>;
3、 模擬插入數據
SQL>; conn test/test
Connected.
SQL>; select * from test;
       TEL
----------
         1
         2
         3
         4
SQL>; insert into test values(5);
1 row created.
SQL>; commit
  2  ;
Commit complete.
4、       shutdown db,模擬刪除一個當前日誌成員
$ cd oradata/ORA9
$ ls redo03*
redo03.log   redo03a.log
$ rm redo03a.log
5、 啓動db,表面沒有錯誤
SQL> startup
ORACLE instance started.
Total System Global Area  353862792 bytes
Fixed Size                   730248 bytes
Variable Size             285212672 bytes
Database Buffers           67108864 bytes
Redo Buffers                 811008 bytes
Database mounted.
Database opened.
6、 查看日至成員
SQL>; select * from v$logfile;
    GROUP# STATUS  TYPE
---------- ------- -------
MEMBER
--------------------------------------------
         3         ONLINE
/T3/ORACLE/oradata/ORA9/redo03.log
         2         ONLINE
/T3/ORACLE/oradata/ORA9/redo02.log
         1         ONLINE
/T3/ORACLE/oradata/ORA9/redo01.log
GROUP# STATUS  TYPE MEMBER
---------- ------- ------- ----------
1        ONLINE
/T3/ORACLE/oradata/ORA9/redo01a.log
2    ONLINE
/T3/ORACLE/oradata/ORA9/redo02a.log
3 INVALID ONLINE
/T3/ORACLE/oradata/ORA9/redo03a.log
7、 刪除出問題的聯機日誌文件
SQL> alter database drop logfile member '/T3/ORACLE/oradata/ORA9/redo03a.log';
alter database drop logfile member '/T3/ORACLE/oradata/ORA9/redo03a.log'
*
ERROR at line 1:
ORA-01609: log 3 is the current log for thread 1 - cannot drop members
ORA-00312: online log 3 thread 1: '/T3/ORACLE/oradata/ORA9/redo03.log'
ORA-00312: online log 3 thread 1: '/T3/ORACLE/oradata/ORA9/redo03a.log'
看來當前日誌成員是不允許刪除的。
SQL>alter system switch logfile;
System altered.
SQL>; select * from v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ----------------
FIRST_CHANGE# FIRST_TIME
------------- ----------
1          1          5  104857600          2 NO  CURRENT
       557687 02-9月 -05
         2          1          3  104857600          2 YES INACTIVE
     554601 02-9月 -05
         3          1          4  104857600          2 YES ACTIVE
       554603 02-9月 -05
SQL> alter database drop logfile member '/T3/ORACLE/oradata/ORA9/redo03a.log';
Database altered.
SQL> alter database add logfile member '/T3/ORACLE/oradata/ORA9/redo03a.log' to group 3;
Database altered.
SQL>; select * from v$logfile;
GROUP# STATUS  TYPE
---------- ------- ------
MEMBER
-----------------------------------------
         3         ONLINE
/T3/ORACLE/oradata/ORA9/redo03.log
         2         ONLINE
/T3/ORACLE/oradata/ORA9/redo02.log
         1         ONLINE
/T3/ORACLE/oradata/ORA9/redo01.log
GROUP# STATUS  TYPE
---------- ------- -------
MEMBER
--------------------------------------------------
         1         ONLINE
/T3/ORACLE/oradata/ORA9/redo01a.log
         2         ONLINE
/T3/ORACLE/oradata/ORA9/redo02a.log
         3 INVALID ONLINE
/T3/ORACLE/oradata/ORA9/redo03a.log
看來還得切換一下日至
SQL>alter system switch logfile;
System altered.
SQL>select * from v$logfile;
GROUP# STATUS  TYPE
---------- ------- -------
MEMBER
--------------------------------------------------
         3         ONLINE
/T3/ORACLE/oradata/ORA9/redo03.log
         2         ONLINE
/T3/ORACLE/oradata/ORA9/redo02.log
         1         ONLINE
/T3/ORACLE/oradata/ORA9/redo01.log
GROUP# STATUS  TYPE
---------- ------- -------
MEMBER
-----------------------------------------------
         1         ONLINE
/T3/ORACLE/oradata/ORA9/redo01a.log
         2         ONLINE
/T3/ORACLE/oradata/ORA9/redo02a.log
3         ONLINE
/T3/ORACLE/oradata/ORA9/redo03a.log
至此,大功告成…………….
結論:
只要日誌組的member不是一個,出現前面的4種可能性是非常小的,即使出現了也有相應的恢復方法,所以不必驚慌;
如果memer多於1個,即使壞了其中的幾個,也不會 影響數據庫的正常啓動,啓動後,再進行相應的操作即可, 所以這個時候每天察看alert.log就顯得非常重要了。
2:在數據庫運行狀態下損壞或者丟失全部redo,或者在數據庫非法關閉後丟失redo文件,在此情況下又分兩種情況:
(1):數據庫非法關閉後丟失全部redo
(2):丟失的redo文件是非當前的,或者說是不活動的。
(3):丟失或者損壞的redo文件是當前的。
下面分別說明如下:
(1):數據庫非法關閉後丟失全部redo
修改系統參數方法:
1、 插入數據
SQL>; select * from test;
       TEL
----------
         1
         2
         3
         4
SQL>; insert into test values(5);
1 row created.
SQL>; commit;
Commit complete.
SQL>;
2、 強行關閉
SQL>; shutdown abort
ORACLE instance shut down.
SQL>;
3、 手工模擬刪除全部redo
4、 啓動db
SQL>; startup
ORACLE instance started.
Total System Global Area  353862792 bytes
Fixed Size                   730248 bytes
Variable Size             285212672 bytes
Database Buffers           67108864 bytes
Redo Buffers                 811008 bytes
Database mounted.
ORA-00313: open failed for members of log group 3 of thread 1
ORA-00312: online log 3 thread 1: '/T3/ORACLE/oradata/ORA9/redo03.log'
ORA-27037: unable to obtain file status
SVR4 Error: 2: No such file or directory
Additional information: 3
5、 嘗試使用前3中方法中最簡單的
SQL>; recover database until cancel;
ORA-00279: change 550174 generated at 09/02/2005 16:00:19 needed for thread 1
ORA-00289: suggestion : /T3/ORACLE/arch/1_1.dbf
ORA-00280: change 550174 for thread 1 is in sequence #1
Specify log: {<RET>;=suggested | filename | AUTO | CANCEL}
看來不行
6、 修改initsid.ora,加入一行
_allow_resetlogs_corruption=true
7、 啓動with pfile
SQL>; startup
ORACLE instance started.
Total System Global Area  320308312 bytes
Fixed Size                   730200 bytes
Variable Size             285212672 bytes
Database Buffers           33554432 bytes
Redo Buffers                 811008 bytes
Database mounted.
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
SQL>; host ls /T3/ORACLE/oradata/ORA9/redo*
/T3/ORACLE/oradata/ORA9/redo*: No such file or directory
SQL>; alter database open resetlogs;
Database altered.
SQL>; host ls /T3/ORACLE/oradata/ORA9/redo*
/T3/ORACLE/oradata/ORA9/redo01.log  /T3/ORACLE/oradata/ORA9/redo02.log  /T3/ORACLE/oradata/ORA9/redo03.log
8、 檢驗數據
SQL>; select * from test.test;
       TEL
----------
         1
         2
         3
         4
SQL>;
看到了吧,我們前面由於執行了SHUTDOWN ABORT,這時候對數據的修改還沒有保存到數據文件中,雖然執行了COMMIT,這個時候還在聯機日誌中,等待CKPT觸發DBWR寫入DATAFILE,但是這個時候執行了SHUTDOWN ABORT,redo被刪除後,裏面的信息也就丟了,造成數據丟失。
9、 備份,去掉那個隱含參數。
(2):丟失的redo文件是非當前的,或者說是不活動的
大家都清楚,聯機日誌分爲當前聯機日誌和非當前聯機日誌,非當前聯機日誌的損壞是比較簡單的,一般通過clear命令就可以解決問題。
1、啓動數據庫,遇到ORA-00312 or ORA-00313錯誤,如
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312:online log 1 thread 1: 'D:\ORACLE\ORADATA\TEST\REDO01.LOG'
從這裏我們知道日誌組1的數據文件損壞了
從報警文件可以看到更詳細的信息
2、查看V$log視圖
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- -------- ---------- ------
1 1 YES INACTIVE
2 2 YES INACTIVE
3 3 NO CURRENT
可以知道,該組是非當前狀態,而且已經歸檔。
3、用CLEAR命令重建該日誌文件
SQL>alter database clear logfile group 1;
如果是該日誌組還沒有歸檔,則需要用
SQL>alter database clear unarchived logfile group 1;
4、打開數據庫,重新備份數據庫
SQL>alter database open;
說明:
1、如果損壞的是非當前的聯機日誌文件,一般只需要clear就可以重建該日誌文件,但是如果該數據庫處於歸檔狀態但該日誌還沒有歸檔,就需要強行clear。
2、建議clear,特別是強行clear後作一次數據庫的全備份。
3、此方法適用於歸檔與非歸檔數據庫。
(3):損壞當前聯機日誌
歸檔模式下當前日誌的損壞有兩種情況,
一、是數據庫是正常關閉,日誌文件中沒有未決的事務需要實例恢復,當前日誌組的損壞其實就是上文的實驗1案例,首先從備份中恢復一個當前的redo文件,這也是冷備份時建議同時備份redo的原因。然後可以直接用alter database clear unarchived logfile group n來重建。最後open。
二、是日誌組中有活動的事務,數據庫需要媒體恢復,日誌組需要用來同步,有兩種補救辦法:
A. 最好的辦法就是通過不完全恢復,可以保證數據庫的一致性,但是這種辦法要求在歸檔方式下,並且有可用的備份。
B. 通過強制性恢復,但是可能導致數據庫不一致。(如果數據庫沒有備份,又不在歸檔模式下,之能採取這種方法)
下面分別用來說明這兩種恢復方法
1.1 通過備份來恢復
1、打開數據庫,會遇到一個類似的錯誤
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'D:\ORACLE\ORADATA\TEST\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) 系統找不到指定的文件
2、查看V$log,發現是當前日誌
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- -------- ----------------
1 1 NO CURRENT
2 2 YES INACTIVE
3 3 YES INACTIVE
3、發現clear不成功
SQL> alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
ERROR at line 1:
ORA-01624: log 1 needed for crash recovery of thread 1
ORA-00312: online log 1 thread 1: 'D:\ORACLE\ORADATA\TEST\REDO01.LOG'
4、拷貝有效的數據庫的全備份,並不完全恢復數據庫
可以採用獲取最近的SCN的辦法用until scn恢復或用until cnacel恢復
recover database until cancel
先選擇auto,儘量恢復可以利用的歸檔日誌,然後重新
recover database until cancel
這次輸入cancel,完成不完全恢復,也就是說恢復兩次。
如:
SQL> recover database until cancel;
Auto
……
SQL> recover database until cancel;
Cancel;
5、利用alter database open resetlogs打開數據庫
說明:
1、這種辦法恢復的數據庫是一致的不完全恢復,會丟失當前聯機日誌中的事務數據
2、這種方法適合於歸檔數據庫並且有可用的數據庫全備份。
3、恢復成功之後,記得再做一次數據庫的全備份。
4、建議聯機日誌文件一定要實現鏡相在不同的磁盤上,避免這種情況的發生,因爲任何數據的丟失對於生產來說都是不容許的。
1.2 如果沒有備份,進行強制性恢復
1、打開數據庫,會遇到一個類似的錯誤
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'D:\ORACLE\ORADATA\TEST\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: unable to open file
O/S-Error: (OS 2) 系統找不到指定的文件
2、查看V$log,發現是當前日誌
SQL> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- -------- ----------------
1 1 NO CURRENT
2 2 YES INACTIVE
3 3 YES INACTIVE
3、發現clear不成功
SQL> alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
ERROR at line 1:
ORA-01624: log 1 needed for crash recovery of thread 1
ORA-00312: online log 1 thread 1: 'D:\ORACLE\ORADATA\TEST\REDO01.LOG'
4、把數據庫down掉
SQL>shutdown immediate
5、在init<sid>.ora中加入如下參數
_allow_resetlogs_corruption=TRUE
6、重新啓動數據庫,利用until cancel恢復
SQL>recover database until cancel;
Cancel
如果出錯,不再理會,發出
SQL>alter database open resetlogs;
7、如果幸運,數據庫可以open,數據庫被打開後,馬上執行一個full export
8、shutdown數據庫,去掉_all_resetlogs_corrupt參數
9、重建庫
10、import並完成恢復
11、建議執行一下ANALYZE TABLE ...VALIDATE STRUCTURE CASCADE;
說明:
1、該恢復方法是沒有辦法之後的恢復方法,一般情況下建議不要採用,因爲該方法可能導致數據庫的不一致
2、該方法也丟失數據,但是丟失的數據沒有上一種方法的數據多,主要是未寫入數據文件的已提交或未提交數據。
3、建議成功後嚴格執行以上的7到11步,完成數據庫的檢查與分析
4、全部完成後做一次數據庫的全備份
5、建議聯機日誌文件一定要實現鏡相在不同的磁盤上,避免這種情況的發生,因爲任何數據的丟失對於生產來說都是不容許的。
問題:
上面的第7步,如果不能打開數據庫,oracle此時可能會報ORA-00600: 內部錯誤代碼,參數: [2662],之類的錯誤,針對這個問題說明如下:
1:ORA-600 [2662] "Block SCN is ahead of Current SCN",說明當前數據庫的數據塊的SCN早於當前的SCN,主要是和存儲在UGA變量中的dependent SCN進行比較,如果當前的SCN小於它,數據庫就會產生這個ORA-600 [2662]的錯誤了.
2:於是想到使用ADJUST_SCN事件來調整當前的SCN,使其大於dependent SCN.
3:此時我們可以通過Oracle的內部事件來調整SCN:
出現ORA-00600: 內部錯誤代碼,參數: [2662],之類的錯誤可能會出現在打開數據庫之前,也可能出現在通過用_allow_resetlogs_corruption=TRUE隱含參數打開數據庫之後。
調整SCN有兩種常用方法:
1.通過immediate trace name方式(在數據庫Open狀態下,即通過用_allow_resetlogs_corruption=TRUE隱含參數打開數據庫之後報錯600)
alter session set events 'IMMEDIATE trace name ADJUST_SCN level x';
2.通過10015事件(在數據庫無法打開,mount狀態下)
alter session set events '10015 trace name adjust_scn level x';
注:level 1爲增進SCN 10億 (1 billion) (1024*1024*1024),通常Level 1已經足夠。也可以根據實際情況適當調整。

1

收藏

ttzztt

69篇文章,130W+人氣,2粉絲

Ctrl+Enter 發佈

發佈

取消

1

1

2
分享
ttzztt
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章