天天看點

【SDE錯誤收集】Oracle用戶端sqlplus連接配接伺服器端報錯ORA -01034和ORA-27101

一、問題描述:

采用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)