天天看點

Oracle RAC的TAF簡單測試

Oracle的RAC的高可用功能除了負載均衡還包括TAF(Transparent Application Failover)。

RAC的TAF是指會話連接配接到一個執行個體上,如果這個執行個體出現了故障,Oracle會自動将會話遷移到另一個執行個體上。

看一個簡單的例子。首先不配置TAF,在用戶端TNSNAMES.ORA中進行如下的測試:

TESTRAC =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.224)(PORT = 1521))

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.225)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = testrac)

)

)

現在沒有配置TAF,連接配接資料庫,檢查執行個體資訊:

SQL> CONN NDMAIN/[email protected]已連接配接。

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac2

下面關閉TESTRAC2執行個體:

$ srvctl stop instance -d testrac -i testrac2

再次檢查剛才連接配接的會話:

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

SELECT INSTANCE_NAME FROM V$INSTANCE

*第 1 行出現錯誤:

ORA-03113: 通信通道的檔案結束

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

ERROR:

ORA-03114: 未連接配接到 ORALCE

執行操作後,Oracle會報上面的錯誤。下面啟動服務,配置TAF:

TESTRAC =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.224)(PORT = 1521))

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.225)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = testrac)

(FAILOVER_MODE =

(TYPE = SESSION)

(METHOD = BASIC)

)

)

)

$ srvctl start instance -d testrac -i testrac2

重新登陸,檢查執行個體資訊:

SQL> CONN NDMAIN/[email protected]已連接配接。

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac1

再次關閉執行個體:

$ srvctl stop instance -d testrac -i testrac1

檢查剛才的連接配接的會話:

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac1

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

SELECT INSTANCE_NAME FROM V$INSTANCE

*第 1 行出現錯誤:

ORA-25408: 無法安全重放調用

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac2

雖然報了一個錯誤ORA-25408,但是再次執行的時候,Oracle已經自動切換到執行個體TESTRAC2上了。

啟動TESTRAC1執行個體,然後關閉TESTRAC2執行個體:

$ srvctl start instance -d testrac -i testrac1

$ srvctl stop instance -d testrac -i testrac2

再次檢查連接配接情況:

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

SELECT INSTANCE_NAME FROM V$INSTANCE

*第 1 行出現錯誤:

ORA-25408: 無法安全重放調用

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac1

Oracle成功的切換回testrac1執行個體。Oracle這裡也存在一個問題,就是會産生ORA-25408錯誤。Oracle給出的解決方法是應用程式對這個錯誤進行處理。

如果将FAILOVER的TYPE改為SELECT模式,則也不會出現這個錯誤,首先修改TNSNAMES中的設定:

TESTRAC =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.224)(PORT = 1521))

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.225)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = testrac)

(FAILOVER_MODE =

(TYPE = SELECT)

(METHOD = BASIC)

)

)

)

然後啟動剛才關閉的TESTRAC2執行個體:

$ srvctl start instance -d testrac -i testrac2

重新連接配接到執行個體:

SQL> CONN NDMAIN/[email protected]已連接配接。

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac1

關閉TESTRAC1執行個體:

$ srvctl stop instance -d testrac -i testrac1

檢查會話連接配接的情況:

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac2

這時第一次執行SQL就成功了,沒有在出現ORA-25408錯誤。

上一篇簡單介紹了TAF,并通過具體的說明了SESSION和SELECT的差別。但是那個例子展示的隻是二者差別的一個現象而已。真正的差別在于,配置了SELECT選項的FAILOVER在資料庫執行個體失敗時,會将會話切換到另一個執行個體,且将執行個體失敗時運作的SELECT語句繼續執行,并傳回正确的結果。而SESSION則不具備這個功能。

先看看FAILOVER設定為SESSION的情況:

TESTRAC =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.224)(PORT = 1521))

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.225)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = testrac)

(FAILOVER_MODE =

(TYPE = SESSION)

(METHOD = BASIC)

)

)

)

下面先看看FAILOVER設定為SESSION的情況:

SQL> CONN TEST/[email protected]已連接配接。

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac2

SQL> SET PAUSE ON

SQL> SELECT TRIGGER_NAME FROM DBA_TRIGGERS;

