花一天半的時間解決客戶端連接服務端的oracle數據庫,無法連接問題。ORA-01034: ORACLE not available(Oracle 不存在),ORA-27101: shared memory realm does not exist 分析:
前幾天還可以連接數據庫,但是昨天開始,本地無緣無故的不能連接服務端數據庫。網上很多人說造成這個問題的原因是異常關機
,數據庫沒有在關機之前關閉。我公司人說在前幾天確實有人重啟過電腦,就當是這個原因吧,有時間一定要把真正原因找出來。
下面主要的任務還是解決問題先。遇到問題的詳細過程:
通過plsql訪問數據報錯:ORA-01034: ORACLE not available(Oracle 不存在),ORA-27101: shared memory realm does not
exist(共享內存領域不存在);通過程序登錄同樣報這個錯誤。
遇到這種問題,大部分人第一步想到的是檢查服務端配置文件是否有問題,所以打開你的Oracle安裝路徑(這裡必須是服務端的,
因為服務端才有監聽文件listener.ora,客戶端只有sqlnet.ora和tnsnames.ora兩個文件)主目錄下面的Admin文件夾有三個文件(
我的服務端安裝路徑是:E:\opt\oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN) ,分別是:listener.ora和sqlnet.ora和
tnsnames.ora。打開sqlnet.ora和tnsnames.ora 匹配本地(就是你本地的Oracle客戶端主目錄)的兩個文件sqlnet.ora和
tnsnames.ora,檢查兩個tnsnames.ora的ip和prot是否一致,必須要相同。下面本人分享下本人能正常訪問的,服務端和客戶端兩
個文件全部的參數配置 分別是本地:sqlnet.ora本地:tnsnames.ora 服務端:sqlnet.ora 服務端:tnsnames.ora 如下:
本地客戶端sqlnet.ora 配置文件全部copy如下:
SQLNET.AUTHENTICATION_SERVICES= (NTS)
服務端sqlnet.ora 配置文件全部copy如下:
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)
ADR_BASE = E:\opt\oracle\product\11.2.0\dbhome_1\log
本地客戶端tnsnames.ora和服務端tnsnames.ora也是一樣的:tnsnames.ora配置文件全部copy如下:
# tnsnames.ora Network Configuration File: C:\instantclient_12_1\tnsnames.ora
# Generated by Oracle configuration tools.
CCNF2008 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 180.166.155.134)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ccnf_2008)
)
)
前面打星號的可以忽略。CCNF2008是本地客戶連接數據庫的別名,plsql登錄的入口的,數據庫輸入框就是填寫它了。prot=1521不
用多說。SERVICE_NAME的值就是ccnf_2008 是你在服務端實例化出來的數據庫名稱。其他參數照搬。
服務端的listener.ora文件全部copy下面如下:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ccnf_2008)
(ORACLE_HOME = E:\opt\oracle\product\11.2.0\dbhome_1)
(SID_NAME = ccnf_2008)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =180.166.155.134)(PORT = 1521))
)
ADR_BASE_LISTENER = E:\opt\oracle\product\11.2.0\dbhome_1\log
檢查完上面三個文件ip,端口,和其他參數都匹配就可以排除不是配置文件原因。
排除配置文件原因後,需要用netmanager管理器使用用戶測試連接是否成功,如果用戶登錄測試成功,在外網telnet ip+端口命令
連接失敗,說明是網絡端口沒有對外開放,需要建立端口1521的出入站規則。如果還不行,進入cmd,命令:lsnrctl stop 停止監
聽,再次重啟監聽:lsnrctl start; 再進入sql操作:sqlplus /nolog執行,在執行 conn / as sysdba 以管理員身份連接數據
庫 startup 啟動數據庫,如果已經啟動先 卸載數據shutdowm immediate 關閉數據庫,再startup。再次在外網telnet ip +端口,
如果還不行就:來源網絡查找:http://blog.csdn.net/inthirties/article/details/4558769最後面的方法
1. 打開注冊表
2. 找到[HKEY_LOCAL_MACHINESOFTWAREORACLEKEY_OraDb10g_home1]這個目錄
在其下加入一個字符串值
鍵:USE_SHARED_SOCKET
值: TRUE
3. 重啟監聽服務
如果上面步驟還不行,估計最有可能的原因就是ip和機器名和127.0.0.1這個區別問題。所以請在C:\Windows\System32\drivers
\etc ,打開hosts文件,添加一個映射。 127.0.0.1 ip地址。設置完成映射後,重啟監聽、startup數據庫。本人就是通過這個
步驟解決問題的。
呵呵,問題一定出現在你的某個函數(可能其它函數都能正常的執行關閉)沒能正常的關閉你的連接。
你最好檢查你的關閉連接時的異常處理邏輯是否存在著缺陷。。
我也碰到過這樣的問題,可能是登錄數據庫後,不正常的退出,比如直接關掉窗口,而這時數據庫裡有未完成的動作,再次登錄時就會提示“insufficient privileges”的報錯,SQL>shutdown immediate; SQL>startup;就恢復正常了。