配置ORACLE 客戶端連接到數據庫


--=================================

-- 配置ORACLE 客戶端連接到數據庫

--=================================

 

    Oracle 客戶端連接到Oracle 數據庫服務器貌似不同於SQL serve中的網絡配置,其實不然,只不過所有的SQL server 運行於Windows平台,故很多配置直接集成到了操作系統之中。所以無需配置客戶端即可連接到服務器。Oracle 客戶端連接到數據庫依賴於Oracle Net。Oracle提供了很多基於客戶端或服務器的配置工具,需要搞清的是Oracle Net 中的相關術語。術語明白了,其實配置方法與SQL server 大同小異。

 

一、什么是Oracle Net

    Oracle Net 用於客戶端和服務器之間創建一個連接會話,並負責維護該會話。

    Oracle Net 在客戶端作為應用程序的一個后台進程組件,而在服務器端則包含稱為偵聽器的活動進程,

負責客戶端和服務器之間的交互。

    Oracle Net 同時也支持異構數據庫的連接,如連接到Sybase,Informix,DB2,SQL Server等

    通常基於下列配置來實現

        網絡配置(網絡必須是聯通的)

        節點所在的位置(IP/Hostname)

        應用程序

        所使用的協議(TCP/IP、/TCP/IP with SSL、SDP、Named Pipes)

       

    Oracle Net支持的連接類型

        客戶端-服務器模式(如SQLPlus)

        Java 應用程序(JDBC等)

        Web 客戶端應用程序

使用基於Web的應用程序(App Server)作為中間件來實現,可以配置JDBC Oracle Call Interface (OCI) driver 或thin JDBC driver

            通過HTTP直接連接到Oracle 服務器,如OEM

           

   

    Oracle Net實現機制

        用戶發出連接請求實現與用戶進程進行交互

        用戶進程通過Oracle Net 來與服務器進程交互

        服務器進程則與實例進行交互(由Oracle Net維護)

        實例通過后台進程交互來完成數據庫的讀寫操作

   

    Oracle Net 連接方式

        本地客戶端連接的數據庫(即客戶端與數據庫位於同一台服務器)。

            本地連接同樣使用到了Oracle Net,因為任何與數據的交互都通過Oracle Net來完成。

不需要使用到Listener,因為本地連接使用的是IPC協議,而IPC協議允許主機內進程間相互通信,由操作系統提供。

            本地連接不需要進行任何配置,且本地服務器上可以運行若干個實例。

            本地連接是唯一一個不需要偵聽器的連接類型。

            連接方法:CONNECT username/password

           

        所有非本地客戶端連接到數據庫

            服務器端啟用Listener進程

            客戶端通過TNSNAME或Easy connect或LDAP等名稱解析方式來解析連接字符串

            一旦連接成功,即是Listener服務停止,不影響該會話。

               

    Oracle Net Listener(偵聽器)

        運行於服務器端,用於偵聽所有來自客戶端的連接請求,並提供處理數據庫服務方面的請求

            位置:$ORACLE_HOME/network/admin/listerer.ora

 --對應於netmgr中(GUI界面)的Listeners項下建立的缺省偵聽器(Listener)

                  $ORACLE_HOME/network/admin/sqlnet.ora  

 --對應於netmgr中(GUI界面)的Profile

        服務器端配置tnsnames

            位置:ORACLE_HOME/network/admin/tnsnames.ora

--對應於netmgr中(GUI界面)的Service Naming

        Listener提供的信息包括,IP地址、端口號、協議、服務名(service_name)等

        一個Listener能夠為多個數據庫實例提供服務

 

二、客戶端到服務器建立會話的過程及相關術語

    執行如下的命令來建立連接

        SQL> CONNECT username/password@net_service_name  

       

        連接字符串(connect string):username/password@net_service_name

包含了用戶名、密碼、連接標識符

            如:SQL> conn scott/tiger@orcl

            字符串分解

                用戶名scott

                密碼為tiger

                "/"    用於分割用戶與密碼

                "@"   指示網絡連接所需的用戶進程

                orcl  連接標識符

       

        連接標識符(connect identifier)

            @后面的即為連接標識符,如上例中的orcl。

            連接標識符的名字是一個映射到連接描述符的簡化

            連接標識符可以為網絡服務名/別名、數據庫服務名等