TRIGGER_NAME

------------------------------

DEF$_PROPAGATOR_TRIG

REPCATLOGTRIG

XDB$ACL$xd

xdb-log9_TAB$xd

SERVLET$xd

ftp-log14_TAB$xd

http-log20_TAB$xd

Folder23_TAB$xd

XDB$STATS$xd

XDB$CONFIG$xd

XDBCONFIG_VALIDATE

XDB_RV_TRIG

XDB_PV_TRIG

CWM$DIMENSIONDEL

CWM$CUBEDEL

CWM2$AWVIEWSUPD

CWM2$AWVIEWCOLSUPD

CWM$CLASSIFICATIONUPD

.

.

.

EM_TARGETS_DELETE

BLACKOUT_CHANGE

BLACKOUT_STATUS

UPDATE_SOURCE

BLACKOUT_WINDOW_INSERT

HANDLE_RELATED_TARGETS

MGMT_METRIC_COLL_INS

利用PAUSE的暫停功能,然後在另一個會話中關閉目前連接配接執行個體:

$ srvctl stop instance -d testrac -i testrac2

傳回剛才執行SQL的視窗,按回車繼續:

TRIGGER_NAME

------------------------------

MGMT_CREDS_UPD

MASTER_AGENT_CHANGE_TRIGGER

METRICS_INSERT_TRIGGER

TARGET_PROP_DEFS_TR

METRICS_DELETE

TARGETS_INSERT_TRIGGER

CHECK_DUPLICATE_TARGETS

RAW_METRICS_AFTER_INSERT

ERROR:

ORA-25401: 無法繼續讀取

已選擇105行。

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac1

雖然SELECT操作失敗了。但是再次執行SQL時成功了。而且會話已經切換到了另外一個執行個體上。

從上面的結果也可以看到SQLPLUS的一些處理方法。PAUSE主要起作用在執行後和每一頁的結束後。

而PAUSE和SQL結果的提取是沒有關系的。這也是為什麼在PAUSE繼續執行之後,仍然得到了一些記錄的原因。

而且從最終擷取105條記錄也可以看出,Oracle的FETCH操作是通過數組進行的,在PAUSE的時候,這次數組提取已經完成。而PAUSE結束後,本次擷取的資料可以顯示,再次提取的時候出現了錯誤。

SQL> SHOW ARRAY

arraysize 15

可以看到,Oracle實際執行了7次提取操作。

上面扯遠了一點,下面繼續看FAILOVER的SELECT表現。

首先修改tnsnames.ora中FAILOVER的配置:

TESTRAC =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.224)(PORT = 1521))

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.225)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = testrac)

(FAILOVER_MODE =

(TYPE = SELECT)

(METHOD = BASIC)

)

)

)

然後将剛才管理的instance啟動:

$ srvctl start instance -d testrac -i testrac2

下面同樣執行上面那個SQL,注意這裡必須重新登陸一次,否則用戶端

TNSNAMES的修改無法對目前會話生效:

SQL> SET PAUSE OFF

SQL> CONN TEST/[email protected]已連接配接。

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac1

SQL> SET PAUSE ON

SQL> SELECT TRIGGER_NAME FROM DBA_TRIGGERS;

TRIGGER_NAME

------------------------------

DEF$_PROPAGATOR_TRIG

REPCATLOGTRIG

XDB$ACL$xd

xdb-log9_TAB$xd

SERVLET$xd

ftp-log14_TAB$xd

http-log20_TAB$xd

Folder23_TAB$xd

XDB$STATS$xd

XDB$CONFIG$xd

XDBCONFIG_VALIDATE

XDB_RV_TRIG

XDB_PV_TRIG

.

.

.

UPDATE_SOURCE

BLACKOUT_WINDOW_INSERT

HANDLE_RELATED_TARGETS

MGMT_METRIC_COLL_INS

關閉目前會話連接配接的執行個體:

$ srvctl stop instance -d testrac -i testrac1

下面傳回SQLPLUS會話,敲回車繼續:

TRIGGER_NAME

------------------------------

MGMT_CREDS_UPD

MASTER_AGENT_CHANGE_TRIGGER

METRICS_INSERT_TRIGGER

