天天看點

步步出錯,層層分析--tns的一些常見錯誤分析執行個體

在oracle應用中,tns-xxxxx這樣的錯誤在我們的應用中是非常常見的。

tns-xxxxx的錯誤一般都是和資料庫的連接配接有關的錯誤,他通常是發生在請求資料庫連接配接時發生的。

下面我們來看看有哪些tns-xxxx的錯誤,已經這些錯誤發生的原因,已經對應的解決方案。

C:/>sqlplus "/@orcl1 as sysdba"

ERROR:

ORA-12154: TNS: 無法解析指定的連接配接辨別符

這裡的提示資訊是無法解析連接配接描述符,表示連接配接辨別符,也就是tnsnname和你本地的tnsname.ora

裡配置的不一緻,連接配接時,請求tnsname描述符,但是更不就找不到,這樣就會出現這樣的錯誤,

檢查我們配置的tnsname檔案

ORCL =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = janes)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCL)
    )
  )      

隻能找到這樣一個本地tnsname服務的配置,可以看到确實是tnsname不一緻,修改我們的sqlplus連接配接指令

和tnsname裡配置的保持一緻

C:/>sqlplus "/@orcl as sysdba"

ERROR:

ORA-12541: TNS: 無監聽程式

這裡很明顯了,是所請求的伺服器的監聽程式還沒有啟動,現在我們啟動監聽服務,注意這裡有很多網友一起問

的問題中,總是将listener和tnsname混淆在一起,這裡兩者有很大的差別的,listener是伺服器端需要的程序

用來用戶端的連接配接通訊。 而tnsname不是程序,是一個用戶端的配置,是用戶端如何去請求和伺服器連接配接的配置

資訊,包括伺服器的host,端口,sid,連接配接方式,連接配接協定等。

我們用上面的tnsname來做執行個體,看看tnsname是如何進行描述的

ORCL =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = janes)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCL)
    )
  )      

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

表示tcp協定,一般來說常見的都是tcp, host是要連接配接的伺服器的機器名或者ip, port是伺服器監聽的端口,通過這一段

用戶端sqlplus進行連接配接的時間,就是要是和janes的伺服器,以tcpd哦方式,在1521請求伺服器的連接配接。

 (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = ORCL)

    )

這裡表示,擷取listener對于的連接配接,SERVER = DEDICATED辨別是專用伺服器的方式,SERVICE_NAME = ORCL是指的

連接配接上伺服器上一個名為ORCL的執行個體,為了相容以前的8i或者以前的版本,這裡也提供SID這樣的方式,也就是需要連接配接的

執行個體的ID

通過tnsname描述檔案,我們可以看到,我們現在需要連接配接的janes機器,那麼就是janes上的監聽沒有啟動,是以請求到這裡

監聽還沒有準備好,也就提示這樣的錯了

進入janes機器,啟動服務。

C:/>lsnrctl start

服務以前啟動成功了

接着我們再用指令請求登入

C:/>sqlplus "/@orcl as sysdba" 

還是出現錯誤,估計如果意志不堅強,沒有恒心的朋友,經常就會放棄了,其實我們看到,我們已經一步一步的排查,都快接近

成功的彼岸了。我們不能就這樣放棄,繼續分析我們的錯誤資訊

ERROR:

ORA-12514: TNS: 監聽程式目前無法識别連接配接描述符中請求的服務

這裡的錯誤資訊也描述的很清楚了,無法識别連接配接描述符裡請求的服務。什麼是連接配接描述符,不就是我們這裡一直再提的tnsname

的配置麼,這個tnsname配置裡的服務名無法識别,很顯然這裡的錯誤資訊告訴我們兩個重要資訊。

1.  已經和tnsname裡描述中的伺服器進行到了連接配接

2.  連接配接中tnsname裡的service_name并不能在連接配接中的伺服器上找到。

既然是這樣,我們可以查詢一下伺服器上監聽都有哪些執行個體服務呢

C:/>lsnrctl status

監聽端點概要...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=janes)(PORT=1521)))

