今天在windows server 2012上安裝了一個oracle 11g的數據庫,但是安裝 完成以後發現在我的機器上訪問數據庫出現錯誤,ora-12541:TNS:無監聽程序。
後來查詢了很多資料,加上借鑑師兄的博客,我知道了問題的所在,今天拿出來分享一下:
具體操作步驟如下:
1.下載plsql,安裝.
2.下載Instant Client,點擊下載,下載第一個basic就行了,下載完解壓縮,以放到主win7 d盤根目錄為例:d:\instantclient_11_2
3.在d:\instantclient_11_2新建tnsnames.ora,用記事本編輯.
4.到server 2012的oracle安裝目錄找到 …\app\admin\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora,打開,比如數據庫實例是orcl,找到如下代碼,拷貝到本機d:\instantclient_11_2\tnsnames.ora裏
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = server 2012 IP)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
5.添加一個環境變量,名為TNS_ADMIN,值為tnsnames.ora文件所在路徑d:\instantclient_11_2\tnsnames.ora,plsql通過這個找到orcl連接字符串
6.添加一個環境變量NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16GBK
7.打開PLSQL,不用登陸,工具-首選項-ORACLE-連接:
勾選檢查連接
Oracle主目錄: d:\instantclient_11_2
OCI庫: d:\instantclient_11_2\oci.dll
經過以上幾步之後,重啓PLSQL,問題來了,報錯:ora-12541:TNS:無監聽程序. ping是可以ping得通的,server 的監聽也開着.經過不懈的努力,多次試驗終於解決了:
1網絡連接IPV4設置靜態IP
IP地址:192.168.1.111 (111可修改成自己的 1-255)
子網掩碼:255.255.255.0
默認風頭:192.168.1.1
首選DNS服務器:192.168.1.1
修改完記得主win7上 ping 192.168.1.111 ping得通再繼續往後.
2.修改..\app\admin\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora
SID_NAME = CLRExtProc 改為 SID_NAME = orcl orcl是實例名
HOST = localhost 改為 HOST = 192.168.1.111
3.修改..\app\admin\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora
兩處 HOST = localhost 改為 HOST = 192.168.1.111
SID = CLRExtProc 改為 SID = orcl
好了,重啓oracle,監聽,主win7上的plsql就可以遠程連接虛擬機上的數據庫了.
下面供大家參考:
排查問題:在服務端機器上
1.首先檢查監聽程序是否能正常啓動,開始,運行 cmd--->lsnrctl start,檢查監聽是否是在正常運行,如果正常運行,會提示:TNS-01106: 使用名稱LISTENER的監聽程序已經啓動。如果沒有運行,用上面的命令啓動監聽程序。
2.還在命令提示行裏用 tnsping 服務名 ,來檢查tnsnames.ora服務配置是否正確。正確的提示例如:
已使用 TNSNAMES 適配器來解析別名
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = 192.168.0.6)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = 服務名)))
OK (50 毫秒)
命令1: tnsping orcl (ping 本地的orcl,)
結果:已使用 TNSNAMES 適配器來解析別名
嘗試連接 (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 152
1)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl1)))
OK (0 毫秒)
其中:(HOST = localhost) 監聽器是這麼解析的
命令2:tnsping 159.156.1.207/orcl1(加上本地ip來ping本地實例)
結果:已使用 EZCONNECT 適配器來解析別名
嘗試連接 (DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=orcl1))(ADDRESS=(PROTOCOL=TCP)
(HOST=159.156.1.207)(PORT=1521)))
TNS-12541: TNS: 無監聽程序
其中:(HOST=159.156.1.207)監聽器是這麼解析的
錯誤就在這裏了,按常理來説,localhost和159.156.1.207(本機IP)應該是同樣可行的,但是oracle監聽器解析時就是沒能正確通過。
解決辦法:先是嘗試修改監聽器配置文件:tnsnames.ora中的配置,但是均告失敗
最後,打開Oracle 自己的工具:Net Configuration Assistant 將原來的監聽器重新配置一遍,走流程不修改,直到完成。重新啓動監聽器,測試加ip來ping實例,正常通過
結果:已使用 EZCONNECT 適配器來解析別名
嘗試連接 (DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=orcl1))(ADDRESS=(PROTOCOL=TCP)
(HOST=159.156.1.207)(PORT=1521)))
OK (0 毫秒)
結論:成功解決了數據庫遠程連接問題,問題原因我猜想是ORACLE的監聽器沒能正確的映射本機IP和loaclhost,導致報錯,通過重新配置監聽器,就將IP和localhost正確的映射了