?? ● 確保可能成為primary 數據庫的standby 服務器已經處于archivelog 模式。
?? ● 確保standby 數據庫的臨時文件存在并匹配primary 數據庫的臨時文件
?? ●確保standby 數據庫的RAC 實例只有一個處于open 狀態。(對于rac 結構的standby 數據庫,在角色轉換時只能有一個實例startup。其它rac 實例必須統統shutdown,待角色轉換結束后再startup)
??? 不可預知原因導致primary 數據庫故障并且短期內不能恢復就需要failover。如果是這種切換那你就要小心點了,有可能只是虛驚一場,甚至連你可能損失的腦細胞的數量都能預估,但如果運氣不好又沒有完備的備份恢復策略而且primary 數據并非處于最大數據保護或最高可用性模式地話,黑黑,哭是沒用地,表太傷心了,來,讓三思GG 安慰安慰你,這種情況下呢丟失數據有可能是難免的,并且如果其故障未能修復,那它甚至連快速修復成為standby 的機會也都失去了吶,咦,你腦門怎么好像在往外冒水,難道是強效凈膚液,你的臉也忽然好白皙喲~~~~
??? SQL> ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;
???
E:\ora10g>set oracle_sid=jssweb
??? E:\ora10g>sqlplus "/ as sysdba"
??? SQL*Plus: Release 10.2.0.3.0 - Production on 星期四12 月13 09:41:29 2007
??? Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
???
已連接。
??? SQL> selectswitchover_statusfromv$database;
??? SWITCHOVER_STATUS
??? --------------------
??? TO STANDBY
??? 首先將primary 轉換為standby 的角色,通過下列語句:
???
SQL> alterdatabasecommittoswitchovertophysicalstandby;
??? 數據庫已更改。
??? SQL> shutdownimmediate
??? ORA-01507: 未裝載數據庫
??? ORACLE 例程已經關閉。
??? SQL> startupmount
??? ORACLE 例程已經啟動。
??? Total System Global Area 167772160 bytes
??? Fixed Size 1289484 bytes
??? Variable Size 104858356 bytes
??? Database Buffers 54525952 bytes
??? Redo Buffers 7098368 bytes
??? 數據庫裝載完畢。
??? E:\ora10g>set oracle_sid=jsspdg
??? E:\ora10g>sqlplus " / as sysdba"
??? SQL*Plus: Release 10.2.0.3.0 - Production on 星期四12 月13 10:08:15 2007
??? Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
??? 已連接。
??? SQL> select switchover_status from v$database;
??? SWITCHOVER_STATUS
??? --------------------
??? TO PRIMARY
??? 此時待轉換standby 數據庫switchover_status 列值應該是"TO_PRIMARY",如否則檢查其初始化參數文件中的設置,提示一下,比著原primary 數據庫的初始化參數改改。
??? SQL> alter database commit to switchover to primary;
??? 數據庫已更改。
??? SQL> alter database open;
??? 數據庫已更改。
??? SQL> show parameter db_unique
??? NAME???????????????? TYPE??????? VALUE
??? -------------------- ----------- ------------------------------
??? db_unique_name?????? string????? jsspdg
??? SQL> select max(sequence#) from v$archived_log;
??? MAX(SEQUENCE#)
??? --------------
??? 67
??? SQL> altealter system switch logfile;
??? 系統已更改。
??? SQL> select max(sequence#) from v$archived_log;
??? MAX(SEQUENCE#)
??? --------------
??? 68
??? SQL> show parameter db_unique
??? NAME???????????????? TYPE??????? VALUE
??? -------------------- ----------- ------------------------------
??? db_unique_name?????? string????? jssweb
??? SQL> select max(sequence#) from v$archived_log;
??? MAX(SEQUENCE#)
??? --------------
??? 68
二、物理standby的failover
??? ● 多數情況下,其它邏輯/物理standby 數據庫不直接參與failover 的過程,因此這些數據庫不需要做任何操作。
??? ● 某些情況下,新的primary 數據庫配置之后,需要重新創建其它所有的standby 數據庫。
??? 一般情況下failover 都是表示primary 數據庫癱瘓,最起碼也是起不來了,因此這種類型的切換基本上不需要primary 數據庫做什么操作。所以下列步驟中如果有提到primary 和standby 執行的,只是建議你如果primary還可以用,那就執行一下,即使它能用你卻不執行,也沒關系,不影響standby 數據庫的切換:)
1、檢查歸檔文件是否連續
??? 查詢待轉換standby 數據庫的V$ARCHIVE_GAP 視圖,確認歸檔文件是否連接:
??? SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
??? 未選定行
??? SQL> ALTER DATABASE REGISTER PHYSICAL LOGFILE 'filespec1';
??? SQL> select distinct thread#,max(sequence#) over(partition by thread#) a from v$archived_log;
??? SQL> alter database recover managed standby database finish force;
??? 數據庫已更改。
??? SQL> alter database commit to switchover to primary;
??? 數據庫已更改。
??? SQL> alter database open;
??? 數據庫已更改。