(net service name, database service name, or net service alias.)

           

        連接描述符(connect discriptor)

            使用一種特殊格式來描述連接的具體信息,信息包含了、數據庫所在的位置(IP地址)、

服務名、端口號等

            如tnsnames中的:

            orcl =  --網絡服務名,數據庫別名,等同於連接標識符(屏蔽客戶端如何連接到服務器端的細節)

              (DESCRIPTION =           

                (ADDRESS_LIST =

                  (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.128)(PORT = 1521))

--IP地址,端口號,協議

                )

                (CONNECT_DATA =

                  (SERVICE_NAME = orcl.robinson.com)  --服務名

                )

              )

            以上所有DESCRIPTION內的信息即為連接描述信息

            描述符之上等於號左邊的可以為網絡服務名,網絡服務別名等,此等同於連接標識符。

           

        服務名(service_name)

客戶端連接到實例的服務名,可以為該參數指定一個或多個服務名。該參數從9i引入,service_name通常可以使用SID代替。

9i之后,Oracle推薦使用service_name而不是SID。可以通過定義多不不同的服務名來區分不同的用戶連接,該參數缺省的格式為db_name.domain_name。

實例將所定義的服務名注冊到偵聽器,當客戶端請求服務時,偵聽器根據服務名決定將使用哪個實例提供所請求的服務並與之建立連接

            基於相同的數據庫可以定義多不不同的服務名來區分不同的使用情況

            如定義service_name為

                service_names = sales.robinson.com,hr.robinsn.com

            則sales部門通過sales服務名來建立連接,hr部門通過hr服務名來建立連接,

而無須關心連接的是哪一個數據庫。

       

        演示連接過程(非本地連接)

            環境:服務器為RHEL 5 + Oracle 10g ,客戶端Winxp + 10g Client

            查看服務器listener是否啟動

            [oracle@robinson admin]$ lsnrctl   --啟動lsnrctl 偵聽器程序

 

            LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 03-SEP-2010 13:31:06

 

            Copyright (c) 1991, 2005, Oracle.  All rights reserved.

 

            Welcome to LSNRCTL, type "help" for information.

 

            LSNRCTL> status      --查看偵聽器狀態,偵聽器沒有啟動

            Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

            TNS-12541: TNS:no listener

             TNS-12560: TNS:protocol adapter error

              TNS-00511: No listener

               Linux Error: 111: Connection refused

              

            --啟動缺省的偵聽器

            --在下面列出的信息中沒有偵聽器的路徑及listener.ora文件,此處listener.ora 不存在

            LSNRCTL> start    

            Starting /u01/app/oracle/10g/bin/tnslsnr: please wait...

 

            TNSLSNR for Linux: Version 10.2.0.1.0 - Production

            Log messages written to /u01/app/oracle/10g/network/log/listener.log

            Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=robinson.com)(PORT=1521)))

                               

            Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

            STATUS of the LISTENER

            ------------------------

            Alias                     LISTENER

            Version                   TNSLSNR for Linux: Version 10.2.0.1.0 - Production

            Start Date                03-SEP-2010 13:31:14

            Uptime                    0 days 0 hr. 0 min. 0 sec

            Trace Level               off

            Security                  ON: Local OS Authentication

            SNMP                      OFF

            Listener Log File         /u01/app/oracle/10g/network/log/listener.log

            Listening Endpoints Summary...

              (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=robinson.com)(PORT=1521)))

            The listener supports no services

            The command completed successfully

 

            LSNRCTL> service  --已經看到了已注冊的實例信息,因為10g支持動態注冊

            Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))

            Services Summary...

            Service "orcl.robinson.com" has 1 instance(s).

              Instance "orcl", status READY, has 1 handler(s) for this service...

                Handler(s):

                  "DEDICATED" established:0 refused:0 state:ready

                     LOCAL SERVER

            Service "orclXDB.robinson.com" has 1 instance(s).

              Instance "orcl", status READY, has 1 handler(s) for this service...

                Handler(s):

                  "D000" established:0 refused:0 current:0 max:1022 state:ready

                     DISPATCHER <machine: robinson, pid: 3246>

                     (ADDRESS=(PROTOCOL=tcp)(HOST=robinson.com)(PORT=51473))

            Service "orcl_XPT.robinson.com" has 1 instance(s).

              Instance "orcl", status READY, has 1 handler(s) for this service...

                Handler(s):

                  "DEDICATED" established:0 refused:0 state:ready

                     LOCAL SERVER

            The command completed successfully 

 

            --查看客戶端tnsnames.ora的信息

            C:/>type F:/oracle/product/10.2.0/client_1/NETWORK/ADMIN/tnsnames.ora

            # tnsnames.ora Network Configuration File: F:/oracle/product/10.2.0/client_1/NET

            WORK/ADMIN/tnsnames.ora

            # Generated by Oracle configuration tools.

            orcl =

              (DESCRIPTION =

                (ADDRESS_LIST =

                  (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.128)(PORT = 1521))

                )

                (CONNECT_DATA =

                  (SERVICE_NAME = orcl.robinson.com)

                )

              )

            C:/>sqlplus /nolog

 

            SQL*Plus: Release 10.2.0.1.0 - Production on 星期五9月3 13:42:02 2010

 

            Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

            SQL> conn scott/tiger@orcl

            Connected.

            --將tnsnames.ora中服務別名改為oral后再連接,可以正常連接,即網絡服務名可以隨便取。

            SQL> conn system/redhat@oral

            Connected.

           

            --查看數據庫中的服務名         

            SQL> show parameter service_names;

 

            NAME                                 TYPE        VALUE

            ------------------------------------ ----------- --------------------------

            service_names                        string      orcl.robinson.com

           

