1. 程式人生 > >Oracle在RAC環境下遠端客戶端連線的問題

Oracle在RAC環境下遠端客戶端連線的問題

資料庫伺服器
系統:Solaris 5.9 兩臺做cluster,共享磁碟陣列櫃
資料庫:Oracle 9.2.0.5 做的是RAC
現象:最近2個月發現不時的客戶端應用程式無法登入,像宕機一樣一直等待(2個月前一直正常,這套系統已經投入使用5年)。
應用伺服器
  Windows 2003,安裝了oracle客戶端工具,版本9.2.0.1。這套系統是三層結構體系,客戶端應用程式通過應用伺服器來對資料庫進行訪問。這是應用伺服器tnsnames.ora的部分內容,應用程式就是通過NODEORA這個服務名來連線資料庫的。
NODEORA =
  (DESCRIPTION =
  (ADDRESS_LIST =
  (ADDRESS = (PROTOCOL = TCP)(HOST = fmislssun1)(PORT = 1521))
  (ADDRESS = (PROTOCOL = TCP)(HOST = fmislssun2)(PORT = 1521))
  (LOAD_BALANCE = yes)
  )
  (CONNECT_DATA =
  (SERVICE_NAME = fmis.lsdyj)
  (FAILOVER_MODE =
  (TYPE = session)
  (METHOD = basic)
  )
  )
  )

NODE1 =
  (DESCRIPTION =
  (ADDRESS_LIST =
  (ADDRESS = (PROTOCOL = TCP)(HOST = fmislssun1)(PORT = 1521))
  )
  (CONNECT_DATA =
  (SERVICE_NAME = fmis1)
  )
  )

NODE2 =
  (DESCRIPTION =
  (ADDRESS_LIST =
  (ADDRESS = (PROTOCOL = TCP)(HOST = fmislssun2)(PORT = 1521))
  )
  (CONNECT_DATA =
  (SERVICE_NAME = fmis2)
  )
  )

當客戶端應用程式無法登入時,我登入到應用伺服器,使用sqlplus system/

[email protected]連線資料庫,不能進入到sql>提示符下,沒有提示任何錯誤,會一直等待,按Ctrl+c中止也沒有用。這時候檢視alert_sid.log和listener.log在這個時間段都沒有任何錯誤資訊。
為了馬上解決問題,我只能startup force重新啟動一臺資料庫,一般來說就能恢復,但偶爾,還必須重啟另一臺資料庫。
(使用者是上帝啊,NND,不然我的工作早丟了)

為了復現這樣的故障,我進行了大量測試,終於發現當客戶端進行了大任務查詢時(需要數分鐘才能完成的綜合查詢),就會出現這種故障。當客戶端這個大任務完成後竟然發現數據庫自動恢復正常了。於是我想到可能是資料庫工作不正常導致CPU資源佔用太高的原因,於是故障時登入solaris,使用prstat命令檢視程序資訊,會發現其中一臺資料庫伺服器的cpu佔用率25%,另一臺完全是空載。對於大型的查詢,這樣的負載為過麼?
  PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP
 20735 oracle 4126M 4087M cpu0 0 0 2:37:37 25% oracle/2
 20729 oracle 3995M 3950M sleep 59 0 0:00:50 0.6% oracle/2
  761 root 60M 24M sleep 29 10 74:45:18 0.1% java/12
 10936 root 5896K 4952K cpu2 59 0 0:00:00 0.0% prstat/1
…………

我也仔細檢查了oracle各項引數和狀態,或許是我水平太差,看不出哪裡與這種故障有關
沒法了,用explorer工具匯出了solaris系統狀態併發給solaris工程師,看看是不是系統出現毛病,solaris工程師的回答是:系統完全正常……

有一次發生故障時,我發現在應用層伺服器上使用sqlplus system/
[email protected]
和sqlplus system/[email protected]來連線資料庫的時候完全正常!!!但使用nodeora服務名連線資料庫依然是漫無天日的等待。
為了進一步縮小故障範圍,我在兩臺solaris的tnsnames.ora添加了如下程式碼:
FMIS =
  (DESCRIPTION =
  (ADDRESS_LIST =
  (ADDRESS = (PROTOCOL = TCP)(HOST = fmislssun1)(PORT = 1521))
  (ADDRESS = (PROTOCOL = TCP)(HOST = fmislssun2)(PORT = 1521))
  (LOAD_BALANCE = yes)
  )
  (CONNECT_DATA =
  (SERVICE_NAME = FMIS.LSDYJ)
  )
  )
FMIS1 =
  (DESCRIPTION =
  (ADDRESS_LIST =
  (ADDRESS = (PROTOCOL = TCP)(HOST = fmislssun1)(PORT = 1521))
  )
  (CONNECT_DATA =
  (SERVER=DEDICATED)
  (SERVICE_NAME = FMIS.LSDYJ)
  (INSTANCE_NAME = FMIS1)
  )
  )