監聽程式不支援服務

指令執行成功

确實這裡寫着監聽程式不支援服務

這句話是什麼意思了,由于我的janes這個伺服器,都沒有啟動資料庫執行個體,是以沒有一個執行個體存在在這個監聽上,有就出現了這樣的提示資訊了,其實就是指的監聽現在沒有一個資料庫執行個體進行了注冊,這裡我們要先明白一個動态注冊和靜态注冊的概念,對于9i或者以上的版本,資料庫執行個體啟動的時候nomount這個狀态,資料庫就會把自己service_name注冊到監聽裡,這個是動态注冊,有時可以alter system register動态注冊。靜态注冊就是通過listener.ora檔案,把需要注冊的資料庫的服務名注冊到監聽裡。 這個具體的一些知識,在别的文章

裡再詳細闡述

既然如此,我們啟動我們的資料庫執行個體,在janes伺服器上

C:/>sc start oracleserviceorcl

服務執行個體啟動成功

再看看listener的狀态

奇怪了,怎麼還是提示沒有服務呀,這個并不奇怪,這裡不過是還沒有及時的注冊到監聽上而已,多等一下時間,在看看狀态

OK,現在出現了這些服務了

C:/>sc start oracleserviceorcl

監聽端點概要...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=janes)(PORT=1521)))

服務摘要..

服務 "ORCLXDB" 包含 1 個例程。

  例程 "orcl", 狀态 READY, 包含此服務的 1 個處理程式...

服務 "ORCL_XPT" 包含 1 個例程。

  例程 "orcl", 狀态 READY, 包含此服務的 1 個處理程式...

服務 "orcl" 包含 1 個例程。

  例程 "orcl", 狀态 READY, 包含此服務的 1 個處理程式...

指令執行成功

這裡可以看到我們的orcl這個資料庫執行個體已經注冊上去了。我們再連接配接試試

C:/>sqlplus "/@orcl as sysdba"

連接配接到:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

大功告成,已經完全搞定了。

listener.log是記錄監聽的日志,當有連接配接成功的請求過來是都會有記錄記載的,

上面的實驗會有如下log發現

16-8月 -2009 07:56:31 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)(CID=(PROGRAM=F:/developer/oracle/product/10.2.0/db_1/bin/sqlplus.exe)(HOST=JANES)(USER=shenjuan))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.202)(PORT=1940)) * establish * ORCL * 12514

TNS-12514: TNS: 監聽程式目前無法識别連接配接描述符中請求的服務

16-8月 -2009 08:05:16 * (CONNECT_DATA=(CID=(PROGRAM=)(HOST=)(USER=shenjuan))(COMMAND=status)(ARGUMENTS=64)(SERVICE=LISTENER)(VERSION=169869568)) * status * 0

16-8月 -2009 08:11:48 * service_register * orcl * 0

16-8月 -2009 08:11:54 * service_update * orcl * 0

16-8月 -2009 08:12:48 * (CONNECT_DATA=(CID=(PROGRAM=)(HOST=)(USER=shenjuan))(COMMAND=status)(ARGUMENTS=64)(SERVICE=LISTENER)(VERSION=169869568)) * status * 0

16-8月 -2009 08:14:18 * service_update * orcl * 0

16-8月 -2009 08:16:25 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)(CID=(PROGRAM=F:/developer/oracle/product/10.2.0/db_1/bin/sqlplus.exe)(HOST=JANES)(USER=shenjuan))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.202)(PORT=1946)) * establish * ORCL * 0

16-8月 -2009 08:16:27 * service_update * orcl * 0

你分析一下,我做了什麼動作了?

這個文章,我們一步一步的分步的進行錯誤的研究,進而很系統的了解到,每個常常出現的有關tnsname連接配接

出現連接配接方面的錯誤時,錯誤的原因和解決的方法,這樣,我們可以根據不同的錯誤資訊提示已經不同的錯誤情況

對錯誤的原因進行快速的定位,并能快速的找到與之對應的解決方法. 當然,單單看看文章是不足以完全掌握其中