TARGET_PROP_DEFS_TR

METRICS_DELETE

TARGETS_INSERT_TRIGGER

CHECK_DUPLICATE_TARGETS

RAW_METRICS_AFTER_INSERT

METRIC_ERRORS_CUR_AND_DUPES

SEVERITY_DELETE

INSERT_FLAT_TARGETS

MGMT_JOB_EXEC_INSERT

JOB_CMD_BLK_DELETE_TRIGGER

JOB_EXEC_DELETE_TRIGGER

.

.

.

SDO_DROP_USER_BEFORE

SDO_DROP_USER

SDO_GEOR_DROP_USER

SDO_NETWORK_DROP_USER

SDO_GEOR_TRUNC_TABLE

已選擇164行。

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac2

這次不但将會話切換到了正常的執行個體上,而且SELECT也得到了完整的結果,沒有因執行個體故障而出現錯誤。這就是FAILOVER的SESSION和SELECT設定的差別。

這篇簡單讨論一下TAF對事務的影響。

上一篇讨論的主要是TAF對查詢的影響,那麼Oracle是否也能對資料的修改進行TAF,下面來看一個例子。

用戶端tnsnames.ora中的設定如下:

TESTRAC =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.224)(PORT = 1521))

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.225)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = testrac)

(FAILOVER_MODE =

(TYPE = SESSION)

(METHOD = BASIC)

)

)

)

下面嘗試進行修改:

SQL> CONN TEST/[email protected]已連接配接。

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac1

SQL> CREATE TABLE T (ID NUMBER);

表已建立。

SQL> INSERT INTO T VALUES (1);

已建立 1 行。

然後關閉目前連接配接的執行個體:

$ srvctl stop instance -d testrac -i testrac1

傳回SQLPLUS界面執行任意SQL:

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

SELECT INSTANCE_NAME FROM V$INSTANCE

*第 1 行出現錯誤:

ORA-25402: 事務處理必須重新運作

SQL> SELECT * FROM T;

SELECT * FROM T

*第 1 行出現錯誤:

ORA-25402: 事務處理必須重新運作

SQL> DELETE T;

DELETE T

*第 1 行出現錯誤:

ORA-25402: 事務處理必須重新運作

SQL> COMMIT;

COMMIT

*第 1 行出現錯誤:

ORA-25402: 事務處理必須重新運作

SQL> ROLLBACK;

回退已完成。

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac2

可以看到,切換雖然成功了,但是執行任何操作都會傳回ORA-25402錯誤,除非執行ROLLBACK操作。

将SESSION模式改為SELECT模式:

TESTRAC =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.224)(PORT = 1521))

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.225)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = testrac)

(FAILOVER_MODE =

(TYPE = SELECT)

(METHOD = BASIC)

)

)

)

啟動剛才關閉的執行個體:

$ srvctl start instance -d testrac -i testrac1

重新連接配接,使得用戶端tnsnames.ora的修改生效。采用上一篇文章的方法,利用SQLPLUS的PAUSE指令觀察SELECT模式在進行了修改之後,是如何進行TAF的:

SQL> CONN TEST/[email protected]已連接配接。

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac1

SQL> INSERT INTO T VALUES (1);

已建立 1 行。

SQL> SET PAUSE ON

SQL> SELECT TRIGGER_NAME FROM DBA_TRIGGERS;

TRIGGER_NAME

------------------------------

DEF$_PROPAGATOR_TRIG

REPCATLOGTRIG

XDB$ACL$xd

xdb-log9_TAB$xd

SERVLET$xd

ftp-log14_TAB$xd

http-log20_TAB$xd

Folder23_TAB$xd

.

.

.

UPDATE_SOURCE

BLACKOUT_WINDOW_INSERT

HANDLE_RELATED_TARGETS

MGMT_METRIC_COLL_INS

下面關閉連接配接的執行個體:

$ srvctl stop instance -d testrac -i testrac1

傳回SQLPLUS敲回車繼續:

TRIGGER_NAME

------------------------------

MGMT_CREDS_UPD

MASTER_AGENT_CHANGE_TRIGGER

METRICS_INSERT_TRIGGER

TARGET_PROP_DEFS_TR

METRICS_DELETE

