一、問題描述:
采用windows機器上的Oracle11g client連接配接AIX雙機熱備裡其中一台oracle伺服器,sqlplus報錯:
ORA -01034: ORACLE not available
ORA-27101:shared memory realm does not exist :
其實這個是orale的錯誤,隻是在使用sde直連oracle庫更新geodatabade的過程中遇到了,才記錄到這裡。
二、資訊記錄:
1、Windows用戶端tnsnames配置:
SDEClient =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.87.125.140)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = sde)
2、10.87.125.140機器上Oracle伺服器端
listener.ora:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /oracle_sde/oracle/products/11.1/db)
(PROGRAM = extproc)
(ENVS="EXTPROC_DLLS=/home/arcsde/sdeexe100/lib/libst_shapelib_64.so")
)
(SID_DESC =
(GLOBAL_NAME = sde.oracle.com)
(ORACLE_HOME = /oracle_sde/oracle/products/11.1/db)
(SID_NAME = sde)
)
)
tnsnames.ora:
SDE =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = TNMS_APP4_service)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = SDE.ORACLE.COM)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(CONNECT_DATA =
(SERVICE_NAME = PLSExtProc)
)
)
3、資料庫伺服器hosts檔案:
# 2000:1:1:1:209:6bff:feee:2b7f ipv6sample # ipv6 name/address
127.0.0.1 loopback localhost # loopback (lo0) name/address
10.87.125.139 TNMS_APP4_P_boot TNMS-APP4-P
10.87.125.140 TNMS_APP4_S_boot TNMS-APP4-S
10.87.125.141 TNMS_APP4_service
4、Oracle監聽狀态:
$ lsnrctl status
LSNRCTL for IBM/AIX RISC System/6000: Version 11.2.0.1.0 - Production on 11-OCT-2012 15:12:38
Copyright (c) 1991, 2009, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=0.0.0.0)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for IBM/AIX RISC System/6000: Version 11.2.0.1.0 - Production
Start Date 11-OCT-2012 03:41:21
Uptime 0 days 11 hr. 31 min. 17 sec
Trace Level off
Security ON: Local OS Authentication
SNMP ON
Listener Parameter File /oracle_sde/oracle/products//11.1/db/network/admin/listener.ora
Listener Log File /oracle_sde/oracle/products/diag/tnslsnr/TNMS-APP4-S/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "sde" has 1 instance(s).
Instance "sde", status UNKNOWN, has 1 handler(s) for this service...
Service "sde.oracle.com" has 1 instance(s).
Instance "sde", status READY, has 1 handler(s) for this service...
Service "sdeXDB.oracle.com" has 1 instance(s).
Instance "sde", status READY, has 1 handler(s) for this service...
The command completed successfully
$ netstat -na|grep 1521 |more
tcp4 0 0 10.87.125.141.1521 10.87.125.142.64643 ESTABLISHED
tcp4 0 0 10.87.125.141.1521 10.87.125.142.64644 ESTABLISHED
tcp4 0 0 10.87.125.141.1521 10.87.125.142.64837 ESTABLISHED
tcp4 0 0 *.1521 *.* LISTEN
tcp4 0 0 10.87.125.140.1521 10.87.125.140.46356 ESTABLISHED
tcp4 0 0 10.87.125.140.46356 10.87.125.140.1521 ESTABLISHED
f1000e000f50f408 stream 0 0 f1000a06c48aec20 0 0 0 /tmp/
.oracle/sEXTPROC1521
三、原因分析及解決
(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))表示監聽本機所有IP位址,從上面的對1521端口的監聽情況可以看到,雙機熱備的實體位址140和漂移位址141都被正确監聽了。
在資料庫伺服器上,無論是oracle使用者還是sde使用者,均能用sqlplus sde/sde登陸,也能用sqlplus sde/[email protected]正常登陸(在tnsnames.ora裡已經配好了sde這個net service name)
從上面的資訊可以看出,oracle的監聽是正常的,是以另外一個windows機器上的32位用戶端連不上oracle伺服器應該還是tnsnames的問題。
對比資料庫伺服器上的tnsnames和監聽,可以看到service name都用的是sde.oracle.com,而不是sde
sde.oracle.com 是配置的Globe_Name,是以我們在配置用戶端tnsnames的時候,也應該用這個:
SDEClient =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.87.125.140)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = sde.oracle.com)
)
)
是以既然資料庫裡啟用了GLOBE_NAME,那就不能直接用SID了。
附:關于GLOBAL_NAME
一個是GLOBAL_NAME,一個是GLOBAL_NAMES參數,GLOBAL_NAME是全局資料庫名,GLOBAL_NAMES參數設定是否啟用全局資料庫名。
GLOBAL_NAME的形式為:DB_NAME.DB_DOMAIN
修改global_name,隻能用ALTER DATABASE RENAME GLOBAL_NAME TO <db_name.db_domain>指令進行修改,然後修改相應參數。
SQL> select * from global_name; --檢視資料庫的global_name
GLOBAL_NAME
--------------------------------------------------------------------------------
ORCL.REGRESS.RDBMS.DEV.US.ORACLE.COM
SQL> alter database rename global_name to orcl.robinson.com; --修改資料庫的global_name
Database altered.
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------
ORCL.ROBINSON.COM
GLOBAL_NAMES參數通常對于分布式處理,Oracle 建議将該值設為TRUE,用于確定通連接配接到網絡環境使用一緻性的命名方式。
一般情況下假定全局資料庫的名稱為orcl.robinosn.com ,當GLOBAL_NAMES設定為true時,資料庫執行調用時會核查連結的名字是否和遠端
全局資料庫名稱一緻,否則如果為false,可以任意定義資料庫連結的名字。
假定遠端資料庫名稱為orcl.robinosn.com ,參數global_names設為true,則必須使用下面的方式來調用
select * from scott.[email protected].robinson.com
如果global_names設為false,則可以使用定義的任意名字來調用
select * from scott.[email protected]
SQL> show parameter global_names --檢視global_names參數的設定情況
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
global_names boolean FALSE
關于GLOBAL_NAMES更多參考:Oracle Database Administrator’s Guide(Distributed Database Concepts)