其實談不上是陷阱,只是不注意的話,很容易出現配置錯誤。
這一篇介紹LOAD_BALANCE和FAILOVER配合可能導致的錯誤。
當服務名同時配置了LOAD_BALANCE和FAILOVER時:
TESTRAC =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.224)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.25.198.225)(PORT = 1521))
(LOAD_BALANCE = ON)
(FAILOVER = OFF)
)
(CONNECT_DATA =
(SERVICE_NAME = TESTRAC)
)
)
且配置了REMOTE_LISTENER參數:
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac1
SQL> SHOW PARAMETER REMOTE_LISTENER
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
remote_listener string LISTENERS_TESTRAC
檢查執行個體2:
本欄目更多精彩內容:http://www.bianceng.cn/database/Oracle/
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac2
SQL> SHOW PARAMETER REMOTE_LISTENER
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
remote_listener string LISTENERS_TESTRAC
資料庫伺服器上兩個節點的TNSNAMES中LISTENERS_TESTRAC的配置均為:
LISTENERS_TESTRAC =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = racnode1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = racnode2-vip)(PORT = 1521))
)
當執行個體2被關閉,並不會導致串連錯誤:
bash-2.03$ srvctl stop inst -d testrac -i testrac2
串連服務名:
SQL> CONN YANGTK/YANGTK@TESTRAC
已串連。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac1
SQL> CONN YANGTK/YANGTK@TESTRAC
已串連。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac1
SQL> CONN YANGTK/YANGTK@TESTRAC
已串連。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac1
但是如果執行個體2沒有問題,只是執行個體2的監聽關閉,那麼這個服務名的配置可能會導致錯誤:
bash-2.03$ srvctl start inst -d testrac -i testrac2
bash-2.03$ srvctl stop listener -n racnode2
再次測試連接:
SQL> CONN YANGTK/YANGTK@TESTRAC
已串連。
SQL> SELECT INSTANCE_NAME FROM V$INSTANCE;
INSTANCE_NAME
----------------
testrac1
SQL> CONN YANGTK/YANGTK@TESTRAC
ERROR:
ORA-12541: TNS:無監聽程式