場景:新疆分公司 (本地庫 SIDXJ) 需透過 DBLINK 查詢北京總部庫 (SIDBJ) 資料。本文記錄完整建立流程:Global Name 確認、TNS 別名設定、DBLINK 建立語法、權限授予、連線測試與防火牆/監聽器常見阻斷排查。
| 項目 | 北京總部 (Remote) | 新疆分公司 (Local) |
|---|---|---|
| IP | 192.168.1.101 | 192.168.1.100 |
| SID | SIDBJ | SIDXJ |
| Global Name | SIDBJ.US.ORACLE.COM | SIDXJ |
| User/Pass | USERBJ / BJ123 | USERXJ / XJ123 |
| OS/DB | WinXP / Oracle 8.1.7 | WinXP / Oracle 8.1.7 |
SHOW PARAMETER GLOBAL_NAMES;
-- 若 TRUE,DBLINK 名稱必須 = 遠端 Global Name
SELECT * FROM V$OPTION WHERE PARAMETER = 'Advanced replication';
-- TRUE 表示支援
編輯 $ORACLE_HOME/network/admin/tnsnames.ora:
TNS_XJ_TO_BJ =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.101)(PORT = 1521))
(CONNECT_DATA = (SID = SIDBJ))
)
測試:TNSPING TNS_XJ_TO_BJ 確認 OK。
CREATE TABLE USERBJ.BJ_TEST (
STU_ID NUMBER,
STU_NAME VARCHAR2(100)
);
INSERT INTO USERBJ.BJ_TEST VALUES (1, '鐘德榮');
COMMIT;
-- 必須與遠端 Global Name 完全一致 (含大小寫)
CREATE DATABASE LINK "SIDBJ.US.ORACLE.COM"
CONNECT TO USERBJ IDENTIFIED BY BJ123
USING 'TNS_XJ_TO_BJ';
USING 後接本地 TNS 別名
-- 基本連線測試
SELECT * FROM DUAL@"SIDBJ.US.ORACLE.COM";
-- 預期回傳 DUMMY = 'X'
-- 跨庫查詢業務表
SELECT * FROM USERBJ.BJ_TEST@"SIDBJ.US.ORACLE.COM";
-- 預期回傳 STU_ID=1, STU_NAME='鐘德榮'
| 錯誤代碼 | 原因 | 解決 |
|---|---|---|
| ORA-02019 | Global Name 不匹配 | DBLINK 名稱必須 = 遠端 SELECT * FROM GLOBAL_NAME 結果 |
| ORA-12154 / TNS-03505 | TNS 別名解析失敗 | 檢查 tnsnames.ora 拼寫、SID/Service Name、Host/IP、Port |
| ORA-12541 / 12545 | 監聽器未啟動/Host 錯誤 | 遠端 LSNRCTL STATUS、確認 HOST/IP、防火牆 1521 |
| ORA-01017 | 帳號密碼錯誤 | 確認遠端 USERBJ/BJ123、大小寫、鎖定狀態 |
| ORA-02085 | DBLINK 連線已關閉 | 重新建立 DBLINK、檢查遠端 IDLE_TIME 限制 |
-- 私有 (僅建立者可用) - 預設
CREATE DATABASE LINK ...
-- 公共 (所有用戶可用,需 CREATE PUBLIC DATABASE LINK 權限)
CREATE PUBLIC DATABASE LINK "SIDBJ.US.ORACLE.COM" ...;
-- 使用公共 DBLINK 時無需指定擁有者
SELECT * FROM TABLE@DBLINK_NAME;
CREATE SESSION + 需查詢表的 SELECTSSL/TLS 加密跨庫傳輸 (TCPS 協定)DBA_DB_LINKS、監控 V$DBLINK 異常連線