三、服務注冊與名稱解析         

   

    服務注冊(service registration)

        實例將數據庫將所提供的服務名及相關信息告知listener的過程稱之為服務注冊

        注冊通常包含下列信息

            數據庫的服務名

            實例名

            可用的服務處理程序(service handlers),用於調度(共享模式)和派生子程序(專用模式)

            端口號等

       

        注冊方法

            靜態注冊: 指將實例的相關信息手動告知listener偵聽器,可以使用netmgr,netca,oem以及直接vi listener.ora文件來實現

                --下面是通過netmgr配置后產生的listener.ora文件的內容

                [oracle@robinson ~]$ cat $ORACLE_HOME/network/admin/listener.ora

                # listener.ora Network Configuration File: /u01/app/oracle/10g/network/admin/listener.ora

                # Generated by Oracle configuration tools.

 

                SID_LIST_LISTENER =       -->這里定義LISTENER進程提供的數據庫服務列表

                  (SID_LIST =

                    (SID_DESC =

                      (GLOBAL_DBNAME = orcl.robinson.com)

                      (ORACLE_HOME = /u01/app/oracle/10g)

                      (SID_NAME = ORCL)

                    )

                  )

 

                LISTENER =               -->監聽器的名字,一台數據庫可以有多個監聽器

                  (DESCRIPTION =

                    (ADDRESS = (PROTOCOL = TCP)(HOST = robinson)(PORT = 1521))

                  )

                 

動態注冊:實例在啟動時使用PMON進程自動將instance_name和service_names等信息注冊到已啟動的缺省偵聽器listener.ora,在9i之后,不需要任何配置即可實現動態注冊.實例啟動后會自動在本地主機默認的號端口上查找偵聽器,並在查找到時進行注冊

                可以在實例啟動后的任何時間段執行下面命令實現重新注冊

                    alter system register;

                   

                    如果偵聽器在非默認端口上運行,可以通過設置local_listener參數來制定偵聽器所在的位置並手動進行注冊

                    SQL> alter system set local_listener = 'list2';

                    SQL> alter system register;

                   

                建議配置兩個參數保證成功注冊:service_names,instance_name

                    service_names缺省為global database name

                    alter system set service_names = 'testdb.robinson.com' scope =spfile;

                    alter system set instance_name = 'testdb' scope = spfile;

           

                --下面啟動缺省的偵聽器來實現動態注冊

                [oracle@robinson ~]$ lsnrctl start

 

                LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 03-SEP-2010 16:30:04

 

                Copyright (c) 1991, 2005, Oracle.  All rights reserved.

 

                Starting /u01/app/oracle/10g/bin/tnslsnr: please wait...

 

                TNSLSNR for Linux: Version 10.2.0.1.0 - Production

                System parameter file is /u01/app/oracle/10g/network/admin/listener.ora

                Log messages written to /u01/app/oracle/10g/network/log/listener.log

                Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=robinson.com)(PORT=1521)))

 

                Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=robinson)(PORT=1521)))

                STATUS of the LISTENER

                -----------------------------部分信息省略---------------------------------------

               

                Listener Parameter File   /u01/app/oracle/10g/network/admin/listener.ora

                Listener Log File         /u01/app/oracle/10g/network/log/listener.log

                Listening Endpoints Summary...

                  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=robinson.com)(PORT=1521)))

                Services Summary...

                Service "orcl.robinson.com" has 1 instance(s).

