首先做一系列的check
check 当前primary 的 standby redo log是否存在
SQL> select * from v$logfile; GROUP# STATUS TYPE MEMBER IS_ ---------- ------- ------- ------------------------------------------------------- --- 3 ONLINE /oracle_asm/standby/itid1/datafile/itid/redo03.log NO 2 ONLINE /oracle_asm/standby/itid1/datafile/itid/redo02.log NO 1 ONLINE /oracle_asm/standby/itid1/datafile/itid/redo01.log NO 4 STANDBY /oracle_asm/standby/itid1/standby_redo/slog1.rdo NO 5 STANDBY /oracle_asm/standby/itid1/standby_redo/slog2.rdo NO 6 STANDBY /oracle_asm/standby/itid1/standby_redo/slog3.rdo NO 7 STANDBY /oracle_asm/standby/itid1/standby_redo/slog4.rdo NO
check standby 的redo log是否存在
SQL> select * from v$logfile; GROUP# STATUS TYPE MEMBER IS_ ---------- ------- ------- ------------------------------------------------------- --- 3 ONLINE /oracle_asm/standby/itid2/datafile/itid/redo03.log NO 2 ONLINE /oracle_asm/standby/itid2/datafile/itid/redo02.log NO 1 ONLINE /oracle_asm/standby/itid2/datafile/itid/redo01.log NO 4 STANDBY /oracle_asm/standby/itid1/standby_redo/slog1.rdo NO 5 STANDBY /oracle_asm/standby/itid1/standby_redo/slog2.rdo NO 6 STANDBY /oracle_asm/standby/itid1/standby_redo/slog3.rdo NO 7 STANDBY /oracle_asm/standby/itid2/standby_redo/slog1.rdo NO 8 STANDBY /oracle_asm/standby/itid2/standby_redo/slog2.rdo NO 9 STANDBY /oracle_asm/standby/itid2/standby_redo/slog3.rdo NO 10 STANDBY /oracle_asm/standby/itid2/standby_redo/slog4.rdo NO 11 STANDBY /oracle_asm/standby/itid2/datafile/log1.rdo NO 12 STANDBY /oracle_asm/standby/itid2/datafile/log2.rdo NO 13 STANDBY /oracle_asm/standby/itid2/datafile/log3.rdo NO
oops 现在才发现之前创建standby的时候创建的standby redo log太多了。其实group 11 12 13 是我想创建成为redo log的。但是不小心的加上了standby参数。从这里也可以看出创建standby redo 和 redo 的命令就在于有没有standby 这个参数。 不过奇怪的是,既然我创建redo的命令错了,那么为什么还是有redo生成了呢? 这个也许是oracle自己生成的。
check primary的 log_archive_dest_n参数
SQL> select name,value from v$parameter where name like ‘log_archive_dest_%‘ and name not like ‘%state%‘ and value is not null; NAME VALUE ---------------------------- ------------------------------------------------------------------------------------ log_archive_dest_1 LOCATION=/oracle_asm/standby/itid1/arch log_archive_dest_2 SERVICE=itid2 SYNC VALID_FOR=( ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=itid2 log_archive_dest_3 LOCATION=/oracle_asm/standby/itid1/arch_from_standbyredo VALID_FOR=(STANDBY_LOGFILE, STANDBY_ROLE)
check standby的 log_archive_dest_n参数
SQL> select name,value from v$parameter where name like ‘log_archive_dest_%‘ and name not like ‘%state%‘ and value is not null; NAME VALUE ---------------------------- ------------------------------------------------------------------------------------ log_archive_dest_1 LOCATION=/oracle_asm/standby/itid2/arch log_archive_dest_2 SERVICE=itid1 ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=itid1 log_archive_dest_3 LOCATION=/oracle_asm/standby/itid2/arch_from_standbyredo VALID_FOR=(STANDBY_LOGFILE, STANDBY_ROLE)
查看primary的datafile 和 logfile convert设置
SQL> show parameter db_file_name_convert NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_file_name_convert string /oracle_asm/standby/itid2/data file/itid, /oracle_asm/standby /itid1/datafile/itid SQL> show parameter log_file_name_convert NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ log_file_name_convert string /oracle_asm/standby/itid2/data file/itid, /oracle_asm/standby /itid1/datafile/itid
查看standby的datafile和 logfile convert 设置
SQL> show parameter db_file_name_convert NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_file_name_convert string /oracle_asm/standby/itid1/data file/itid, /oracle_asm/standby /itid2/datafile/itid SQL> show parameter log_file_name_convert NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ log_file_name_convert string /oracle_asm/standby/itid1/data file/itid, /oracle_asm/standby /itid2/datafile/itid
check primary的 FAL设置
SQL> show parameter fal NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ fal_client string fal_server string itid2
check standby的 FAL 设置
SQL> show parameter fal NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ fal_client string fal_server string itid1
check primary的standby_file_management
SQL> show parameter STANDBY_FILE_MANAGEMENT NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ standby_file_management string AUTO
check standby的standby_file_management
SQL> show parameter STANDBY_FILE_MANAGEMENT NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ standby_file_management string AUTO
check primary是否可以进行转换
SQL> select switchover_status from v$database; SWITCHOVER_STATUS -------------------- TO STANDBY
转换primary为standby
SQL> alter database commit to switchover to physical standby with session shutdown; Database altered.
据说这一步会把control file 备份到当前session的trace。
check standby 可以转化成primary
SQL> select switchover_status from v$database; SWITCHOVER_STATUS -------------------- TO PRIMARY
要注意的是这一步必须是在primary -> standby之后才有效否则的话返回的结果就是not allowed
turn standby to primary
SQL> alter database commit to switchover to primary with session shutdown; Database altered.
open 新的primary database
SQL> select status from v$instance; STATUS ------------ MOUNTED SQL> alter database open; Database altered.
在11gr2中turn standby to primary之后 新的primary是mount状态。
在新的standby上应用redo
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION; ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION * ERROR at line 1: ORA-01665: control file is not a standby control file
这一步遇到了错误说不是standby control file
通过下列步骤可以fix
SQL> shutdown abort ORACLE instance shut down. SQL> startup mount ORACLE instance started. Total System Global Area 502181888 bytes Fixed Size 1345912 bytes Variable Size 385877640 bytes Database Buffers 109051904 bytes Redo Buffers 5906432 bytes Database mounted. SQL> alter database open read only 2 ; Database altered. SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION; Database altered.
虽然我不知道为什么这样会fix。
check一下redo传输和应用的情况
primary端的日志archive情况如下
SQL> select NAME,SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG where sequence#>104 ORDER BY SEQUENCE#; NAME SEQUENCE# FIRST_TIM NEXT_TIME ------------------------------------------------------- ---------- --------- --------- /oracle_asm/standby/itid2/arch/1_105_840039496.dbf 105 12-MAR-14 12-MAR-14 itid1 105 12-MAR-14 12-MAR-14 /oracle_asm/standby/itid2/arch/1_106_840039496.dbf 106 12-MAR-14 12-MAR-14 itid1 106 12-MAR-14 12-MAR-14
standby端日志apply如下
SQL> SELECT NAME,SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG WHERE sequence#>100 ORDER BY SEQUENCE#; NAME SEQUENCE# APPLIED -------------------------------------------------------------------------------- ---------- --------- itid2 101 YES /oracle_asm/standby/itid1/arch/1_101_840039496.dbf 101 YES itid2 102 NO /oracle_asm/standby/itid1/arch/1_102_840039496.dbf 102 YES /oracle_asm/standby/itid1/arch/1_103_840039496.dbf 103 YES itid2 103 NO /oracle_asm/standby/itid1/arch/1_104_840039496.dbf 104 YES /oracle_asm/standby/itid1/arch/1_105_840039496.dbf 105 YES /oracle_asm/standby/itid1/arch/1_106_840039496.dbf 106 NO /oracle_asm/standby/itid1/arch_from_standbyredo/1_106_840039496.dbf 106 IN-MEMORY