一個 Oracle 監聽器(Listener)可同時為多個資料庫實例(SID/Service)提供服務,無需建立多個監聽器埠。本文以圖文並茂方式示範 Net Configuration Assistant / Net Manager 圖形化配置、手動編輯 listener.ora、tnsnames.ora 兩大核心檔案,並說明多版本共存、字元集差異等決策考量。
Net Manager:Local → Listeners → LISTENER → Database Services → Add Database → 填入 Global Database Name(= SERVICE_NAME)、SID Name、Oracle Home。
# listener.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = harry)(PORT = 1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:\DATABASE\Oracle81)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = ORASUN)
(ORACLE_HOME = D:\DATABASE\Oracle81)
(SID_NAME = ORASUN)
)
(SID_DESC =
(GLOBAL_DBNAME = ORAGCE)
(ORACLE_HOME = D:\DATABASE\Oracle81)
(SID_NAME = ORAGCE)
)
)
關鍵:GLOBAL_DBNAME 對應客戶端連線字串中的 SERVICE_NAME。
# tnsnames.ora
SMEST =
(DESCRIPTION =
(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)))
(CONNECT_DATA = (SERVICE_NAME = ORAGCE))
)
SMEDI =
(DESCRIPTION =
(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)))
(CONNECT_DATA = (SERVICE_NAME = ORASUN))
)
INST1_HTTP =
(DESCRIPTION =
(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)))
(CONNECT_DATA = (SERVER = SHARED)(SERVICE_NAME = ORAGCE)(PRESENTATION = https://admin))
)
tnsping SMEST
tnsping SMEDI
sqlplus user/pass@SMEST
sqlplus user/pass@SMEDI
| 情境 | 建議 |
|---|---|
| 多應用共用同字元集、同版本 | 單一資料庫,建立多個使用者/表空間隔離 |
| 字元集不同(如 BIG5 vs GB2312 vs UTF8) | 分離資料庫實例(字元集建庫後不可變) |
| 需不同 Oracle 版本(如 8i + 9i + 11g) | 分離 Oracle Home,各自監聽器埠(如 1521/1522/1523) |
| 嚴格資安隔離、獨立備份窗口、不同 SLA | 分離實例 |
ORACLE_HOME、PATH 分別指向各自 Home。HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE 下以 HOME0, HOME1... 區隔,互不衝突。lsnrctl reload
# 或
lsnrctl stop && lsnrctl start
在 listener.ora 的 DESCRIPTION_LIST 加入兩個 ADDRESS,分別綁定內網 IP 與外網 IP,同一埠或不同埠均可。