2020年11月19日 星期四

6.1 Client-Server 架構介紹

Oracle 資料庫在架構上走的是 Client-Server 架構,也就是說在一台主機上安裝 Oracle 軟體,這台主機就成為了 Oracle Server,而要從其它主機登入或連線到 Oracle Server 上的資料庫就必須要透過 Oracle Client 來連線。連線到 Oracle 資料庫的方式有很多種,例如使用 sqlplus 、 SQL Developer 、 ODBC…等這些工具都是藉由安裝 Oracle Client 軟體作為驅動來連線,如果是 Java 的話則可以透過 Oracle JDBC Thin Client 來連線。


Client 端發起連線的請求之後首先會在 Client 端的主機上產生 User Process,然後透過網路將連線的請求送到 Oracle Server 上,這時候在 Oracle Server 上有個專門接受連線請求的人物,這個人物我們稱作監聽器(Listener),在 Listener 接收到連線請求之後會確認連線的資訊是否正確,通過檢查後 Listener 便會建立起 Client 與 Server 之間的連線,並且在 Oracle Server 上產生此連線所對應的 Server Process。


在 Oracle Net 的架構中有兩個重要的設定檔,一個是 tnsnames.ora ,用來設定連線資訊,包括 Server ip 、 Port Number ,與資料庫的 Service Name;另一個是 Listener.ora ,只存在 Oracle Server ,此為 Listener 的設定檔。


tnsnames.ora 預設位置為 $ORACLE_HOME/network/admin 底下, $ORACLE_HOME 為 Oracle Client 或 Server 軟體的安裝目錄,連線時便會到這個路徑底下讀取 tnsnames.ora 的設定,如果要改變 tnsnames.ora 讀取的位置可以透過設定系統環境變數 TNS_ADMIN 來達成,但一般不建議更改。tnsnames.ora 為文字模式的檔案,可以直接透過文字編輯器來修改,裡面主要是定義連線到資料庫的連線字串,必須遵循固定個格式設定,例如設定兩個連線字串 ORA11 與 ORA10 如下:


最上面 “ORA11 =” 與 “ORA10 =” 為連線的名稱,主要是給 Client 端識別所用,可以設定任何的名稱,例如要連線到 ORA11 就要執行 sqlplus <帳號>/<密碼>@ORA11 ,連線到 ORA10 執行 sqlplus <帳號>/<密碼>@ORA10 。而在名稱的下面則是定義 Oracle Server 的 ip 位址、Port Number 與資料庫的 Service Name,在執行 sqlplus @ORA11 之後會將這些訊息透過網路傳送到 Listener,資訊正確的話 Listener 便會建立起連線。常見的連線錯誤例如 ORA-12541: TNS: no listener 表示 tnsnames.ora 裡面的 ip 位址或是 Port Number 設定有誤;ORA-12154: TNS:could not resolve the connect identifier specified 表示 tnsnames.ora 裡面的 Service Name 設定有誤,或者是資料庫未註冊到相對應的 Listener。


由於 tnsnames.ora 的設定必須遵循一定個格式,如果格式有誤的話便會產生無法連線的錯誤,也因此 Oracle Client 有一個工具 Net Manager 來輔助我們設定 tnsnames.ora:


如果是 Windows 平台的話可以直接執行 Net Manager,若是 Unix 平台的話,則必須要先啟用 XWindows 工具讓主機可以導出圖形介面,然後於 $ORACLE_HOME/bin 底下執行 netmgr。透過 Net Manager 工具的提示便可以按部就班的設定好 tnsnames.ora 的內容:


除此之外也可以透過網路組態輔助程式(netca) 來設定:


在 $ORACLE_HOME/network/admin 目錄下除了 tnsnames.ora 之外,還有一個重要的檔案 sqlnet.ora ,主要是用來設定一些額外與連線有關的參數來做為輔助,像是連線是否加密、連線 timeout 的時間設定、啟用連線的 trace …等都可以透過 sqlnet.ora 來達成,例如一個 sqlnet.ora 的設定如下:


上述兩個參數只有在 Oracle Server 上才會設定,INBOUND_CONNECT_TIMEOUT 用來設定 Client 與 Server 建立起連線時的超時時間,設定 3 表示在 3 秒鐘之內沒建立起連線表示連線超時; INVITED_NODES 表示 Oracle Server 只能容許這些 Client 的 ip 位址來連線,不在 INVITED_NODES 清單裡的主機不可以連線。


對於使用者來說只需要了解如何連線到 Oracle 資料庫,因此了解 tnsnames.ora 是必須的,而 DBA 則是更需要清楚的了解 tnsnames.ora、listener.ora 與 sqlnet.ora ,這樣在連線出現問題時才能分析問題是出在哪個環節。




沒有留言:

張貼留言