2013年8月8日 星期四

Oracle 11g-關於Listener.ora / Sqlnet.ora / Tnsnames.ora


事實上,當我們在做Oracle的配至時往往監聽器設定的資訊跟Instance都是一樣的,這也讓我有時候會突然腦筋打結


平常我們在遠端主機不是都這樣打嗎? sqlplus hr/oracle@orcl ,然後趴啦一聲你就連接上了
你不覺得這樣很奇怪嗎?到底我是怎樣連接上的?



Oracle主要有三個配置文件
1.listener.ora
2.sqlnet.ora
3.tnsnames.ora

預設這些檔案都是放在$ORACLE_HOME\network\admin目錄下,如果有使用Grid的話目標位置會在Grid\network\admin目錄下
  


重點:三個文件的作用和使用方式

1.[sqlnet.ora] <-- 簡單的講就是決定連線的方法選擇  
 
   (可使用的連線方式有 EZCONNECT 、TNSNAMES、HOSTNAME、LDAP、NIS)

最常用的大概就是 EZCONNECT 、TNSNAMES這兩種堪稱是最經典的方式

關於


=================================================================
/u01/app/oracle/product/11.2.0/grid/network/admin
[oracle@oracledb admin]$ cat sqlnet.ora
# sqlnet.ora Network Configuration File: /u01/app/oracle/product/11.2.0/grid/network/admin/sqlnet.ora
# Generated by Oracle configuration tools.

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
 <<可以設定多種連線方式它將會依序幫你做解析

ADR_BASE = /u01/app/oracle
=================================================================

在用戶端的話你必須要定義使用的方法這樣才會依據你輸入的command不同而決定你將使用哪種方式連線

舉例:

A.使用EZCONNECT條件
   
 1.sqlnet.ora必須要有設定NAMES.DIRECTORY_PATH= (EZCONNECT)
 2.輸入時必須要有IP 、PORT以及service name

   EX:sqlplus system/oracle@192.168.56.2:1521/orcl
                                         


B.使用TNSNAMES條件

 1.sqlnet.ora必須要有設定NAMES.DIRECTORY_PATH= (TNSNAMES)
 2.本機要搭配 TNSNAMES.ora設定檔

 EX: sqlplus system/oracle@myoracle




假設我的sqlnet.ora中使用  NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT,HOSTNAME)三種方式

當我執行 sqlplus system/oracle@myoracle
當你執行後客戶端就會首先在tnsnames.ora文件中找myorcle的記錄.如果沒有相應的記錄則嘗試下一個是否為EZCONNECT旦發現一整個格式太扯落差又太大就會在往下一下HOSTNAME走把myoracle當作一個主機名稱,通過網路途徑進行解析它 的IP地址然後在去連接這個IP,在這裡還要考慮到SERVER端是否有設定GLOBAL_DBNAME=myoracle



2.[TNSNAMES.ora] <-- 簡單的講就是選擇對應的解析資訊

如果你懂DNS的話其原理就有點類似,我說白話一點好了,你知道 QR-Code這種東西吧?(啥...不知道...那你先查一下好了) 不是用手掃描器這樣一掃就連到要去的網站
所以QR-CODE 記載了目的地的(主機名稱或IP) 、協定(Protocol)連接的PORT跟哪一個網頁(SID)

**但要聽清楚了TNSNAMES.ora 是用戶端在用的,SERVER端用的是監聽器,你會說不是在 SERVER端的 /network/admin/下也有TNSNAMES.ora嗎? 
沒錯~因為你也會在SEREVR端下去連接DB吧...所以這時你也是用戶端啦****

=================================================================
[oracle@oracledb admin]$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.


myoracle =  <<這是net service name
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracledb)(PORT = 1521))
<<定義連線的協定、主機名稱與連接的Port

    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl2) <<定義你的SID 
    )
  )


因為礙於習慣以往我們在做練習時很喜歡都設成一樣的,但我這也會讓我們有一些腦筋打結orcl是跟誰有關而導致有時後搞不清楚狀況

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracledb)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

=================================================================


3.[Listener.ora] <<簡單的說是SERVER端l監聽器

如果沒有設定listener.ora,就像郵差拿著掛號信要送到你家去簽收但是死也找不到電鈴可以叫你下來領掛號一樣


[oracle@oracledb admin]$ cat listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/grid/network/admin/listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)  

<<sid.domain在沒domain name的情況下就跟SID NAME是相同的
其中GLOBAL_DBNAME不是必需的除非使用HOSTNAME做數據庫連接,舉個範例假設我有5台DB每台DB我都叫orcl的話那這樣要怎樣連??
但如果是  orcl.aaa.com.tw  orcl.bbb.com.tw、orcl.ccc.com.tw、orcl.ddd.com.tw、orcl.eee.com.tw
這樣你有清楚差別了嗎??


      (SID_NAME = orcl) <<SID NAME

      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1) <<主目錄路徑
    )
  )


TRACE_LEVEL_LISTENER2 = OFF

LOGGING_LISTENER = OFF

LISTENER =

<<監聽器名稱(一台數據庫可以有不止一個監聽器,每個監聽器可以聽很多個Port)

  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = oracledb)(PORT = 1521))
    )
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      )
    )
    (DESCRIPTION =
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = oracledb)(PORT = 12345))
      )
    )
  )

在Listener的監聽器中負責監聽想要連線到目的地HOST與PORT,所以你可以看到
Port 1521與Port 12345都是可以被使用的


ADR_BASE_LISTENER = /u01/app/oracle
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER = ON
TRACE_LEVEL_LISTENER = OFF
=================================================================



沒有留言:

張貼留言