技巧心得



ORACLE Tips: 如何在 PRIMARY 與 STANDBY DATABASE 切換
By Tommy Wu <tommy at teatime.com.tw>

當你的 PRIMARY DATABASE 的主機, 需要做一些維護時, 是否你的 ORACLE 資料庫就必
須要停止服務一段不算短的時間呢? 這對於一個需要 7*24 服務的主機來說, 實在是一
個很難接受的情形.

如果你有 STANDBY DATABASE, 這時, 就可以將這個停機的時間, 大幅的減少到幾分鐘
內. 讓你的 STANDBY DATABASE 轉換成 PRIMARY DATABASE, 繼續提供服務, 等原本的
主機維護完成之後, 再切換回來.

Step 1:
因為要當做 PRIMARY DATABASE 的 ORACLE, 必須在 MAXIMIZE PERFORMANCE 的狀態下
執行, 但是有些 STANDBY DATABASE 並非在這個狀態下執行, 所以, 在你要接手的
STANDBY DATABASE 上執行下面的指令:

alter database set standby database to maximize performance;


Step 2:
在 PRIMARY DATABASE 上面, 中斷所有用戶的連線, 執行下面的指令:

alter system enable restricted session;
select switchover_status from v$database;

上面那個 SWITCHOVER_STATUS, 據 ORALCE 的文件表示, 必須在 TO STANDBY 的情形下,
才可以做這個切換. 不過... 我怎麼試都會是 SESSION ACIVE, 因為... 至少我下指令
的這一個 SESSION 並還連線著, 如果不連著, 要怎麼下指令? 總之, 你可以在確定除了
你這個連線外, 並沒有其他連線存在時, 執行下面的指令:

alter database commit to switchover to physical standby;
shutdown immediate;

這時, 如果沒有錯誤, 原本這個 PRIMARY DATABASE 應該就可以被當成 STANDBY DATABASE
使用. (這兒要注意的是, 如果你的 STANDBY DATABASE 不止一個, 要確定你所設定的所
有 LOG_ARCHIVE_DEST_n 都可以成功的寫出, 否則切換動作會失敗.


Step 3:
這時就把原本的 PRIMARY DATABASE 的 listener.ora, init$ORACLE_SID.ora 做一些更
改, 改成 STANDBY DATABASE 使用的狀態. 也把 IP 換成不是 PRIMARY DATABASE 使用.
然後, 試試看可不可以用 STANDBY DATABASE 的方式啟動資料庫:

startup nomount;
alter database mount standby database;

如果都成功, 執行下面的指令看看:

select switchover_status from v$database;

這時, 據 ORACLE 的手冊來看, 應該會是 SWITCHOVER PENDING 才對, 不過, 同上, 我只
得到 SESSION ACTIVE... :-(


Step 4:
這時, 到原本的 STANDBY DATABASE 主機上, 執行下面的指令:

alter database commit to switchover to primary;
shutdown;

這時, 這個 STANDBY DATABASE 應該就可以用一般資料庫的方式來啟動. 在啟動之前, 我
們必須將 listener.ora, init$ORACLE_SID.ora 做一些更改, 改成 PRIMARY DATABASE 使
用的狀態. 且也把原本 PRIMARY DATABASE 使用的 IP 加到這台主機上頭. 做好之後, 就
可以啟動 ORACLE 了, 我們先用 RESTRICT 的方式啟動, 以免其他使用者連上線:

startup restrict;


Step 5:
這時, 回到原本 PRIMARY DATABASE 的主機上, 執行下面的指令:

alter database recover managed standby database disconnect from session;


Step 6:
再回到原本 STANDBY DATABASE (新的 PRIMARY DATABASE) 上頭, 執行下面的指令:

alter system archive log current;

然後檢查看看是否正確產生到新的 STANDBY DATABASE (原本的 PRIMARY DATABASE) 中, 且
正確的寫入.


Step 7:
如果一切都正常的話, 就在新的 PRIMARY DATABASE (原本的 STANDBY DATABASE) 執行下面
的指令開放連線:

alter system disable restricted session;


Step 8:
要注意一下, 由於 TEMP 的 TABLESPACE 並不會在 STANDBY DATABASE 中產生檔案, 所以如果
你新的 PRIMARY DATABASE 之前都未曾切換過, 則可能沒有 TEMP 的 DATAFILE 存在. 如果沒
有的話, 可以執行類似下面的指令, 產生所需要的檔案:

ALTER TABLESPACE TEMP ADD TEMPFILE '/hisdb/oradata/SUN2/temp01.dbf' SIZE 500M REUSE;
ALTER TABLESPACE USRTEMP ADD TEMPFILE '/hisdb/oradata/SUN2/usrtemp01.dbf' SIZE 2000M REUSE;
ALTER TABLESPACE USRTEMP ADD TEMPFILE '/hisdb/oradata/SUN2/usrtemp02.dbf' SIZE 2000M REUSE;
ALTER TABLESPACE USRTEMP ADD TEMPFILE '/hisdb/oradata/SUN2/usrtemp03.dbf' SIZE 2000M REUSE;


這樣子, 你就可以用原本的 STANDBY DATABASE 暫時取代 PRIMARY DATABASE 的服務. 然後對
原本的 PRIMARY DATABASE 的主機做維護. 等到維護完成, 如果有必要, 可以利用上述的動作,
再切換回來.