通過sqlplus連線資料庫伺服器很慢的問題

迷倪小魏發表於2017-08-03

今天在論壇上看到一個貼子,問題是客戶端sqlplus連線資料庫很慢:http://www.itpub.net/thread-2090550-1-1.html,之後根據問題的描述與分析,在測試環境做了一下測試,將我的虛擬主機加入域環境,進行測試;之後就聯想到去年我所遇到類似的一個問題:http://www.itpub.net/thread-2072574-1-1.html


實驗環境
作業系統:Windows Server 2008 R2,加入AD域環境
資料庫:Oracle 11.2.0.4


問題描述:
1、從客戶端使用sqlplus xxx/ssss@yyy 的方式連線資料庫,第一次連資料庫時很慢,基本上要幾十秒才能連線到資料庫,接下來幾次連線很正常,但過會兒再連線資料庫又變慢了
2
、資料庫的日誌檔案中,有大量的WARNING: inbound connection timed out (ORA-3136) 錯誤資訊

排除過程:
1、查了ORA-03136的錯誤,根據網上查詢的資料,把資料庫服務的監聽新增了如下引數
    LSNRCTL> set inbound_connect_timeout 0  

並儲存,此時,資料庫中不在報ORA-03136的錯誤了,但是,從客戶端連線到oracle資料庫伺服器還是存在很慢的問題
2
、客戶端連線資料庫服務時,資料庫的那臺主機的硬體負載都不高;
3
、伺服器的監聽檔案和客戶端的tnsname.ora中的主機地址都是使用ip地址
4
、在伺服器上使用sqlplus xxx/ssss@yyy嘗試連線多次,速度正常,感覺伺服器端沒問題
5
、從客戶端ping伺服器的監聽地址,沒有丟包現像
6
、在客戶端使用tnsping測試到伺服器的解析也很快,毫秒以內 
7
、通過56的測試,感覺客戶端到伺服器的網路是正常的
8
、繼續查詢,在網上發現這篇文章和我的情況類似,http://blog.csdn.net/jaray/article/details/36008871後來根據這個文章上的方法,修改了伺服器上的sqlnet.ora中的SQLNET.AUTHENTICATION_SERVICES的值為none
9
、再次使用sqlplus 測試從客戶端測試到服務端的連線,速度正常,幾秒內連線成功
10
、嘗試把那個值再改成NTS,故障又再次出現

問題分析:

sqlnet.oraSQLNET.AUTHENTICATION_SERVICES設定,如果設定NTS,則優先使用Windows驗證,然後使用Oracle驗證;而設定none,則只使用Oracle驗證。由於我測試的環境加入了AD域,所以如果優先Windows驗證,則Oracle會通過遠端的AD域伺服器進行驗證,驗證失敗後再進行Oracle驗證,所以速度會很慢;


解決問題:

sqlnet.oraSQLNET.AUTHENTICATION_SERVICES值設定為none


問題分析到這裡,不經讓我想起去年遇到一個同樣類似的問題:通過sqlplus遠端連線Oracle資料庫的時,有時候能夠連線上,有什麼就連線不上?(如下圖所示)



以下是Oracle11g官方文件關於sqlnet.ora的說明:


************************************************************************************************************************************

The sqlnet.ora file is the profile configuration file. It resides on the client machines and the database server. Profiles are stored and implemented using this file. The database server can be configured with access control parameters in the sqlnet.ora file. These parameters specify whether clients are allowed or denied access based on the protocol.

The sqlnet.ora file enables you to do the following:

·         Specify the client domain to append to unqualified names

·         Prioritize naming methods

·         Enable logging and tracing features

·         Route connections through specific processes

·         Configure parameters for external naming

·         Configure Oracle Advanced Security

·         Use protocol-specific parameters to restrict access to the database

By default, the sqlnet.ora file is located in the ORACLE_HOME/network/admin directory. The sqlnet.ora file can also be stored in the directory specified by the TNS_ADMIN environment variable.

************************************************************************************************************************************

從描述中看出,該檔案是控制客戶端訪問資料庫伺服器的,可以設定多種引數進行訪問控制。關於其他引數的詳細配置請參考官方文件;而接觸到的最多的引數是 sqlnet.authentication_services,官方說明如下:

************************************************************************************************************************************

SQLNET.AUTHENTICATION_SERVICES

Purpose

To enable one or more authentication services. If authentication has been installed, then it is recommended that this parameter be set to either noneor to one of the authentication methods.

Default

None

Note:

When installing the database with Database Configuration Assistant (DBCA), this parameter may be set to nts in the sqlnet.ora file.

Values

·         Authentication Methods Available with Oracle Net Services:

o   none for no authentication methods, including Microsoft Windows native operating system authentication. WhenSQLNET.AUTHENTICATION_SERVICES is set to none, a valid user name and password can be used to access the database.

o   all for all authentication methods.

o   nts for Microsoft Windows native operating system authentication.

·         Authentication Methods Available with Oracle Advanced Security:

o   kerberos5 for Kerberos authentication.

o   radius for RADIUS authentication.

o   tcps for SSL authentication.

************************************************************************************************************************************

從引數的說明可以瞭解到提供兩種服務,net服務和高階安全服務。高階安全服務引數這裡不討論了,討論一下 none / all / nts三個引數的作用。

設定sqlnet.authentication_services:

  • none:作用是不允許通過os系統使用者登入資料庫,需要提供使用者名稱及密碼;
  • all:作用是允許所有的登入方式;
  • nts:作用是windows的本地作業系統使用者認證;

注:需要說明的是該使用者名稱和密碼是指具有sysdba許可權的使用者;在linux上若用系統使用者oracle登入資料庫需要設定為all或者不加該欄位;



關於通過SQLNET.ora檔案限制IP地址訪問的問題請參考蓋大師的部落格:

http://www.eygle.com/archives/2008/01/sqlnetora_ip_limit.html


作者:SEian.G(苦練七十二變,笑對八十一難)

ITPUBhttp://blog.itpub.net/31015730/

51CTOhttp://seiang.blog.51cto.com/


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

相關文章