SWITCHOVER RAC資料庫出現ORA-600(kcctrdf_2)錯誤

yangtingkun發表於2007-11-26

Oracle10g RAC環境在執行SWITCHOVER操作過程中出現ORA-600(kcctrdf_2)錯誤。


RAC環境資料庫執行ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL DATABASE操作後,試圖將當前的物理STANDBY資料庫切換為PRIMARY資料庫時,出現下面的錯誤:

SQL> CONN SYS/TEST@TESTRAC_STANDBY AS SYSDBA已連線。
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

SWITCHOVER_STATUS
--------------------
TO PRIMARY

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY
*
1 行出現錯誤:
ORA-00600:
內部錯誤程式碼, 引數
: [kcctrdf_2], [/export/home/oracle/oradata/testrac/group_1.259.6185911
[], [], []

從報錯的trace檔案中,可以看到下面的內容:

105E36DF0 5741524E 494E4721 20434C45 4152494E [WARNING! CLEARIN]
105E36E00 47205245 444F204C 4F472057 48494348 [G REDO LOG WHICH]
105E36E10 20484153 204E4F54 20424545 4E204152 [ HAS NOT BEEN AR]
105E36E20 43484956 45442E20 4241434B 55505320 [CHIVED. BACKUPS ]
105E36E30 54414B45 4E0A2020 20204245 464F5245 [TAKEN. BEFORE]
105E36E40 20257320 28434841 4E474520 25732920 [ %s (CHANGE %s) ]
105E36E50 43414E4E 4F542042 45205553 45442046 [CANNOT BE USED F]
105E36E60 4F522052 45434F56 4552592E 0A000000 [OR RECOVERY.....]
105E36E70 5741524E 494E4721 20434C45 4152494E [WARNING! CLEARIN]
105E36E80 47205245 444F204C 4F47204E 45454445 [G REDO LOG NEEDE]
105E36E90 4420464F 52205245 434F5645 5259204F [D FOR RECOVERY O]
105E36EA0 46205448 45204F46 464C494E 45204441 [F THE OFFLINE DA]

結合在metalink上查詢的資訊,基本上可以斷定問題是由於RECOVERY AREA造成的。關於metalink上面的bug描述,可以參考Bug No. 2848315

Metalink雖然指出了問題和RECOVERY AREA有關,但是並沒有給出相應的解決方法,而且Oracle目前的版本還沒有fixed這個bug,目前也沒有任何補丁可以解決這個bug。看來一切都只能靠自己了。

既然錯誤是由於FLASHBACK RECOVERY AREA引起的,那麼嘗試將其DISABLE。在此之前,需要將主庫和從庫的狀態恢復:

SQL> CONN SYS/TEST@TESTRAC2 AS SYSDBA已連線。
SQL> SHUTDOWN IMMEDIATE
ORA-01507:
未裝載資料庫


ORACLE
例程已經關閉。
SQL> STARTUP MOUNT
ORACLE
例程已經啟動。

Total System Global Area 2147483648 bytes
Fixed Size 2031480 bytes
Variable Size 520093832 bytes
Database Buffers 1610612736 bytes
Redo Buffers 14745600 bytes
資料庫裝載完畢。
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

資料庫已更改。

SQL> ALTER DATABASE OPEN;

資料庫已更改。

SQL> SELECT DATABASE_ROLE FROM V$DATABASE;

DATABASE_ROLE
----------------
PRIMARY

下面將從庫恢復:

SQL> CONN SYS/TEST@TESTRAC_STANDBY AS SYSDBA已連線。
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

SWITCHOVER_STATUS
--------------------
RECOVERY NEEDED

SQL> SHUTDOWN IMMEDIATE
ORA-01109:
資料庫未開啟

已經解除安裝資料庫。
ORACLE
例程已經關閉。
SQL> STARTUP MOUNT
ORACLE
例程已經啟動。

Total System Global Area 2147483648 bytes
Fixed Size 2031480 bytes
Variable Size 520093832 bytes
Database Buffers 1610612736 bytes
Redo Buffers 14745600 bytes
資料庫裝載完畢。
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

資料庫已更改。

SQL> SELECT DATABASE_ROLE, SWITCHOVER_STATUS FROM V$DATABASE;

DATABASE_ROLE SWITCHOVER_STATUS
---------------- --------------------
PHYSICAL STANDBY SESSIONS ACTIVE

至此DATA GUARD環境恢復。

下面DISABLE主庫的RECOVERY AREA

SQL> ALTER SYSTEM SET DB_RECOVERY_FILE_DEST = '';

系統已更改。

SQL> SHOW PARAMETER DB_RECOVERY

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string
db_recovery_file_dest_size big integer 5G

再次嘗試SWITCHOVER切換錯誤依舊。

仔細檢視從庫上的錯誤資訊,ORA-600錯誤的第一個引數是一個日誌檔名,而這個檔案正是RECOVERY AREA的日誌:

SQL> SELECT GROUP#, TYPE, IS_RECOVERY_DEST_FILE FROM V$LOGFILE
2 WHERE MEMBER LIKE '%259%';

GROUP# TYPE IS_
---------- ------- ---
1 ONLINE YES

看來解決問題的方向並沒有錯,現在需要做的是去掉這些日誌。

返回主庫,意外發現一個例項的RECOVERY AREA日誌已經去掉,而另一個例項的依然存在,這可能是由於修改了初始化引數後,重啟過一個例項造成的。

SQL> CONN SYS/TEST@TESTRAC2 AS SYSDBA已連線。
SQL> SELECT * FROM V$LOG;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
1 1 595 536870912 1 YES INACTIVE 5704643426 15-9
-07
2 1 596 536870912 1 YES ACTIVE 5704643428 15-9
-07
3 2 366 536870912 2 YES INACTIVE 5704637718 15-9
-07
4 2 367 536870912 2 YES CLEARING_CURRENT 5704643430 15-9
-07

SQL> COL MEMBER FORMAT A60
SQL> SELECT * FROM V$LOGFILE;

GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- ------------------------------------------------------------ ---
1 ONLINE +DISK/testrac/onlinelog/group_1.258.633394455 NO
2 ONLINE +DISK/testrac/onlinelog/group_2.260.633394461 NO
3 ONLINE +DISK/testrac/onlinelog/group_3.269.633319259 NO
3 ONLINE +DISK/testrac/onlinelog/group_3.268.633319267 YES
4 ONLINE +DISK/testrac/onlinelog/group_4.271.633319273 NO
4 ONLINE +DISK/testrac/onlinelog/group_4.270.633319281 YES

已選擇6行。

於是重啟另外一個例項:

SQL> CONN SYS/TEST@TESTRAC2 AS SYSDBA已連線。
SQL> SHUTDOWN IMMEDIATE
資料庫已經關閉。已經解除安裝資料庫。
ORACLE
例程已經關閉。
SQL> STARTUP
ORACLE
例程已經啟動。

Total System Global Area 2147483648 bytes
Fixed Size 2031480 bytes
Variable Size 520093832 bytes
Database Buffers 1610612736 bytes
Redo Buffers 14745600 bytes
資料庫裝載完畢。資料庫已經開啟。
SQL> SELECT * FROM V$LOGFILE;

GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- -------------------------------------------------- ---
1 ONLINE +DISK/testrac/onlinelog/group_1.258.633398893 NO
2 ONLINE +DISK/testrac/onlinelog/group_2.260.633398899 NO
3 ONLINE +DISK/testrac/onlinelog/group_3.268.633398905 NO
4 ONLINE +DISK/testrac/onlinelog/group_4.270.633398913 NO

現在主庫的LOGFILE已經去掉了RECOVERY AREA部分,但是從庫仍然無法去掉,無論是透過切換日誌的方式,還是試圖在從庫直接刪除都行不通:

SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;

系統已更改。

SQL> CONN SYS/TEST@TESTRAC_STANDBY AS SYSDBA已連線。
SQL> SELECT * FROM V$LOG;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
1 1 599 536870912 2 YES CLEARING_CURRENT 5704644725 16-9
-07
2 1 598 536870912 2 YES CLEARING 5704643891 16-9
-07
3 2 371 536870912 2 YES CLEARING_CURRENT 5704644721 16-9
-07
4 2 370 536870912 2 YES CLEARING 5704644494 16-9
-07

SQL> COL MEMBER FORMAT A60
SQL> SELECT * FROM V$LOGFILE;

GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- ------------------------------------------------------------ ---
1 ONLINE /export/home/oracle/oradata/testrac/group_1.258.618591139 NO
1 ONLINE /export/home/oracle/oradata/testrac//group_1.259.618591145 YES
2 ONLINE /export/home/oracle/oradata/testrac/group_2.260.618591151 NO
2 ONLINE /export/home/oracle/oradata/testrac//group_2.261.618591159 YES
3 ONLINE /export/home/oracle/oradata/testrac/group_3.268.618595573 NO
3 ONLINE /export/home/oracle/oradata/testrac//group_3.269.618595581 YES
4 ONLINE /export/home/oracle/oradata/testrac/group_4.270.618595587 NO
4 ONLINE /export/home/oracle/oradata/testrac//group_4.271.618595595 YES

已選擇8行。

SQL> ALTER DATABASE DROP LOGFILE
2 MEMBER '/export/home/oracle/oradata/testrac//group_1.259.618591145';
ALTER DATABASE DROP LOGFILE
*
1 行出現錯誤:
ORA-01156:
進行中的恢復可能需要訪問檔案


SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

資料庫已更改。

SQL> ALTER DATABASE DROP LOGFILE
2 MEMBER '/export/home/oracle/oradata/testrac//group_1.259.618591145';
ALTER DATABASE DROP LOGFILE
*
1 行出現錯誤:
ORA-00360:
非日誌檔案成員: /export/home/oracle/oradata/testrac//group_1.259.618591145

現在的主要問題在於從庫的RECOVERY AREA日誌,雖然不需要日誌,但是還無法從系統中去除掉。

既然這個日誌是系統不需要的,準備嘗試透過重建從庫的控制檔案來去掉這些日誌:

首先備份當前的從庫的控制檔案:

SQL> SHOW PARAMETER CONTROL_FILES

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string /export/home/oracle/oradata/te
strac/current.256.618591133, /
export/home/oracle/oradata/tes
trac/current.257.618591137

SQL> SHUTDOWN IMMEDIATE
ORA-01109:
資料庫未開啟

已經解除安裝資料庫。
ORACLE
例程已經關閉。

關閉資料庫在作業系統級備份這兩個檔案。

SQL> CONN SYS/TEST@TESTRAC2 AS SYSDBA已連線。
SQL> ALTER DATABASE CREATE STANDBY CONTROLFILE
2 AS '/export/home/oracle/controlfile.ctl';

資料庫已更改。

將這個控制檔案複製到從庫站點,並覆蓋從庫的控制檔案。然後重新啟動STANDBY資料庫:

SQL> CONN SYS/TEST@TESTRAC_STANDBY AS SYSDBA已連線到空閒例程。
SQL> STARTUP MOUNT
ORACLE
例程已經啟動。

Total System Global Area 2147483648 bytes
Fixed Size 2031480 bytes
Variable Size 520093832 bytes
Database Buffers 1610612736 bytes
Redo Buffers 14745600 bytes
資料庫裝載完畢。
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

資料庫已更改。

SQL> SELECT * FROM V$LOGFILE;

GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- ------------------------------------------------------------ ---
1 ONLINE /export/home/oracle/oradata/testrac/group_1.258.633402209 NO
2 ONLINE /export/home/oracle/oradata/testrac/group_2.260.633402215 NO
3 ONLINE /export/home/oracle/oradata/testrac/group_3.268.633402223 NO
4 ONLINE /export/home/oracle/oradata/testrac/group_4.270.633402229 NO

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

SWITCHOVER_STATUS
--------------------
SESSIONS ACTIVE

問題終於解決,下面再次嘗試切換STANDBY資料庫,600錯誤消失。

SQL> CONN SYS/TEST@TESTRAC2 AS SYSDBA已連線。
SQL> SHUTDOWN IMMEDIATE
資料庫已經關閉。已經解除安裝資料庫。
ORACLE
例程已經關閉。
SQL> CONN SYS/TEST@TESTRAC1 AS SYSDBA
已連線。
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;

資料庫已更改。

SQL> SHUTDOWN IMMEDIATE
ORA-01507:
未裝載資料庫


ORACLE
例程已經關閉。
SQL> CONN SYS/TEST@TESTRAC_STANDBY AS SYSDBA
已連線。
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

SWITCHOVER_STATUS
--------------------
TO PRIMARY

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;

資料庫已更改。

SQL> ALTER DATABASE OPEN;

資料庫已更改。

SQL> CONN SYS/TEST@TESTRAC1 AS SYSDBA已連線到空閒例程。
SQL> STARTUP MOUNT
ORACLE
例程已經啟動。

Total System Global Area 2147483648 bytes
Fixed Size 2031480 bytes
Variable Size 956301448 bytes
Database Buffers 1174405120 bytes
Redo Buffers 14745600 bytes
資料庫裝載完畢。
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;

資料庫已更改。

目前這個方法是這個bug的唯一解決方法。

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

相關文章