在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連接配接
出現連接配接方面的錯誤時,錯誤的原因和解決的方法,這樣,我們可以根據不同的錯誤資訊提示已經不同的錯誤情況
對錯誤的原因進行快速的定位,并能快速的找到與之對應的解決方法. 當然,單單看看文章是不足以完全掌握其中