FMIS2 =
  (DESCRIPTION =
  (ADDRESS_LIST =
  (ADDRESS = (PROTOCOL = TCP)(HOST = fmislssun2)(PORT = 1521))
  )
  (CONNECT_DATA =
  (SERVER = DEDICATED)
  (SERVICE_NAME = FMIS.LSDYJ)
  (INSTANCE_NAME = FMIS2)
  )
  )
再登入到solaris,使用sqlplus system/
[email protected]
和sqlplus system/[email protected]連線資料庫也完全正常,但試圖sqlplus system/[email protected]時依然無法連線,這時我按Ctrl+c後等了2分鐘,終於看到oracle報錯(破天荒頭一回啊,老天開眼了,再不開眼我的工作就除脫了):
ORA-03106: fatal two-task communication protocol error

可是對於ora-03106,說的是通訊的問題,我在資料庫伺服器上測試也會有些故障,不可能是網路通訊或者客戶端連線程式版本的問題,但那又是什麼原因引起的?
並且ora-03106並不是正常情況出現的,只有我在資料庫伺服器上測試時,強行按Ctrl+c才出現的提示?那麼這個錯誤會不會是一種誤導?
那麼還能有什麼原因?

今天下班我再次手動復現故障,然後查詢了與共享伺服器有關的檢視,其中gv$queue檢視結果如下:
SQL> select * from gv$queue;

INST_ID PADDR TYPE QUEUED WAIT TOTALQ
------- ---------------- ---------- ------ ---- ------
  2 00 COMMON 0 0 30083
  2 000000040F4852D8 DISPATCHER 0 0 30505
  1 00 COMMON 15 0 10788
  1 000000040F4852D8 DISPATCHER 0 0 10924
發現queued列有一個值為15,按照Oracle的解釋,理想情況不應該存在排隊!
common佇列存在排隊,說明沒有足夠的共享伺服器程序被用於清空佇列,而恰好oracle的引數shared_servers值為 1。
  於是我把shared_servers的值改為3,重啟資料庫後再執行大型查詢,這是佇列仍然為空,故障沒有出現!

  問題好像解決了,不過我又想到新的問題:
1. 例項引數max_shared_servers的值為20,那麼在共享伺服器程序不夠用的時候,oracle為什麼不啟動新的程序而在原有的唯一的共享伺服器程序上排隊?
2. 我啟動了三個共享伺服器程序才讓排除沒有發生,但如果這時同時有3個或者更多的人在執行這樣的大查詢,那麼三個伺服器可能也不夠,那時故障將再次發生!
3. 我重新修改了所有應用伺服器上的tnsnames.ora,保證所有連線都啟用了load_balance和failover,但出故障的時候,為什麼沒有一個客戶連線會連線到空閒的例項上(正常的時候)?

不管怎樣,共享伺服器上的問題已經找到原因了,如果還有問題,大不了再增加共享伺服器的數量,或者直接使用專用伺服器!感謝達人們的幫忙!先給分!以後有關這問題的新發現,我再貼上來

相關推薦

Oracle在RAC環境遠端客戶連線的問題

資料庫伺服器系統:Solaris 5.9 兩臺做cluster,共享磁碟陣列櫃資料庫:Oracle 9.2.0.5 做的是RAC現象:最近2個月發現不時的客戶端應用程式無法登入,像宕機一樣一直等待(2個月前一直正常,這套系統已經投入使用5年)。應用伺服器  Windows 2

mysql8遠端客戶連線方式

mysql 8.0 預設使用 caching_sha2_password 身份驗證機制 —— 從原來的 mysql_native_password 更改為 caching_sha2_password。 從 5.7 升級 8.0 版本的不會改變現有使用者的身份驗證方法,但新使用者會預設使用新的 cac

遠端客戶連線資料庫時提示TNS-12541: TNS: 無監聽程式

