tnsping 可以 sqlplus 報錯 ORA-12514

xz43發表於2011-04-27
使用Oracle客戶端的Net Configuration Assistant,在本地配置了一個tns連線一個遠端的資料庫,名稱為romotedb。
 
然後透過tnsping該remotedb,連線成功。
 
想當然的使用sqlplus來連線remotedb,結果報錯:
 
ERROR:
ORA-12514: TNS: 監聽程式當前無法識別連線描述符中請求的服務
很是奇怪!
 
參考網上很多類似錯誤的解決方案,登入到遠端資料庫,透過 lsnrctl status 命令檢視當前 監聽情況,發現這裡提供的service裡面,並沒有我前面配置 remotedb 時指定的 SERVICE_NAME ,馬上改掉本地 remotedb的 SERVICE_NAME 為遠端提供的 service,tnsping 和 sqlplus 都可以正常連線。

上面的問題,是因為資料庫系統能根據提供的例項名(原來的SERVICE_NAME)去找到了相應的主機,故 tnsping 能通,但是根據 tns指定的SERVICE_NAME 沒有找到相應的服務名,所有在建立連線的時候報錯了。

在這裡,提一下比較容易弄混淆的概念,服務名、例項名和資料庫名:
(1)服務名(service_names):指listener提供的對外的服務名,客戶端可以透過配置tnsnmaes.ora進行連線,tnsnmaes.ora檔案中的service_name要等於伺服器端listener所註冊的服務名,服務名可以透過輸入lsnrctl後,在輸入service檢視,一般的service_name在listener.ora檔案中配置(靜態註冊),或者當沒有listener.ora檔案時,在初始化檔案中配置instance_name和service_names這2個引數進行動態註冊。但是無論採用那種註冊方式,都可以透過lsnrctl-sevice來檢查。

(2)例項名(instance_name):oracle啟動instance後,即啟動oracle的記憶體程式,這個記憶體程式的名稱。在unix或者linux環境可以透過ps -ef |grep ora_看到啟動的程式。instance_name由環境變數決定,一個只裝oracle軟體,沒有建庫的例項(即沒有初始化檔案,沒有控制檔案,沒有資料檔案,沒有redolog),可以用rman來啟動,啟動後select instance_name from v$instance;這個時候我們可以看到instance_name和在環境變數裡面配置的ORACLE_SID是同樣的名稱。(注:正是由於這個原因,我們一般說的SID就是instance_name,但是需要注意的是,實際上instance_name不等於ORACLE_SID。前者是資料庫層面的概念,後者是作業系統中環境變數的設定。)

(3)資料庫名(db_name):這個是在資料庫建立的時候確定的:
CREATE DATABASE db_name
CONTROLFILE REUSE
MAXINSTANCES 32
MAXLOGHISTORY 0
……

該資訊存在於初始化檔案,控制檔案等地方。

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

相關文章