--啟動了orcl.robinson.com服務且為靜態注冊

                  Instance "ORCL", status UNKNOWN, has 1 handler(s) for this service...

                The command completed successfully

 

                [oracle@robinson ~]$ export ORACLE_SID=testdb  --設置ORACLE_SID並啟動testdb

                [oracle@robinson ~]$ sqlplus /nolog

 

                SQL*Plus: Release 10.2.0.1.0 - Production on Fri Sep 3 16:33:00 2010

 

                Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

                SQL> conn / as sysdba

                Connected to an idle instance.

                SQL> startup

                ORACLE instance started.

 

                Total System Global Area  469762048 bytes

                Fixed Size                  1220048 bytes

                Variable Size             138412592 bytes

                Database Buffers          327155712 bytes

                Redo Buffers                2973696 bytes

                Database mounted.

                Database opened.

 

                SQL> ho lsnrctl status     --再次查看偵聽器的狀態

                                           --可以看到testdb已經被動態注冊

                LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 03-SEP-2010 16:34:06

 

                Copyright (c) 1991, 2005, Oracle.  All rights reserved.

 

                Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=robinson)(PORT=1521)))

                STATUS of the LISTENER

                -----------------------------部分信息省略---------------------------------------

                Services Summary...

                Service "orcl.robinson.com" has 2 instance(s).

                  Instance "ORCL", status UNKNOWN, has 1 handler(s) for this service...

                Service "orclXDB.robinson.com" has 1 instance(s).

                Service "orcl_XPT.robinson.com" has 1 instance(s).

                Service "testdb" has 1 instance(s).    --下面是和testdb相關的服務名,實例名

                  Instance "testdb", status READY, has 1 handler(s) for this service...

                Service "testdb.robinson.com" has 1 instance(s).

                  Instance "testdb", status READY, has 1 handler(s) for this service...

                Service "testdbXDB" has 1 instance(s).

                  Instance "testdb", status READY, has 1 handler(s) for this service...

                Service "testdb_XPT" has 1 instance(s).

                  Instance "testdb", status READY, has 1 handler(s) for this service...

                The command completed successfully             

 

                SQL> conn scott/tiger@192.168.1.128/testdb.robinson.com                                     Connected.  --動態注冊testdb,Win客戶端可以正常連接

                SQL> conn system/redhat@orcl         --原來靜態注冊的orcl也可以正常連接

                Connected.

               

                --注意服務名中有些狀態為UNKNOWN,有些為READY

                --對於動態注冊的服務名,因為監聽器知道實例的狀態,所以正常狀態通常顯示為READY。

                --對於靜態注冊的服務名,通常顯示為UNKNOWN。

               

        當客戶端的請求到達listener時,listener選擇一個合適的service handler為之服務。