在windows環境下監聽程式和本地服務檔案配置如下 LISTENER =   (DESCRIPTION_LIST =     (DESCRIPTION =       (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(P

jdk8環境,用eclipse indigo進行Zookeeper叢集java api客戶連線,因版本報錯

Unresolved compilation problem: The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files S

ubuntu銳捷客戶連線校園網

ubuntu下,進入銳捷客戶端資料夾目錄下crtl+alt+T進入命令終端 (或者直接在終端中使用cd 切到相關目錄 ) 先獲取許可權(第一次需要,以後不用),然後系統會讓你輸入密碼,然後輸入登陸命令 輸入以下終端命令即可聯網: sudo chomd +x r

spring bootJedisCluster客戶的配置,連線Redis叢集

1,pom依賴新增:     <dependency>             <groupId>redis.clients</groupId>             <artifactId>jedis</arti

MySQL多例項的環境,伺服器本地連線到指定例項的問題(sock方式連線

涉及到sock連線的問題。 為了測試MySQL的某些個特性,在一個機器上安裝了多個MySQL的例項,如下截圖,有兩個例項,一個埠是8000,一個埠是8001。在使用mysql -uroot -p -P8001連線至埠號為8001的MySQL例項的時候,show variables like '%po

oracle客戶連線遠端伺服器的搭建過程

同一網路環境下的兩臺電腦,分別裝上oracle程式 任選其中一臺電腦作為伺服器,建立表空間,建立使用者,分配許可權。客戶端要連線伺服器時必須通過監聽程式才可以實現,所以在伺服器端先建立一個監聽程式 服務名字最好是資料庫的名字,主機號設定為本機的(ipconfig測試出來的)

配置客戶連線遠端資料庫(oracle)

在使用者輸入sqlplus system/[email protected]後,sqlplus程式會自動到sqlnet.ora檔案中找NAMES.DEFAULT_DOMAIN引數,假如該引數存在,則將該引數中的值取出,加到網路服務名的後面,即此例中你的輸入由sqlplus system/[email

ftp(網路傳輸)--BaseRequesHandler(tcp協議的多個客戶連線)--urandom(隨機生成位元組字串)--hmac(類似於hashlib)

ftp(網路傳輸,下載)簡單例項: server服務端: # server 服務端 import json import socket import struct server = socket.socket() server.bind(("127.0.0.1",8001)) server.lis

hadoop HA場景 java客戶遠端訪問hdfs配置

當hadoop namenode是HA叢集時,客戶端遠端訪問hdfs有兩種實現方法: 方法1:將所有關於namenode的引數寫入Configuration物件中。 程式碼: package co

在windows10環境遠端連線阿里雲UbunutuMySQL的方法

在阿里雲上安裝好mysql後 執行 ~# vim /etc/mysql/mysql.conf.d/mysqld.cnf 命令,修改繫結的 ip 重啟 mysql 的服務 ~# service

linux安裝oracle client客戶連線遠端資料庫

有時候,需要在linux伺服器遠端連線oracle資料,此時需要在伺服器上安裝oracle clinet客戶端,用來連線遠端的資料庫。採用rpm安裝方式(root執行)1:下載rpm軟體包oracle-

Sql2008 配置遠端連線客戶連線不上的解決方法

將"客戶端協議"的"TCP/IP"也修改為“Enabled” 配置完成,重新啟動SQL Server 2008。此時應該可以使用了,但是還是要確認一下防火牆。開啟防火牆設定。將SQLServr.exe(C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEX

CentOS 7 啟用遠端連線和使用postgis等客戶連線

設定遠端訪問,允許B類192.168.0.0/16 網段訪問,設定listen_addresses = '*'。資料庫伺服器為19

Linuxl2tp客戶配置並解決pppd斷線問題

不為 dead minutes 根據 1.4 安裝 signal 未能 請求 1.安裝客戶端軟件使用xl2tpd,pppyum install -y xl2tpd ppp 2.配置xl2tpd vim /etc/xl2tpd/xl2tpd.conf 最下方追加下面代碼 [l

LINUXmysql客戶不能輸入中文

自己 很多 輸入中文 sql linu 如果 lan 自帶 linux 今天遇到了這個問題,在LINUX下輸入中文,沒有問題,但在MYSQL客戶端上無法輸入中文,很奇怪? 找了很多資料終於解決了這個問題,其實這個和字符集無關。通常出現在自己編譯的mysql版本上,如果是

003.FTP客戶連線

一 命令列連線 注意: 1:命令列連線不支援目錄下載,使用mget也只會將目錄下檔案下載,不會下載目錄本身。 2:命令列連線不支援斷點續傳。 1 ftp [服務端IP] 2 -help #獲取幫助 3 -get #下載 4 -mget #下載一批檔案 5 -put #上傳

Linux實現客戶兩連跳ping百度,修改dns和nmcil的用法

1.客戶端跳兩次路由器ping百度 rht vmctl reset 重置虛擬機器 真機和虛擬機器開啟火牆策略 用在配置網路單元學的修改兩機閘道器 設定server為雙網絡卡路由端接觸客戶端Desktop閘道器為1.1.1.100 路由器端設定GATEWAY為真機,記得syste

PG客戶連線伺服器報Connection refused (0x0000274D/10061) 的問題分析

C:\Users\Administrator>psql -h 192.168.80.189 -U highgo -p 5899 psql: 無法聯接到伺服器: Connection refused (0x0000274D/10061)