赞
踩
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的唯一解决方法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。