之后listener就不再參與相關處理。

       

        對於受限模式的實例,PMON阻塞所有到實例的連接。當客戶端嘗試連接將收到如下錯誤信息:

            ORA-12526:TNS:listener: all appropriate instances are in restricted mode

            ORA-12527: TNS:listener: all appropriate instances are in restricted mode or blocking new connections

       

            C:/Documents and Settings/Robinson Cheng>sqlplus scott/tiger@orcl

 

            SQL*Plus: Release 10.2.0.1.0 - Production on 星期三9月1 17:14:41 2010

 

            Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

            ERROR:

            ORA-12526: TNS:listener: all appropriate instances are in restricted mode

       

        動態注冊時的幾個常用參數以及需要$ORACLE_HOME目錄

            SQL> select name,value,isdefault from v$parameter

              2  where name in ('instance_name','db_domain','service_names');

 

            NAME                      VALUE                          ISDEFAULT

            ------------------------- ------------------------------ ---------

            db_domain                 robinson.com                   FALSE

            instance_name             orcl                           FALSE

            service_names             orcl.robinson.com              FALSE

        

        更多關於動態注冊的更多描述:配置非默認端口的動態服務注冊

 

    名稱解析方式(Naming Method)

        用於客戶端連接到數據庫服務時如何解析連接字符串。連接字符串形式:c:/sqlplus scott/tiger@orcl

        常用的字符串解析方法

            Easy connect

                缺省的連接方式為Easy connect ,僅僅限制於使用TCP協議,不支持負載均衡

                不支持connect-time failover、source routing、load balancing

                SQL> connect username/password@host[:port][/service_name]

                C:/>sqlplus scott/tiger@192.168.192.128:1521/orcl

               

            Local naming(本地名稱解析)

                使用本地配置文件tnsnames.ora

                支持所有的Oracle Net 協議

                支持高級連接選項:connect-time failover、source routing、load balancing

                在服務器端缺省路徑為$ORACLE_HOME/network/admin

                tnsnames.ora可以使用TNS_ADMIN環境變量設定到任意位置

               

            Directory naming(目錄名稱解析)

                目錄名稱解析技術使得解析實現集中化管理,用戶會被指向一個解析別名的LDAP目錄服務器

                支持所有的Oracle Net協議及高級選項

               

            External Naming Method(外部名稱解析方式)

                第三方名稱解析方法如SUN的NIS等。

       

四、常用的配置文件

    ldqp.ora         -->用於配置LDAP目錄名稱解析

    cman.ora         -->用於配置Oracle 連接管理參數

    tnsnames.ora     -->用於配置本地客戶端或遠程客戶端的本地名稱解析

    listener.ora     -->用於配置偵聽器的相關注冊信息

    sqlnet.ora       -->用於配置服務器或客戶端所支持的解析方式

 

    netmgr(Net Manager)中的幾個配置模塊

        Profile 分支       -->對應於sqlnet.ora文件,可以設置客戶端和服務器端同時應用的Oracle選項

        Sevice Naming 分支 -->用於配置客戶端的名稱解析,對應於tnsnames.ora文件

        Listener 分支      -->用於配置服務器端的數據庫偵聽器,對應於listener.ora文件

 

五、偵聽器配置程序(lsnrctl) 及TNSPING命令  

    [oracle@robinson admin]$ lsnrctl

 

    LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 03-SEP-2010 21:30:52

 

    Copyright (c) 1991, 2005, Oracle.  All rights reserved.

 

    Welcome to LSNRCTL, type "help" for information.

 

    LSNRCTL> help   --使用help 查看lsnrctl 的擴展命令

    The following operations are available

    An asterisk (*) denotes a modifier or extended command:

 

    start               stop                status    -->停止、啟動、查看狀態等(常用)         

    services            version             reload             

    save_config         trace               spawn              

    change_password     quit                exit                

    set*                show*                  

   

    lsnrctl命令用法

        LSNRCTL> command [listener_name]

       

    lsnrctl命令演示參照前面例子中的使用

   

    tnsping命令用於測試網絡的可聯通性

        C:/>tnsping orcl

 

        TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 03-9月-

        2010 21:52:45

 

        Copyright (c) 1997, 2005, Oracle.  All rights reserved.

 

        Used parameter files:

        F:/oracle/product/10.2.0/client_1/network/admin/sqlnet.ora

 

        Used TNSNAMES adapter to resolve the alias

        Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)

        (HOST = 192.168.1.128)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = orcl.robin

        son.com)))

        OK (0 msec)

       

六、總結       

    1.客戶端連接時的五個重要參數:用戶名、密碼、IP地址、端口號、服務名

    2.從客戶端成功連接到數據庫服務器

        客戶端要求

            需要安裝適當的客戶端軟件(Oracle Client)

            正確配置sqlnet.ora  

                NAMES.DIRECTORY_PATH = (TNSNAMES,EZCONNECT ….)      

                SQLNET.AUTHENTICATION_SERVICES = (NTS)   關於認證方式,請參考:Oracle 密碼文件

                NAMES.DEFAULT_DOMAIN=robinson.com