TARGETS_INSERT_TRIGGER

CHECK_DUPLICATE_TARGETS

RAW_METRICS_AFTER_INSERT

ERROR:

ORA-25402: 事務處理必須重新運作

已選擇105行。

現在得到了和昨天測試完全不一樣的結果。

上面的測試說明兩點問題。

首先,TAF是針對SESSION和SELECT的,它不支援事務的切換。其實想想也是有道理的,當連接配接的執行個體發生了故障,用戶端的連接配接發生了切換之後,SESSION資訊、INSTANCE資訊以及其他很多事務依賴的東西都不存在了,Oracle為了保證事務的完整性和一緻性,必要要求使用者復原事務。

第二,SELECT模式的TAF隻對不包含任何事務處理的查詢有效。一旦使用者執行了修改操作,SELECT模式也無法在TAF之後将進行一半的查詢完成。

最後,如果啟用了TAF功能,那麼程式必須要添加處理ORA-25402錯誤的能力,否則一旦發生TAF切換,程式将一直報錯,而無法再進行任何操作。

這篇簡單讨論一下TAF的BASIC方式和PRECONNECT方式。

TAF有兩種切換方式,BASIC方式和PRECONNECT方式。對于BASIC方式,所有設定了TAF的會話在目前執行個體失敗後,會連接配接到另外一個執行個體上。而對于PRECONNECT方式,每個連接配接的會話在主執行個體和備份執行個體上各連接配接一個會話,一旦主執行個體失敗,可以迅速的切換到備份執行個體。

首先看看普通BASIC方式的tnsnames.ora的設定:

TESTRAC_BASIC =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.224)(PORT = 1521))

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.225)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = testrac)

(FAILOVER_MODE =

(TYPE = SELECT)

(METHOD = BASIC)

)

)

)

下面看看PRECONNECT的配置:

TESTRAC_PRE1 =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.224)(PORT = 1521))

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.225)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = testrac)

(FAILOVER_MODE =

(TYPE = SELECT)

(METHOD = PRECONNECT)

(BACKUP = TESTRAC_PRE2)

)

)

)

TESTRAC_PRE2 =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.224)(PORT = 1521))

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.225)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = testrac)

(FAILOVER_MODE =

(TYPE = SELECT)

(METHOD = PRECONNECT)

(BACKUP = TESTRAC_PRE1)

)

)

)

對于BASIC方式的TAF:

SQL> CONN TEST/[email protected]_BASIC已連接配接。

SQL> SELECT SID, FAILOVER_TYPE, FAILOVER_METHOD, FAILED_OVER

2 FROM V$SESSION

3 WHERE SID IN (SELECT SID FROM V$MYSTAT WHERE ROWNUM = 1);

SID FAILOVER_TYPE FAILOVER_M FAI

---------- ------------- ---------- ---

130 SELECT BASIC NO

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac1

通過SET TIMING ON來檢查觀察切換時間:

SQL> SET TIMING ON

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac1

已用時間: 00: 00: 00.01

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac1

已用時間: 00: 00: 00.01

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac2

已用時間: 00: 00: 00.25

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac2

已用時間: 00: 00: 00.00

在執行查詢的同時在另外的視窗關閉執行個體1:

bash-2.03$ srvctl stop instance -d testrac -i testrac1

下面看看PRECONNECT的情況,首先開啟執行個體:

bash-2.03$ srvctl start instance -d testrac -i testrac1

通過TESTRAC_PRE1服務名連接配接資料庫:

SQL> SET TIMING OFF

SQL> CONN TEST/[email protected]_PRE1已連接配接。

SQL> SELECT SID, FAILOVER_TYPE, FAILOVER_METHOD, FAILED_OVER

2 FROM V$SESSION

3 WHERE SID IN (SELECT SID FROM V$MYSTAT WHERE ROWNUM = 1);

SID FAILOVER_TYPE FAILOVER_M FAI

---------- ------------- ---------- ---

149 SELECT PRECONNECT NO

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac1

執行剛才的操作,檢查PRECONNECT的TAF情況:

SQL> SET TIMING OFF

SQL> CONN TEST/[email protected]_PRE1已連接配接。

