RAC連線中TNSNAMES需注意的問題
Oracle RAC中的LOAD_BALANCE引數和FAILOVER引數的預設值為。
LOAD_BALANCE引數:在DESCRIPTION_LIST層為ON,而在DESCRIPTION和ADDRESS_LIST預設值都是OFF。
FAILOVER引數:在DESCRIPTION_LIST、DESCRIPTION和ADDRESS_LIST層的預設值都是ON;
注意這些引數的預設值可能會幫助你避免一些”奇怪”的問題。
[@more@]1、指定了INSTANCE_NAME引數仍然會連線到兩個例項上
DFKZYK1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.48.1.31)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.48.1.32)(PORT = 1521))
(LOAD_BALANCE = ON)
)
(CONNECT_DATA =
(SERVICE_NAME = DFKZYK)
(INSTANCE_NMAE = DFKZYK1)
)
)
下面測試連線:
SQL> CONN SYS/TANGYUN@DFKZYK1
已連線。
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
dfkzyk2
SQL> CONN SYS/TANGYUN@DFKZYK1
已連線。
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
dfkzyk2
SQL> CONN SYS/TANGYUN@DFKZYK1
已連線。
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
dfkzyk1
這個問題也是一次偶然的發現,明明配的是例項1卻連線到例項2上去。之前一直都是這樣配都沒有出現過這樣的問題,想了很多種可能性,還是沒有想明白為什麼,最後細細檢查才發現是INSTANCE_NAME寫成了INSTANCE_NMAE,引數寫錯了,但是Oracle卻沒有檢查錯誤,而是直接忽略掉這個引數,導致問題很難被發現。
2、LOAD_BALANCE引數的沒有起作用
DFKZYK =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.48.1.31)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.48.1.32)(PORT = 1521))
)
(LOAD_BALANCE = ON)
(CONNECT_DATA =
(SERVICE_NAME = DFKZYK)
)
)
資料庫的LOCAL_LISTENER引數設定已經被取消:
SQL> CONN SYS/TANGYUN@DFKZYK
已連線。
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
dfkzyk2
SQL> SHOW PARAMETER LOCAL_LISTENER;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
local_listener string
SQL> CONN SYS/TANGYUN@DFKZYK
已連線。
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
dfkzyk1
SQL> SHOW PARAMETER LOCAL_LISTENER;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
local_listener string
在不設定LOCAL_LISTENER引數偶爾會出現連線失敗,LOAD_BALANCE引數設定沒有生效,無論設定為ON或OFF,都不會影響資料庫的連線。測試了多次後才注意到,LOAD_BALANCE引數新增位置錯誤,這裡使用了ADDRESS_LIST並新增了括號,而LOAD_BALANCE引數沒有放到括號中,使得這個設定對於ADDRESS_LIST中的配置無效,而預設LOAD_BALANCE為ON,因此LOAD_BALANCE設定仍然可以生效。
正確的設定應該是:
DFKZYK =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.48.1.31)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.48.1.32)(PORT = 1521))
(LOAD_BALANCE = ON)
)
(CONNECT_DATA =
(SERVICE_NAME = DFKZYK)
)
)
需要注意的是,不僅LOAD_BALANCE引數,FAILOVER引數也有生效區間的問題,這兩個引數在DESCRIPTION_LIST、DESCRIPTION和ADDRESS_LIST三個層面都可以生效,因此在設定引數的時候一點要注意是否引數設定在指定層面上。
當服務名同時配置了LOAD_BALANCE和FAILOVER時:
DFKZYK =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.48.1.31)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.48.1.32)(PORT = 1521))
(LOAD_BALANCE = ON)
(FAILOVER=OFF)
)
(CONNECT_DATA =
(SERVICE_NAME = DFKZYK)
)
)
且配置LOCAL_LISTENER引數時。
SQL> CONN SYS/TANGYUN@DFKZYK
已連線。
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
dfkzyk2
SQL> SHOW PARAMETER LOCAL_LISTENER;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
local_listener string NODE2
SQL> CONN SYS/TANGYUN@DFKZYK
已連線。
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
dfkzyk1
SQL> SHOW PARAMETER LOCAL_LISTENER;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
local_listener string NODE1
資料庫伺服器上兩個節點的TNSNAMES中NODE1(節點1)和NODE2(節點2)中的配置均為:
NODE1/NODE2 =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = node1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = node2-vip)(PORT = 1521))
)
當例項1當機時並不出現問題,但是當例項1沒有問題,但是監聽宕掉時,這個服務名的配置可能會偶爾連線不上:
SQL> CONN SYS/TANGYUN@DFKZYK
ERROR:
ORA-12541: TNS: 無監聽程式
警告: 您不再連線到 ORACLE。
SQL> CONN SYS/TANGYUN@DFKZYK
已連線。
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
dfkzyk2
SQL> CONN SYS/TANGYUN@DFKZYK
已連線。
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
dfkzyk2
SQL> CONN SYS/TANGYUN@DFKZYK
ERROR:
ORA-12541: TNS: 無監聽程式
警告: 您不再連線到 ORACLE。
導致這個問題的原因是由於配置LOCAL_LISTENER後,雖然例項1對應節點的監聽關閉,但是例項2所在節點的監聽仍然包含例項2上的資訊,因此連線時負載均衡仍然會考慮例項1,當節點2上的監聽將連線發到節點1的監聽時碰到了錯誤,而靜態FAILOVER又沒有啟動,因此出現了錯誤。
這種情況下,如果修改服務名設定FAILOVER為ON,那麼可以避免錯誤的產生:
DFKZYK =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.48.1.31)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.48.1.32)(PORT = 1521))
(LOAD_BALANCE = ON)
(FAILOVER=ON)
)
(CONNECT_DATA =
(SERVICE_NAME = DFKZYK)
)
)
這樣,仍然有部分連線會嘗試例項1,但是在碰到錯誤後,會自動連線到例項2上。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24930246/viewspace-1041678/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- RAC TAF 連線 (tnsnames.ora)
- RAC資料庫連線配置,tnsnames和client端配置資料庫client
- Q群友問題---tnsnames.ora中指定sid引數仍無法連線到指定的rac例項
- RAC連線的問題ORA-12545
- RAC環境中的TNSNAMES檔案
- RAC連線的問題ORA-12545(二)
- 由於內部連線引起的Oracle RAC效能問題Oracle
- ORACLE RAC中連線ScanIP報錯ORA-12545的問題解決Oracle
- 最近遇到的RAC的一個例項無法連線的問題
- Mysql6.0連線中的幾個問題MySql
- 表連線時update與delete操作需注意的地方delete
- Oracle 11g RAC通過SCAN IP連線資料庫 - JDBC連線串問題Oracle資料庫JDBC
- Github ssh的連線問題Github
- WTC連線阻塞的問題
- MyEclipse中連線MySQL的問題淺析ZPEclipseMySql
- 資產年中上線資料期初匯入需注意的兩個問題-轉
- [zt] JDBC連線Oracle RAC的連線串配置JDBCOracle
- 連線oracle中出現的問題Oracle
- 關於mysql連線的問題MySql
- 關於連線池的問題!
- JDBC連線MySQL失效的問題JDBCMySql
- jsp中的rar檔案連線亂碼問題JS
- [Swoole] 從原始碼中查 Websocket 連線問題原始碼Web
- 【Swoole】從原始碼中查 Websocket 連線問題原始碼Web
- MySQL SSL連線問題MySql
- HTTP 長連線問題HTTP
- jive 連線 mysql 問題MySql
- JDBC連線ORACLE問題JDBCOracle
- 遠端連線問題
- 問個jrun連線池的問題
- rac 本地監聽問題導致資料斷斷續續連線
- 【問題記錄】—SignalR連線斷線重連SignalR
- 請問一個jndi連線的小問題
- IDEA無法連線docker中的資料庫的問題IdeaDocker資料庫
- golang websocket android連線的問題GolangWebAndroid
- 關與連線池的配置問題!
- IIS連線ORACLE的一個問題Oracle
- jdbc 連線 oracle racJDBCOracle