1. 程式人生 > >Oracle的tnsnames.ora配置(PLSQL Developer)

Oracle的tnsnames.ora配置(PLSQL Developer)

好文章 pro base script 必須 第一步 單機 sys RoCE

    1. 首先打開tnsnames.ora的存放目錄,一般為D:\app\Administrator\product\11.2.0\client_1\network\admin,就看安裝具體位置了。

      技術分享圖片步驟閱讀
    2. 2

      使用editplus或者記事本或其他工具打開tnsnames.ora,進行編輯

      配置一下文件

      CONN_shenyi2 =

      (DESCRIPTION =

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

      (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = orcl)

      )

      )

      技術分享圖片步驟閱讀
    3. 3

      上邊的SERVICE_NAME 和HOST、PORT 改為自己的即可

      技術分享圖片步驟閱讀
    4. 4

      打開plsql,登陸

      技術分享圖片步驟閱讀
    5. 5

      登陸完成即可使用強大的plsql developer

      技術分享圖片步驟閱讀 http://jingyan.baidu.com/article/b0b63dbfcd34834a4930704a.html 222222222222222222222222222222222222222

      tnsnames.ora 監聽配置文件詳解

      今天是重要的一天。將XML數據導入ORACLE遇到很多問題,學了好多,其中很長時間花在網絡配置上,剛開始學,具體原因不知道,先把搜集到的好文章存下來,以後慢慢研究。

      監聽配置文件
      為了使得外部進程 如 CAMS後臺程序 能夠訪問 Oracle 數據庫 必須配
      置 Oracle 網絡服務器環境 配置 Oracle 網絡服務器環境是通過配置
      listener.ora sqlnet.ora 和 tnsnames.ora 共三個文件來進行的 listener.ora
      即監聽配置文件 在本小節說明 另兩個文件分別在隨後的兩個小節說明
      監聽配置文件 listener.ora 的存放路徑為 $ORACLE_HOME/network/admin
      以下是一個示例
      LISTENER = #監聽器名稱
      (DESCRIPTION_LIST =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
      )
      (ADDRESS_LIST =
      (ADDRESS =
      (PROTOCOL = TCP)
      (HOST = localhost.localdomain)
      (PORT = 1521))
      )
      )
      (DESCRIPTION =
      (PROTOCOL_STACK =
      (divSENTATION = GIOP)
      (SESSION = RAW)
      )
      (ADDRESS =
      (PROTOCOL = TCP)
      (HOST = localhost.localdomain)
      (PORT = 2481))

      )
      )

      SID_LIST_LISTENER = #命名規則 SID_LIST_+上面定義的監聽器名稱
      (SID_LIST =
      (SID_DESC =
      (SID_NAME = PLSExtProc1)
      (ORACLE_HOME = /u01/app/oracle/product/8.1.7)
      (PROGRAM = extproc)
      )
      (SID_DESC =
      (GLOBAL_DBNAME = cams)
      (ORACLE_HOME = /u01/app/oracle/product/8.1.7)
      (SID_NAME = cams)
      )
      (SID_DESC =
      (GLOBAL_DBNAME = oid)
      (ORACLE_HOME = /u01/app/oracle/product/8.1.7)
      (SID_NAME = oid)
      )
      )


      & 說明
      1 listener.ora 文件中定義一個監聽器 其缺省的名稱為 LISTENER
      這個監聽器缺省以tcp/ip為協議地址且端口號為1521運行 在CAMS應用中
      監聽文件定義的監聽器就使用這個缺省名字 並且使用缺省的協議 tcp/ip
      和缺省的端口號 1521 待配置好監聽文件以及隨後說明的 sqlnet.ora 和
      tnsnames.ora 文件之後 就可以用以下命令將監聽文件中定義的監聽器啟動
      起來
      $ lsnrctl start
      停止監聽器的命令為
      $ lsnrctl stop
      監測監聽器當前狀態的命令為
      $ lsnrctl status
      當 lsnrctl status 命令有如下輸出結果
      STATUS of the LISTENER
      ------------------------
      Alias LISTENER
      Version TNSLSNR for Linux: Version 8.1.7.4.0 - Production
      Start Date 17-JAN-2004 19:00:08
      Uptime 31 days 15 hr. 27 min. 59 sec
      就說明監聽器正在運行 否則說明監聽器已經停止了 CAMS 系統的後臺程
      序的正常運行不僅依賴於數據庫實例的運行 還依賴於這個數據庫監聽器的
      運行 假如監聽器沒有啟動 即使數據庫已經啟動 CAMS 後臺程序仍然不
      能正常工作
      2 如(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))所示的一個
      IPC 協議地址的監聽 是為了外部進程調用用的 在數據庫安裝時自動設定
      不需要改動

      3 在監聽文件後部還有一個 SID_LIST_LISTENER 段 該段用於定義監聽
      器的服務 即為哪些數據庫實例提供監聽服務 以 cams 實例為例 其對應的
      服務信息為
      (SID_DESC =
      (GLOBAL_DBNAME = cams) #數據庫名
      (ORACLE_HOME = /u01/app/oracle/product/8.1.7)
      (SID_NAME = cams) #數據庫實例名
      )


      1.2.5 sqlnet.ora 文件
      sqlnet.ora 文件的存放路徑為 $ORACLE_HOME/network/admin 以下是一
      個示例

      NAMES.DEFAULT_DOMAIN = localdomain
      NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)
      & 說明
      NAMES.DEFAULT_DOMAIN 指定網絡域名 NAMES.DIRECTORY_PATH
      指定當解析客戶端連接標識符時命名方法 naming metthods 采用的優先順
      序 從左至右遞減 在 CAMS 應用中 這兩個參數采用上述所示的系統缺
      省值


      1.2.6 tnsnames.ora 文件
      tnsnames.ora 文件的存放路徑為 $ORACLE_HOME/network/admin 以下
      是一個示例
      OID.LOCALDOMAIN =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT =
      1521))
      )
      (CONNECT_DATA =
      (SERVICE_NAME = oid)
      )
      )
      CAMS.LOCALDOMAIN =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT =
      1521))
      )
      (CONNECT_DATA =
      (SERVICE_NAME = cams)
      )
      )
      INST1_HTTP.LOCALDOMAIN =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT =

      1521))
      )
      (CONNECT_DATA =
      (SERVER = SHARED)
      (SERVICE_NAME = MODOSE)
      (divSENTATION = http://admin)
      )
      )
      EXTPROC_CONNECTION_DATA.LOCALDOMAIN =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
      )
      (CONNECT_DATA =
      (SID = PLSExtProc1)
      (divSENTATION = RO)
      )
      )
       

      & 說明
      tnsnames.ora 文件中定義一個或多個網絡服務 net service cams 實例對
      應的網絡服務為
      CAMS.LOCALDOMAIN =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS =
      (PROTOCOL = TCP)
      (HOST = localhost.localdomain)
      (PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVICE_NAME = cams)
      )
      )
      註意 這裏 ADDRESS項包含三個子參數

      PROTOCOL :默認協議TCP

      HOST :ip地址

      PORT:端口,默認1521

      CAMS.LOCALDOMAIN為數據名

      要確保在監聽文件中也有對應的一個 ADDRESS 項也包含同樣的三個子參
      數 並且子參數的值對應都相等 另外 這裏 SERVICE_NAME 的值必需確
      保與監聽文件中某 SID_DESC項下的 SID_NAME參數的值相等

      3333333333333333333333333333

      oracle網絡配置
      三個配置文件 listener.ora、sqlnet.ora、tnsnames.ora ,都是放在$ORACLE_HOME/network/admin目錄下。
      1. sqlnet.ora—–作用類似於linux或者其他unix的nsswitch.conf文件,通過這個文件來決定怎麽樣找一個連接中出現的連接字符串。
      例如我們客戶端輸入
      sqlplus sys/oracle@orcl
      假如我的sqlnet.ora是下面這個樣子
      SQLNET.AUTHENTICATION_SERVICES= (NTS)
      NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME)
      那麽,客戶端就會首先在tnsnames.ora文件中找orcl的記錄.如果沒有相應的記錄則嘗試把orcl當作一個主機名,通過網絡的途徑去解析它的 ip地址然後去連接這個ip上GLOBAL_DBNAME=orcl這個實例,當然我這裏orcl並不是一個主機名
      如果我是這個樣子
      NAMES.DIRECTORY_PATH= (TNSNAMES)
      那麽客戶端就只會從tnsnames.ora查找orcl的記錄,括號中還有其他選項,如LDAP等並不常用。
      2. Tnsnames.ora——這個文件類似於unix 的hosts文件,提供的tnsname到主機名或者ip的對應,只有當sqlnet.ora中類似
      NAMES.DIRECTORY_PATH= (TNSNAMES) 這樣,也就是客戶端解析連接字符串的順序中有TNSNAMES是,才會嘗試使用這個文件。
      PROTOCOL:客戶端與服務器端通訊的協議,一般為TCP,該內容一般不用改。
      HOST:數據庫偵聽所在的機器的機器名或IP地址,數據庫偵聽一般與數據庫在同一個機器上,所以當我說數據庫偵聽所在的機器一般也是指數據庫所在的機器。在UNIX或WINDOWS下,可以通過在數據庫偵聽所在的機器的命令提示符下使用hostname命令得到機器名,或通過ipconfig(for WINDOWS) or ifconfig(for UNIX)命令得到IP地址。需要註意的是,不管用機器名或IP地址,在客戶端一定要用ping命令ping通數據庫偵聽所在的機器的機器名,否則需要在 hosts文件中加入數據庫偵聽所在的機器的機器名的解析。
      PORT:數據庫偵聽正在偵聽的端口,可以察看服務器端的listener.ora文件或在數據庫偵聽所在的機器的命令提示符下通過lnsrctl status [listener name]命令察看。此處Port的值一定要與數據庫偵聽正在偵聽的端口一樣。
      SERVICE_NAME:在服務器端,用system用戶登陸後,sqlplus> show parameter service_name命令察看。
      ORCL 對應的本機,SALES對應的另外一個IP地址,裏邊還定義了使用主用服務器還是共享服務器模式進行連接
      #你所要連接的時候輸入得TNSNAME
      ORCL =
      (DESCRIPTION =
      (ADDRESS_LIST =
      #下面是這個TNSNAME對應的主機,端口,協議
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
      )
      (CONNECT_DATA =
      #使用專用服務器模式去連接需要跟服務器的模式匹配,如果沒有就根據服務器的模式自動調節
      (SERVER = DEDICATED)
      #對應service_name,SQLPLUS>;show parameter service_name; 進行查看
      (SERVICE_NAME = orcl)
      )
      )
      #下面這個類似
      SALES =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.188.219)(PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = sales)
      )
      )
      註意:如果數據庫服務器用MTS,客戶端程序需要用database link時最好明確指明客戶端用dedicated直連方式,不然會遇到很多跟分布式環境有關的ORACLE BUG。一般情況下數據庫服務器用直接的連接會好一些,除非你的實時數據庫連接數接近1000。
      3. listener.ora——listener監聽器進程的配置文件
      關於listener進程就不多說了,接受遠程對數據庫的接入申請並轉交給oracle的服務器進程。所以如果不是使用的遠程的連接,listener進程就不是必需的,同樣的如果關閉listener進程並不會影響已經存在的數據庫連接。
      Listener.ora文件的例子
      #listener.ora Network Configuration File: #E:/oracle/product/10.1.0/Db_2/NETWORK/ADMIN/listener.ora
      # Generated by Oracle configuration tools.
      #下面定義LISTENER進程為哪個實例提供服務 這裏是ORCL,並且它對應的ORACLE_HOME和GLOBAL_DBNAME 其中GLOBAL_DBNAME不是必需的除非
      #使用HOSTNAME做數據庫連接
      SID_LIST_LISTENER =
      (SID_LIST =
      (SID_DESC =
      (GLOBAL_DBNAME = boway)
      (ORACLE_HOME = E:/oracle/product/10.1.0/Db_2)
      (SID_NAME = ORCL)
      )
      )
      #監聽器的名字,一臺數據庫可以有不止一個監聽器
      #再向下面是監聽器監聽的協議,ip,端口等,這裏使用的tcp1521端口,並且使#用的是主機名
      LISTENER =
      (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521))
      )
      上面的例子是一個最簡單的例子,但也是最普遍的。一個listener進程為一個instance(SID)提供服務。
      監聽器的操作命令
      $ORACLE_HOME/bin/lsnrctl start,其他諸如stop,status等。具體敲完一個lsnrctl後看幫助。
      上面說到的三個文件都可以通過圖形的配置工具來完成配置
      $ORACLE_HOME/netca 向導形式的
      $ORACLE_HOME/netmgr
      本人比較習慣netmgr,
      profile 配置的是sqlnet.ora也就是名稱解析的方式
      service name 配置的是tnsnames.ora文件
      listeners配置的是listener.ora文件,即監聽器進程
      具體的配置可以嘗試一下然後來看一下配置文件。
      這樣一來總體結構就有了,是
      當你輸入sqlplus sys/oracle@orcl的時候
      1. 查詢sqlnet.ora看看名稱的解析方式,發現是TNSNAME
      2. 則查詢tnsnames.ora文件,從裏邊找orcl的記錄,並且找到主機名,端口和service_name
      3. 如果listener進程沒有問題的話,建立與listener進程的連接。
      4. 根據不同的服務器模式如專用服務器模式或者共享服務器模式,listener采取接下去的動作。默認是專用服務器模式,沒有問題的話客戶端就連接上了數據庫的server process。
      5. 這時候網絡連接已經建立,listener進程的歷史使命也就完成了。
      #—————
      幾種連接用到的命令形式
      1.sqlplus / as sysdba 這是典型的操作系統認證,不需要listener進程
      2.sqlplus sys/oracle 這種連接方式只能連接本機數據庫,同樣不需要listener進程
      3.sqlplus sys/oracle@orcl 這種方式需要listener進程處於可用狀態。最普遍的通過網絡連接。
      以上連接方式使用sys用戶或者其他通過密碼文件驗證的用戶都不需要數據庫處於可用狀態,操作系統認證也不需要數據庫可用,普通用戶因為是數據庫認證,所以數據庫必需處於open狀態。
      init.ora中的Remote_Login_Passwordfile對身份驗證的影響
      三個可選值:
      NONE:默認值,指示Oracle系統不使用密碼文件,通過操作系統進行身份驗證的特權用戶擁有SYSORA和SYSOPER權限
      EXCLUSIVE:
      1.表示只有一個數據庫實例可以使用密碼文件
      2.允許將SYSORA和SYSOPER權限賦值給SYS以外的其它用戶
      SHARED:
      1.表示可以有多個數據庫實例可以使用密碼文件
      2.不允許將SYSORA和SYSOPER權限賦值給SYS以外的其它用戶
      所以,如果要以操作系統身份登錄,Remote_Login_Passwordfile應該設置為NONE
      當登錄用戶不是ORA_DBA組和ORA_OPER組成員時,登錄數據庫需要在Oracle中創建當前操作系統用戶相同的用戶名,如果當前用戶是域用 戶,則名稱為:domainname/yourname,如果是本地計算機用戶,則名稱為:computername/yourname
      創建方法:
      create "domainname/yourname" identified externally;
      操作系統,修改HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/HOME0下面添加AUTH_PREFIX_DOMAIN,值設為FALSE,在創建Oracle用戶時可以忽略 掉域名
      這種方式下,init.ora中有一個參數將影響數據庫如何匹配一個windows用戶和Oracle用戶os_authent_prefix = ""
      缺省為空,Oracle8i以前,無該參數,而使用OPS$作為用戶名前綴.(Oracle用戶名最大長度限制為30個字符)
      關於域名(主機名)解析
      /etc/hosts (UNIX)
      或者windows/hosts(WIN98) winnt/system32/drivers/etc/hosts (WIN2000)
      客戶端需要寫入數據庫服務器IP地址和主機名的對應關系。
      127.0.0.1 localhost
      192.168.0.35 oracledb oracledb
      192.168.0.45 tomcat tomcat
      202.84.10.193 bj_db bj_db
      有些時候我們配置好第一步後,tnsping 數據庫服務器別名顯示是成功的,
      但是sqlplus username/password@servicename不通,jdbc thin link 也不通的時候,
      一定不要忘了在客戶端做這一步,原因可能是DNS服務器裏沒有設置這個服務器IP地址和主機名的對應關系。
      如果同時有私有IP和Internet上公有IP,私有IP寫在前面,公有IP寫在後面。
      編輯前最好留一個備份,增加一行時也最好用復制粘貼,避免編輯hosts時空格或者tab字符錯誤。
      UNIX下ORACLE多數據庫的環境,OS客戶端需要配置下面兩個環境變量
      ORACLE_SID=appdb;export ORACLE_SID
      TWO_TASK=appdb;export TWO_TASK
      來指定默認的目標數據庫
      #————-
      平時排錯可能會用到的
      1.lsnrctl status查看服務器端listener進程的狀態
      LSNRCTL>; help
      The following operations are available
      An asterisk (*) denotes a modifier or extended command:
      start stop status
      services version reload
      save_config trace change_password
      quit exit set*
      show*
      LSNRCTL>; status
      :em11:
      2.tnsping 查看客戶端sqlnet.ora和tnsname.ora文件的配置正確與否,及對應的服務器的listener進程的狀態。
      C:/>tnsping orcl
      TNS Ping Utility for 32-bit Windows: Version 10.1.0.2.0 – Production on 16-8月 –
      2005 09:36:08
      Copyright (c) 1997, 2003, Oracle. All rights reserved.
      Used parameter files:
      E:/oracle/product/10.1.0/Db_2/network/admin/sqlnet.ora
      Used TNSNAMES adapter to resolve the alias
      Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
      (HOST = 127.0.0.1)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_
      NAME = orcl)))
      OK (20 msec)
      3.
      SQL>;show sga 查看instance是否已經啟動
      SQL>; select open_mode from v$database; 查看數據庫是打開還是mount狀態。
      OPEN_MODE
      ———-
      READ WRITE
      使用hostname訪問數據庫而不是tnsname的例子
      使用tnsname訪問數據庫是默認的方式,但是也帶來點問題,那就是客戶端都是需要配置tnsnames.ora文件的。如果你的數據庫服務器地址發生改變,就需要重新編輯客戶端這個文件。通過hostname訪問數據庫就沒有了這個麻煩。
      需要修改
      服務器端listener.ora
      #監聽器的配置文件listener.ora
      #使用host naming則不再需要tnsname.ora文件做本地解析
      # listener.ora Network Configuration File: d:/oracle/product/10.1.0/db_1/NETWORK/ADMIN/listener.ora
      # Generated by Oracle configuration tools.
      SID_LIST_LISTENER =
      (SID_LIST =
      (SID_DESC =
      # (SID_NAME = PLSExtProc)
      (SID_NAME = orcl)
      (GLOBAL_DBNAME = boway)
      (ORACLE_HOME = d:/oracle/product/10.1.0/db_1)
      # (PROGRAM = extproc)
      )
      )
      LISTENER =
      (DESCRIPTION_LIST =
      (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
      )
      (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = boway)(PORT = 1521))
      )
      )
      客戶端sqlnet.ora 如果確認不會使用TNSNAME訪問的話,可以去掉TNSNAMES
      # sqlnet.ora Network Configuration File: d:/oracle/product/10.1.0/db_1/NETWORK/ADMIN/sqlnet.ora
      # Generated by Oracle configuration tools.
      SQLNET.AUTHENTICATION_SERVICES= (NTS)
      NAMES.DIRECTORY_PATH= (HOSTNAME)
      Tnsnames.ora文件不需要配置,刪除也無所謂。
      下面就是網絡和操作系統的配置問題了,怎麽樣能夠解析我的主機名的問題了
      可以通過下面的方式連接
      sqlplus sys/oracle@boway
      這樣的話,會連接boway這臺服務器,並且listener來確定你所要連接的service_name
      常見故障解決辦法:
      TNS-12154 (ORA-12154):TNS:could not resolve service name
      該錯誤表示用於連接的網絡服務名在tnsnames.ora文件中不存在,如上面的tnsnames.ora中的網絡服務名只有test,假如用戶在連接時用sqlplus system/manager@test1則就會給出TNS-12154錯誤。
      要註意的是,有時即使在tnsnames.ora文件中有相應的網絡服務名,可是用該網絡服務名連接時還會出錯,出現這種情況的典型配置如下(在客戶端的機器上):
      sqlnet.ora文件:
      NAMES.DIRECTORY_PATH = (TNSNAMES, ….)
      NAMES.DEFAULT_DOMAIN = server.com
      tnsnames.ora文件:
      test =
      (DESCRIPTION=
      (ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=testserver)(PORT=1521))
      )
      (CONNECT_DATA=(SERVICE_NAME=orcl.testserver.com)
      )
      )
      sql*plus運行基本機理:
      在用戶輸入sqlplus system/manager@test後,sqlplus程序會自動到sqlnet.ora文件中找NAMES.DEFAULT_DOMAIN參數,假如該參數存在,則將該參數中的值取出,加到網絡服務名的後面,即此例中你的輸入由sqlplus system/manager@test自動變為sqlplus system/[email protected] ,然後再到tnsnames.ora文件中找test.server.com網絡服務名,這當然找不到了,因為該文件中只有test網絡服務名,所以報錯。解決的辦法就是將sqlnet.ora文件中的NAMES.DEFAULT_DOMAIN參數註釋掉即可,如 #NAMES.DEFAULT_DOMAIN = server.com。假如NAMES.DEFAULT_DOMAIN參數不存在,則sqlplus程序會直接到tnsnames.ora文件中找 test網絡服務名,然後取出其中的host,port,tcp,service_name,利用這些信息將連接請求發送到正確的數據庫服務器上。
      另外原則上tnsnames.ora中的配置不區分大小寫,但是我的確遇到區分大小寫的情況,所以最好將使用的網絡服務與tnsnames.ora中配置的完全一樣。
      ORA-12514: TNS:listener could not resolve SERVICE_NAME given in connect Descriptor.
      該錯誤表示能在tnsnames.ora中找到網絡服務名,但是在tnsnames.ora中指定的SERVICE_NAME與服務器端的 SERVICE_NAME不一致。解決的辦法是修改tnsnames.ora中的SERVICE_NAME。
      易混淆術語介紹:
      Db_name:對一個數據庫(Oracle database)的唯一標識,該數據庫為Oracle database。這種表示對於單個數據庫是足夠的,但是隨著由多個數據庫構成的分布式數據庫的普及,這種命令數據庫的方法給數據庫的管理造成一定的負擔,因為各個數據庫的名字可能一樣,造成管理上的混亂。為了解決這種情況,引入了Db_domain參數,這樣在數據庫的標識是由Db_name和 Db_domain兩個參數共同決定的,避免了因為數據庫重名而造成管理上的混亂。這類似於互連網上的機器名的管理。我們將Db_name和 Db_domain兩個參數用’.’連接起來,表示一個數據庫,並將該數據庫的名稱稱為Global_name,即它擴展了Db_name。 Db_name參數只能由字母、數字、’_’、’#’、’$’組成,而且最多8個字符。
      Db_domain:定義一個數據庫所在的域,該域的命名同互聯網的’域’沒有任何關系,只是數據庫管理員為了更好的管理分布式數據庫而根據實際情況決定的。當然為了管理方便,可以將其等於互聯網的域。
      Global_name:對一個數據庫(Oracle database)的唯一標識,oracle建議用此種方法命令數據庫。該值是在創建數據庫是決定的,缺省值為Db_name. Db_domain。在以後對參數文件中Db_name與Db_domain參數的任何修改不影響Global_name的值,如果要修改 Global_name,只能用ALTER DATABASE RENAME GLOBAL_NAME TO 命令進行修改,然後修改相應參數。
      Service_name:該參數是oracle8i新引進的。在8i以前,我們用SID來表示標識數據庫的一個實例,但是在Oracle的並行環境中,一個數據庫對應多個實例,這樣就需要多個網絡服務名,設置繁瑣。為了方便並行環境中的設置,引進了Service_name參數,該參數對應一個數據庫,而不是一個實例,而且該參數有許多其它的好處。該參數的缺省值為Db_name. Db_domain,即等於Global_name。一個數據庫可以對應多個Service_name,以便實現更靈活的配置。該參數與SID沒有直接關系,即不必Service name 必須與SID一樣。
      Net service name:網絡服務名,又可以稱為數據庫別名(database alias)。是客戶端程序訪問數據庫時所需要,屏蔽了客戶端如何連接到服務器端的細節,實現了數據庫的位置透明的特性。
      如何利用配置的網絡服務名連接到數據庫:
      用sqlplus程序通過test網絡服務名進行測試,如sqlplus system/manager@test。如果不能連接到數據庫,則在tnsname.ora文件中的test網絡服務名(net service)後面加上Oracle數據庫的DB_Domain參數值,通過用sqlplus> show parameter db_domain命令察看。此處db_domain參數值為testserver.com,將其加到網絡服務名後面,修改後的tnsname.ora中關於該網絡服務名的內容為:
      應該改為:
      如何利用配置的網絡服務名連接到數據庫:
      用sqlplus程序通過test網絡服務名進行測試,如sqlplus system/manager@test。如果不能連接到數據庫,則在tnsname.ora文件中的test網絡服務名(net service)後面加上sqlnet.ora文件中NAMES.DEFAULT_DOMAIN參數的值,此處我的參數值為 testserver.com,將其加到網絡服務名後面,修改後的tnsname.ora中關於該網絡服務名的內容為:
      什麽情況下會引起oracle自動設置NAMES.DEFAULT_DOMAIN參數?
      出現這種情況的典型環境為windows的客戶端的‘我得電腦à屬性à計算機名à更改à其它…à此計算機的主DNS後綴’中設置了‘primary dns suffix’,因為在這種情況下安裝客戶端時,會在sqlnet.ora文件中自動設置NAMES.DEFAULT_DOMAIN參數,或許當把計算機加入域中安裝oracle客戶端時也會出現這種情況,有條件的話大家可以試一下。
      我在設置oracle的客戶端時一般手工修改tnsnames.ora文件,但是還有許多人喜歡用圖形工具配置,該圖形工具最終還是修改tnsnames.ora文件,但是它有時會引起其它的問題:
      在用oracle的圖形配置軟件’net assistant’或‘Net Configuration Assistant’配置網絡服務名時,假如已經設置了‘primary dns suffix’,但是在圖形配置軟件中寫的網絡服務名的名字中沒有‘primary dns suffix’,如只是寫了test,則圖形配置軟件會自動在後面加上‘primary dns suffix’,使之變為test.testserver.com,並存在tnsnames.ora中,而不管你的sqlnet.ora文件中是否有 NAMES.DEFAULT_DOMAIN參數。此時,用圖形工具進行測試連接是通過的,但是假如此時sqlnet.ora文件中沒有 NAMES.DEFAULT_DOMAIN參數,則你在使用網絡服務名時應該使用在tnsnames.ora中的 test.testserver.com,而不是你在圖形配置軟件中鍵入的test。解決的辦法為:
      可以在sqlnet.ora文件中設置NAMES.DEFAULT_DOMAIN= testserver.com,這時你可以用test或test.testserver.com連接數據庫
      在sqlnet.ora文件中不設置NAMES.DEFAULT_DOMAIN參數,在tnsnames.ora文件中將 test.testserver.com中的.testserver.com去掉,這時你可以用test連接數據庫

      listener.ora、 tnsnames.ora和sqlnet.ora這3個文件是關系oracle網絡配置的3個主要文件,其中listener.ora是和數據庫服務器端 相關,而tnsnames.ora和sqlnet.ora這2個文件不僅僅關系到服務器端,主要的還是和客戶端關系緊密。
      檢查客戶端oracle網絡的時候可以先檢查sqlnet.ora文件:

      # SQLNET.ORA Network Configuration File: $ORACLE_HOME/NETWORK/ADMIN/sqlnet.ora
      # Generated by Oracle configuration tools.
      SQLNET.AUTHENTICATION_SERVICES= (NTS)
      NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES)
      ##NAMES.DEFAULT_DOMAIN = us.oracle.com

      上面的sqlnet.ora文件說明:
      SQLNET.AUTHENTICATION_SERVICES= (NTS)——這個表示采用os認證,在數據庫服務器上,可以利用sqlplus “/ as sysdba”。一般這個配置在windows上是ok的,在unix環境下可能會有問題,一般在unix下可以去掉這個配置。

      NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES)——表示將首先利用tnsnames進行解析;如果tnsnames解析不到,將使用hostname解析;如果hostname解析不 到,將采用onames進行解析。

      被註釋掉的NAMES.DEFAULT_DOMAIN = us.oracle.com——表示采用默認的domain name為us.oracle.com,在tnsnames.ora中如果配置對應的解析,如果原來的別名oralocal,那麽,當啟用這個參數後,在 tnsnames中的配置要改成oralocal.us.oracle.com。在使用tnsping時或者sqlplus登錄時,只需寫前面的別名,系 統會自動加上後面的domain name來進行解析。

      檢查完畢sqlnet.ora,一般都會發現是使用tnsname來解析別名的,那麽,tnsnames.ora中可以有哪些配置種類呢?

      # TNSNAMES.ORA Network Configuration File: $ORACLE_HOME/NETWORK/ADMIN/tnsnames.ora
      # Generated by Oracle configuration tools.
      ###### 一般的配置 ##################################
      ORALOCAL =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = oralocal)
      )
      )
      ###### 這樣也行,用SID=oralocal ###########################
      ORALOCAL_2 =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = oralocal)
      )
      ###### RAC的配置(3節點rac) ###############################
      ORALOCAL =
      (DESCRIPTION =
      (load_balance = yes)
      (failover = on)
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.3)(PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVICE_NAME = oralocal)
      (SERVER = DEDICATED)
      (failover_mode=(type=select)(method=basic)(retries=20)(delay=20))
      )
      )
      ORALOCAL_NODE1 =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVICE_NAME = oralocal)
      (INSTANCE_NAME = oralocal_node1)
      )
      )
      ORALOCAL_NODE2=
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2)(PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVICE_NAME = oralocal)
      (INSTANCE_NAME = oralocal_node2)
      )
      )
      ORALOCAL_NODE3 =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.3)(PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVICE_NAME = oralocal)
      (INSTANCE_NAME = oralocal_node3)
      )
      )
      )
      ###### DATA GUARD配置(primary庫和standby庫都需要配置)##############
      standby =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.2)(PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVER=DEDICATED)
      (SERVICE_NAME = oralocal)
      )
      )
      primary =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.1)(PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVER=DEDICATED)
      (SERVICE_NAME = oralocal)
      )
      )

      另外需要註意的2點情況:
      (1)如果tnsnames中的service_name配置錯誤,配置成了instance_name了,這個時候會發生tnsping能通,但是 sqlplus連接不上的奇怪情況。報錯ORA-12514: TNS:listener could not resolve SERVICE_NAME given in connect descriptor。這個時候查錯的時候,需要檢查對應的service_name。
      (2)如果遠程數據庫是rac,而且本地客戶端端遠程數據庫處於不同的網段,通過公網鏈接,rac對外的ip映射只有一個,即只映射到一個節點。請註意在 客戶端配置tnsnames的時候按照單機的情況來配置。呵呵,dba不僅僅要學習oracle,了解一些網絡的知識,特別是自己系統的網絡架構,也是需 要的。

      Oracle網絡配置用到的sqlnet.ora,tnsnames.ora,listener.ora文件

      註:文章內容由網絡及相關書籍整理而來,如此只為共享知識,給予幫助。

      listener.ora、tnsnames.ora和sqlnet.ora這3個文件是關系oracle網絡配置的3個主要文件,都是放在$ORACLE_HOME/network/admin目錄下。其中listener.ora是和數據庫服務器端相關,而tnsnames.ora和sqlnet.ora這2個文件不僅僅關系到服務器端,主要的還是和客戶端關系緊密。

      一、客戶端設置

      1.sqlnet.ora

      通過這個文件來決定怎樣找一個連接中出現的連接字符串

      示例文件:
      # sqlnet.ora Network Configuration File: F:/oracle/product/10.2.0/db_1/network/admin/sqlnet.ora
      # Generated by Oracle configuration tools.

      # This file is actually generated by netca. But if customers choose to
      # install "Software Only", this file wont exist and without the native
      # authentication, they will not be able to connect to the database on NT.

      SQLNET.AUTHENTICATION_SERVICES= (NTS)

      NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME, ONAMES, EZCONNECT)

      #NAMES.DEFAULT_DOMAIN = oracle.com

      內容說明:

      SQLNET.AUTHENTICATION_SERVICES= (NTS)——這個表示采用OS認證,在數據庫服務器上,可以利用sqlplus / as sysdba。一般這個配置在windows上是ok的,在unix環境下可能會有問題,一般在unix下可以去掉這個配置。

      NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES)——表示將首先利用tnsnames進行解析;如果tnsnames解析不到,將使用hostname解析;如果hostname解析不到,將采用onames進行解析;最後使用EZCONNECT解析。例如我們客戶端輸入:sqlplus zidi/zidi@changbai,那麽,客戶端就會首先在tnsnames.ora文件中找orcl的記錄.如果沒有相應的記錄則嘗試把orcl當作一個主機名,通過網絡的途徑去解析它的IP地址然後去連接這個IP上global_name=changbai這個實例,當然我這裏orcl並不是一個主機名。

      被註釋掉的NAMES.DEFAULT_DOMAIN = changbai.com——表示采用默認的域名為changbai.com,在tnsnames.ora中如果配置對應的解析,如果原來的數據庫別名是oralocal(即網絡服務名),那麽,當啟用這個參數後,在tnsnames中的配置要改成oralocal.changbai.com。在使用tnsping時或者sqlplus登錄時,只需寫前面的別名,系統會自動加上後面的域名來進行解析。

      2.tnsnames.ora

      這個文件放在客戶端機器上,記錄客戶端訪問數據庫的本地配置,其實就是定義網絡服務,只有當sqlnet.ora中有“NAMES.DIRECTORY_PATH= (TNSNAMES)”這樣的字樣時,也就是客戶端解析連接字符串的順序中有TNSNAMES時,才會嘗試使用這個文件。

      示例文件:
      # tnsnames.ora Network Configuration File: F:/oracle/product/10.2.0/db_1/NETWORK/ADMIN/tnsnames.ora
      # Generated by Oracle configuration tools.

      HUINAMN =網路服務名
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 108.108.108.108)(PORT = 1521))訪問數據庫使用的協議,數據庫計算機的主機名或IP地址,數據庫的端口號
      )
      (CONNECT_DATA =
      (SID = HN)數據庫實例名,前提是所連接的數據庫是Oracle8或更低版本
      )
      )
      CHANGBAI =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 208.208.208.208)(PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVICE_NAME = CB)數據庫服務名,即全局數據庫名
      )
      )
      ORCL =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVER = DEDICATED)使用專用服務器模式去連接,這需要跟服務器的模式匹配,如果沒有就根據服務器的模式自動調節
      (SERVICE_NAME = orcl)
      )
      )

      二、服務器端設置
      listener.ora

      它是listener監聽器進程的配置文件。關於listener進程就不多說了,接受遠程對數據庫的接入申請並轉交給oracle的服務器進程。所以如果不是使用的遠程的連接,listener進程就不是必需的,同樣的如果關閉listener進程並不會影響已經存在的數據庫連接。
      示例文件:
      # listener.ora Network Configuration File: F:/oracle/product/10.2.0/db_1/network/admin/listener.ora
      # Generated by Oracle configuration tools.

      SID_LIST_LISTENER =這裏定義LISTENER進程為哪個實例提供服務
      (SID_LIST =
      (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = F:/oracle/product/10.2.0/db_1)
      (PROGRAM = extproc)
      )
      )

      LISTENER =監聽器的名字,一臺數據庫可以有不止一個監聽器
      (DESCRIPTION_LIST =
      (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))監聽器監聽的協議,IP,端口等
      (ADDRESS = (PROTOCOL = TCP)(HOST = dabeng)(PORT = 1521))
      )
      )

      上面的例子是一個最簡單的例子,但也是最普遍的。一個listener進程為一個數據庫實例(SID)提供服務。

      三、總結

      上面說到的三個文件都可以通過圖形的配置工具來完成配置:Database Configuration Assistant,Net Configuration Assistant
      具體的配置可以嘗試一下,然後來看一下配置文件,這樣一來總體結構就有了,是當你輸入sqlplus zidi/zidi@changbai的時候

      1. 查詢sqlnet.ora看看名稱的解析方式,發現是TNSNAME
      2. 則查詢tnsnames.ora文件,從裏邊找orcl的記錄,並且找到主機名,端口和service_name
      3. 如果listener進程沒有問題的話,建立與listener進程的連接。
      4. 根據不同的服務器模式如專用服務器模式或者共享服務器模式,listener采取接下去的動作。默認是專用服務器模式,沒有問題的話客戶端就連接上了數據庫的server process。
      5. 這時候網絡連接已經建立,listener進程的歷史使命也就完成了。

      換個角度理解:
      changbai是我們連接遠端數據庫用到的服務命名,但是最終必須轉化為host:port:servide_name這樣的連接字串,而這個轉化可以理解為是翻譯的過程,而要想翻譯成功,則必須選擇好翻譯方法,那麽sqlnet.ora就是我們用來選擇翻譯方法的,其中的NAMES.DIRECTORY_PATH= (TNSNAMES) 就是我們選擇的命名解析方法; tnsnames.ora是翻譯方法中的一種——本地命名解析方法的配置文件,就好像我們選擇了查字典方法,這個文件就是我們的字典一樣裏面存放著所有服務命名對應的連接字串;至於listener.ora則是負責接受我們請求的負責任人——連接地址配置文件,裏面包括了連接負責人的連接地址,也放著經過他允許可以連接的數據庫信息。這樣就構成了Oracle的網絡架構。

      55555555555555555555555555

      listener.ora、 tnsnames.ora和sqlnet.ora這3個文件是關系oracle網絡配置的3個主要文件,其中listener.ora是和數據庫服務器端 相關,而tnsnames.ora和sqlnet.ora這2個文件不僅僅關系到服務器端,主要的還是和客戶端關系緊密。
      檢查客戶端oracle網絡的時候可以先檢查sqlnet.ora文件:

      # SQLNET.ORA Network Configuration File: $ORACLE_HOME/NETWORK/ADMIN/sqlnet.ora
      # Generated by Oracle configuration tools.
      SQLNET.AUTHENTICATION_SERVICES= (NTS)
      NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES)
      ##NAMES.DEFAULT_DOMAIN = us.oracle.com

      上面的sqlnet.ora文件說明:
      SQLNET.AUTHENTICATION_SERVICES= (NTS)——這個表示采用os認證,在數據庫服務器上,可以利用sqlplus “/ as sysdba”。一般這個配置在windows上是ok的,在unix環境下可能會有問題,一般在unix下可以去掉這個配置。

      NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, ONAMES)——表示將首先利用tnsnames進行解析;如果tnsnames解析不到,將使用hostname解析;如果hostname解析不 到,將采用onames進行解析。

      被註釋掉的NAMES.DEFAULT_DOMAIN = us.oracle.com——表示采用默認的domain name為us.oracle.com,在tnsnames.ora中如果配置對應的解析,如果原來的別名oralocal,那麽,當啟用這個參數後,在 tnsnames中的配置要改成oralocal.us.oracle.com。在使用tnsping時或者sqlplus登錄時,只需寫前面的別名,系 統會自動加上後面的domain name來進行解析。

      檢查完畢sqlnet.ora,一般都會發現是使用tnsname來解析別名的,那麽,tnsnames.ora中可以有哪些配置種類呢?

      # TNSNAMES.ORA Network Configuration File: $ORACLE_HOME/NETWORK/ADMIN/tnsnames.ora
      # Generated by Oracle configuration tools.
      ###### 一般的配置 ##################################
      ORALOCAL =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = oralocal)
      )
      )
      ###### 這樣也行,用SID=oralocal ###########################
      ORALOCAL_2 =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = oralocal)
      )
      ###### RAC的配置(3節點rac) ###############################
      ORALOCAL =
      (DESCRIPTION =
      (load_balance = yes)
      (failover = on)
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.3)(PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVICE_NAME = oralocal)
      (SERVER = DEDICATED)
      (failover_mode=(type=select)(method=basic)(retries=20)(delay=20))
      )
      )
      ORALOCAL_NODE1 =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVICE_NAME = oralocal)
      (INSTANCE_NAME = oralocal_node1)
      )
      )
      ORALOCAL_NODE2=
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.2)(PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVICE_NAME = oralocal)
      (INSTANCE_NAME = oralocal_node2)
      )
      )
      ORALOCAL_NODE3 =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.3)(PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVICE_NAME = oralocal)
      (INSTANCE_NAME = oralocal_node3)
      )
      )
      )
      ###### DATA GUARD配置(primary庫和standby庫都需要配置)##############
      standby =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.2)(PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVER=DEDICATED)
      (SERVICE_NAME = oralocal)
      )
      )
      primary =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.1)(PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVER=DEDICATED)
      (SERVICE_NAME = oralocal)
      )
      )

      另外需要註意的2點情況:
      (1)如果tnsnames中的service_name配置錯誤,配置成了instance_name了,這個時候會發生tnsping能通,但是 sqlplus連接不上的奇怪情況。報錯ORA-12514: TNS:listener could not resolve SERVICE_NAME given in connect descriptor。這個時候查錯的時候,需要檢查對應的service_name。
      (2)如果遠程數據庫是rac,而且本地客戶端端遠程數據庫處於不同的網段,通過公網鏈接,rac對外的ip映射只有一個,即只映射到一個節點。請註意在 客戶端配置tnsnames的時候按照單機的情況來配置。呵呵,dba不僅僅要學習oracle,了解一些網絡的知識,特別是自己系統的網絡架構,也是需 要的。

Oracle的tnsnames.ora配置(PLSQL Developer)