SQL> SELECT SID, FAILOVER_TYPE, FAILOVER_METHOD, FAILED_OVER

2 FROM V$SESSION

3 WHERE SID IN (SELECT SID FROM V$MYSTAT WHERE ROWNUM = 1);

SID FAILOVER_TYPE FAILOVER_M FAI

---------- ------------- ---------- ---

149 SELECT PRECONNECT NO

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac1

SQL> SET TIMING ON

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac1

已用時間: 00: 00: 00.00

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac1

已用時間: 00: 00: 00.01

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac1

已用時間: 00: 00: 00.01

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac2

已用時間: 00: 00: 00.01

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac2

已用時間: 00: 00: 00.00

SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;

INSTANCE_NAME

----------------

testrac2

已用時間: 00: 00: 00.01

在查詢的同時管理執行個體testrac1:

bash-2.03$ srvctl stop instance -d testrac -i testrac1

資料庫負載很小,而且會話需要恢複的操作不多,是以切換時所需的時間不長,不過即使是這樣,通過對比BASIC和PRECONNECT所需的切換時間,也可以看到明顯的差別。

這篇簡單讨論一下TAF伺服器端的PRECONNECT設定。

上一篇讨論了用戶端配置PRECONNECT方式的TAF,下面介紹一下RAC伺服器端設定PRECONNECT服務的方法:

通過圖形界面啟動dbca;

在歡迎界面選擇Oracle Real Application Cluster database;

選擇Service Management;

選擇CLUSTER資料庫,這裡是testrac;

在Database Service界面添加要啟動的服務:PRE_TESTRAC,然後将TAF政策修改為Pre-connect,點選Finish,完成配置。

這是伺服器端的tnsnames.ora中添加了下面的配置:

PRE_TESTRAC =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = racnode1-vip)(PORT = 1521))

(ADDRESS = (PROTOCOL = TCP)(HOST = racnode2-vip)(PORT = 1521))

(LOAD_BALANCE = yes)

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = PRE_TESTRAC)

(FAILOVER_MODE =

(BACKUP = PRE_TESTRAC_PRECONNECT)

(TYPE = SELECT)

(METHOD = PRECONNECT)

(RETRIES = 180)

(DELAY = 5)

)

)

)

PRE_TESTRAC_PRECONNECT =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = racnode1-vip)(PORT = 1521))

(ADDRESS = (PROTOCOL = TCP)(HOST = racnode2-vip)(PORT = 1521))

(LOAD_BALANCE = yes)

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = PRE_TESTRAC_PRECONNECT)

(FAILOVER_MODE =

(BACKUP = PRE_TESTRAC)

(TYPE = SELECT)

(METHOD = BASIC)

(RETRIES = 180)

(DELAY = 5)

)

)

)

同時,通過srvctl可以監控、管理建立的PER_TESTRAC服務:

bash-2.03$ srvctl status service -d testrac

Service PRE_TESTRAC is running on instance(s) testrac2, testrac1

建立了服務之後,用戶端可以直接配置PRE_TESTRAC這個服務,比如用戶端tnsnames.ora的配置為:

PRE_TESTRAC_SERVICE =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.224)(PORT = 1521))

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.225)(PORT = 1521))

(LOAD_BALANCE = yes)

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = PRE_TESTRAC)

(FAILOVER_MODE =

(TYPE = SELECT)

(METHOD = PRECONNECT)

(BACKUP = PRE_TESTRAC_PRECONNECT)

)

)

)

通過服務名PRE_TESTRAC_SERVICE建立的連接配接就啟用了PRECONNECT的TAF:

SQL> CONN TEST/[email protected]_TESTRAC_SERVICE已連接配接。

SQL> SELECT SID, FAILOVER_TYPE, FAILOVER_METHOD, FAILED_OVER

2 FROM V$SESSION

3 WHERE SID IN (SELECT SID FROM V$MYSTAT WHERE ROWNUM = 1);

SID FAILOVER_TYPE FAILOVER_M FAI

---------- ------------- ---------- ---

127 SELECT PRECONNECT NO

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22198259/viewspace-659770/,如需轉載,請注明出處,否則将追究法律責任。

轉載于:http://blog.itpub.net/22198259/viewspace-659770/