Oracle RAC 客戶端故障轉移(failover),當采用TAF方式時,對於已經建立連接的客戶端,在連接的實例或節點出現故障時,客戶端無需再次發出連接請求,仍然可以繼續之前的數據庫操作,此稱之為透明故障轉移。
使用TAF,需要配置客戶端tnsnames.ora文件,在其中增加了failover_mode選項,failover=on是默認配置,不寫也行。
今天試驗驗證type=select和type=session的區別。
這兩種參數的設置在實例崩潰時都會對事務進行回滾,其不同之處在於對於節點崩潰時正在執行的select語句的處理。type=select會將正在執行的select語句轉移到新的節點上繼續執行返回後續的結果集,而type=session則會終止查詢,想要再此查詢需要重新運行select語句,從頭開始進行查詢。
假設用戶正在節點1上執行查詢,整個結果集共有100條記錄,現在已從節點1上返回10條記錄,這時節點1宕機,用戶連接被轉移到節點2上,如果是session模式,則需要重新執行查詢語句;如果是select方式,會從節點2上繼續返回剩下的90天記錄,而已經從節點1返回的10條記錄不會重復返回給用戶,對於用戶而言,感受不到這種切換。
顯然為了實現select 方式,Oracle 必須為每個session保存更多的內容,包括游標,用戶上下文等,需要更多的資源也是用資源換時間的方案。
下面開始進行試驗
一、type=select
tnsnames配置如下
RACDB=
(description =
(address = (protocol = tcp)(host = 192.168.1.201)(port = 1521))
(address = (protocol = tcp)(host = 192.168.1.202)(port = 1521))
(load_balance = yes)
(connect_data =
(server = dedicated)
(service_name = RACDB)
(failover_mode =
(type = select)
(method = preconnect)
(retries = 180)
(delay = 5)
)
)
)
實驗開始:
首先連接到RAC後查看此時的instance_name,並運行查詢語句
[oracle@jp admin]$ sqlplus sys/oracle@RACDB as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Wed Mar 5 06:17:10 2014
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options
SYS@RACDB>show parameter instance_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string RACDB1
SYS@RACDB>select * from dba_objects;
...........
在執行過程中將RACDB1 shutdown abort模擬節點崩潰
SYS@RACDB1>shutdown abort
ORACLE instance shut down.
此時查詢卡住幾秒鐘後,繼續返回查詢結果,不用重新運行查詢語句。
二、type=session
tnsnames.ora配置如下
RACDB=
(description =
(address = (protocol = tcp)(host = 192.168.1.201)(port = 1521))
(address = (protocol = tcp)(host = 192.168.1.202)(port = 1521))
(load_balance = yes)
(connect_data =
(server = dedicated)
(service_name = RACDB)
(failover_mode =
(type = session)
(method = preconnect)
(retries = 180)
(delay = 5)
)
)
)
實驗開始
SYS@RACDB>show parameter instance_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string RACDB2
SYS@RACDB>select * from dba_objects;
省略。。。。。。
此時將RACDB2 shutdown abort
SYS@RACDB2>shutdown abort
ORACLE instance shut down.
此時查詢卡住,幾秒鐘後報錯並給出已查詢的行數
ERROR:
ORA-25401: can not continue fetches
750 rows selected.
SYS@RACDB>
查詢此時的instance_name
SYS@RACDB>show parameter instance_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string RACDB1
已經自動切換到RACDB1上,但查詢語句已經中斷。