--表示客戶端在請求連接時將設定的缺省值追加網絡服務名(net_service_name)之后

                    --如果db_domain為robinson.com,使用scott/tiger@orcl連接,則等同於使用scott@orcl.robinson.com進行連接

            正確配置tnsnames.ora

        服務器端要求

            listener已經啟動

            數據庫已經啟動

  

 

    3.手動配置listener.ora和tnsnames.ora

        配置tnsname.ora文件:

            可用的配置工具

                oracle Net Configuration Assistant(GUI)       -->實際上修改tnsnames.ora文件

                oracle Net Manager(GUI)                       -->實際上修改tnsnames.ora文件

               

        給出下面的示例:

            orcl =                                           -->網絡服務別名,可以修改,對應於連接標識符

              (DESCRIPTION =

                (ADDRESS_LIST =

                  (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.128)(PORT = 1521))

                )

                (CONNECT_DATA =

                  (SERVICE_NAME = orcl.robinson.com)

                )

              )

            紅色的內容為根據實際需要進行修改的內容,現描述如下:

            PROTOCOL:客戶端與服務器端通訊的協議,一般為TCP,該內容一般不用改。

HOST:數據庫偵聽所在的主機的主機機名或IP地址,通常數據庫偵聽與數據庫位於同一個機器上。建議使用IP地址。在UNIX或WINDOWS下可以使用hostname來獲得主機的機器名或使用ifconfig(UNIX)、ipconfgi(Windows)來獲得主機的IP地址。

            PORT:數據庫偵聽使用的端口,缺省為,可以查看服務器端的listener.ora文件獲得端口號

                  或在數據庫服務器命令提示符下使用nsrctl status [listener name]命令查看獲得端口號。

                  此處Port的值一定要與數據庫偵聽正在偵聽的端口一樣。

            SERVICE_NAME:在服務器端,使用sqlplus> show parameter service_name命令查看。

           

            上述配置時應保證客戶機能夠ping通服務器,之后可以使用

tnsping orcl(網絡服務名)來測試網絡的聯通情況

                SQL> conn scott/tiger@orcl

                Connected.

            使用上面的連接方式進行連接時,則連接標識符orcl被解釋為tnsnames.ora中orcl對應

