Oracle Switchover RAC数据库提示ORA-600(kcctrdf_2)错误解决方案

Oracle 10g 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的唯一解决方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值