的描述信息,根據描述信息來解析連接服務器

           

        配置listener.ora  -->同樣可以使用tnsnames.ora配置時所使用的GUI工具來完成

            給出下面的示例System parameter file is /u01/app/oracle/10g/network/admin/listener.ora

            LISTENER =

              (DESCRIPTION =

                (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.128)(PORT = 1521))

              )   --LISTENER部分描述了主機地址、端口及協議

           

            SID_LIST_LISTENER =

              (SID_LIST =

                (SID_DESC =

                  (GLOBAL_DBNAME = orcl1)

                  (ORACLE_HOME = /u01/app/oracle/10g)

                  (SID_NAME = ORCL)

                )

                (SID_DESC =

                  (GLOBAL_DBNAME = orcl2)

                  (ORACLE_HOME = /u01/app/oracle/10g)

                  (SID_NAME = ORCL)

                )

              )

           

            a. LISTENER部分描述了主機地址、端口及協議

            b. SID_LIST_LISTENER描述對外提供數據庫服務的列表

               兩個SID_DESC是對同一個SID數據庫設置的兩個service_names所設置的監聽服務

            啟動該Listener后的信息如下

                Services Summary...

                Service "orcl1" has 1 instance(s).

                  Instance "ORCL", status UNKNOWN, has 1 handler(s) for this service...

                Service "orcl2" has 1 instance(s).

                  Instance "ORCL", status UNKNOWN, has 1 handler(s) for this service...

                The command completed successfully

            配置客戶端的tnsnames.ora如下

                orcl1 =

                  (DESCRIPTION =

                    (ADDRESS_LIST =

                      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.128)(PORT = 1521))

                    )

                    (CONNECT_DATA =

                      (SERVICE_NAME = orcl1)

                    )

                  )

                 

                orcl2 =

                  (DESCRIPTION =

                    (ADDRESS_LIST =

                      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.128)(PORT = 1521))

                    )

                    (CONNECT_DATA =

                      (SERVICE_NAME = orcl2)

                    )

                  )

                 

            從客戶端進行連接     

                C:/>sqlplus /nolog

 

                SQL*Plus: Release 10.2.0.1.0 - Production on 星期六9月4 09:47:22 2010

 

                Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

                SQL> conn scott/tiger@orcl1

                Connected.

                SQL> conn scott/tiger@orcl2

                Connected.     

               

            注意:

                筆者首次連接時收到如下錯誤提示,將listener.ora中的SID_NAME的值改為小寫,即orcl,問題解決

                所以盡可能的統一大小寫。

                    SQL> conn scott/tiger@orcl1;    --下面是未統一大小寫時的錯誤提示

                    ERROR:

                    ORA-01034: ORACLE not available

                    ORA-27101: shared memory realm does not exis

                    Linux Error: 2: No such file or directory

                   

    4.關於GLOBAL_DBNAME

        下面是GLOBAL_DBNAME的官方描述

            GLOBAL_DBNAME

                Purpose        

    Use the parameter GLOBAL_DBNAME to identify the database service.

               

                While processing a client connection request, the listener tries to match the value of

                this parameter with the value of the SERVICE_NAME parameter in the client connect

                descriptor. If the client connect descriptor uses the SID parameter, then the listener

                does not attempt to map the values. This parameter is primarily intended for

                configurations with Oracle8 release 8.0 or Oracle7 databases (where dynamic service

                registration is not supported for dedicated servers). This parameter may also be

                required for use with Oracle9i and Oracle8 database services by some configurations

                and management tools.

               

                The value for this parameter is typically obtained from the combination of the DB_

                NAME and DB_DOMAIN parameters (DB_NAME.DB_DOMAIN) in the initialization

                parameter file, but the value can also contain any valid name used by clients to

                identify the service.

               

                Embed this parameter under the SID_DESC parameter.

               

        大致意思如下:

            當客戶端發出連接請求時,監聽器首先使用客戶端連接描述符中的SERVICE_NAME相匹配。

            如果客戶端連接描述符中使用的是SID,則不再嘗試匹配該值,而是對監聽器中設置的SID_NAME進行匹配

            該參數的值主要從初始化參數文件中的db_name和db_domian中組合得到。

       

        演示GOLBAL_DBNAME使用

            假定服務器listener.ora配置如下:

                SID_LIST_LISTENER =

                  (SID_LIST =

                    (SID_DESC =

                      (GLOBAL_DBNAME = orcl.robinson.com)

                      (ORACLE_HOME = /u01/app/oracle/10g)

                      (SID_NAME = orcl)

                    )

                  )

 

                LISTENER =

                  (DESCRIPTION =

                    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.128)(PORT = 1521))

                  )

                 

            客戶端的tnsnames.ora配置如下:

                orcl =

                  (DESCRIPTION =

                    (ADDRESS_LIST =

                      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.128)(PORT = 1521))

                    )

                    (CONNECT_DATA =

                      (SERVICE_NAME = orcl.robinson.com)

                    )

                  )

            且spfileorcl中db_domain為空值

                [oracle@robinson ~]$ strings $ORACLE_HOME/dbs/spfileorcl.ora | grep db_domain

                *.db_domain=''

           

            數據庫中的相關設置為空值

                SQL> col name format a20

                SQL> col value format a35

                SQL> select name,value,isdefault from v$parameter

                  2  where name in ('instance_name','db_domain','service_names');

 

                NAME                 VALUE                               ISDEFAULT

                -------------------- ----------------------------------- ---------

                db_domain                                                FALSE

                instance_name                                            FALSE

                service_names                                            FALSE 

               

            能夠成功連接

                SQL> conn system/redhat@orcl

                Connected.

            ------------------------------------------------------------------------------------------

            修改客戶端tnsnames.ora中的service_name項

                即去掉SERVICE_NAME = orcl.robinson.com這項內容且添加為SID = ORCL

            修改后的內容如下:

                ORCL =

                  (DESCRIPTION =

                    (ADDRESS_LIST =

                      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.128)(PORT = 1521))

                    )

                    (CONNECT_DATA =

                      (SID = ORCL)

                    )

                  )

               

            SQL> conn scott/tiger@orcl   --能夠成功連接

            Connected.

                   

        關於GOLBAL_DBNAME總結:

當客戶端使用的是SID連接參數,則匹配偵聽器配置文件中的SID_NAME項    (主要用於兼容以前的老版本,8i或更早版本)

否則當使用的是SERVICE_NAME,則匹配偵聽器配置文件中的SERVICE_NAME項 (現在多用SERVICE_NAME項)

轉:http://blog.csdn.net/leshami/article/details/5917103


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM