SIDBJ,用戶 userbj/bj123,IP 192.168.1.101,GLOBAL_NAME=SIDBJ.US.ORACLE.COMSIDXJ,用戶 userxj/xj123,IP 192.168.1.100 (本地)userbj 身份查詢北京庫表 BJ_TESTGLOBAL_NAMES=TRUE (默認),DBLink 名**必須等於**遠程 GLOBAL_NAME。V$OPTION 確認雙方支持 Advanced Replication (若需雙向復制)。新疆庫 tnsnames.ora 添加:
tns_xj_to_bj =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.101)(PORT = 1521))
(CONNECT_DATA = (SID = SIDBJ))
)
CREATE TABLE userbj.bj_test (stu_id NUMBER, stu_name VARCHAR2(100));
INSERT INTO userbj.bj_test VALUES (1, '鐘德榮');
COMMIT;
CREATE DATABASE LINK "SIDBJ.US.ORACLE.COM"
CONNECT TO userbj IDENTIFIED BY bj123
USING 'tns_xj_to_bj';
SELECT * FROM dual@"SIDBJ.US.ORACLE.COM"; -- 返回 X 表示成功
SELECT * FROM userbj.bj_test@"SIDBJ.US.ORACLE.COM"; -- 查詢遠程表
ALTER SYSTEM SET global_names=FALSE SCOPE=BOTH;
CREATE DATABASE LINK a CONNECT TO userbj IDENTIFIED BY bj123 USING 'tns_xj_to_bj';
SELECT * FROM userbj.bj_test@a; -- 現在可用任意名稱
CREATE OR REPLACE PROCEDURE test_cur IS
v_sql VARCHAR2(1000) := 'SELECT stu_name FROM userbj.bj_test@a';
v_name VARCHAR2(100);
TYPE t_cur IS REF CURSOR;
c_cur t_cur;
BEGIN
OPEN c_cur FOR v_sql;
LOOP
FETCH c_cur INTO v_name;
EXIT WHEN c_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_name);
END LOOP;
CLOSE c_cur;
END;
/
EXEC test_cur; -- 輸出: 鐘德榮
| 錯誤 | 原因 | 解決 |
|---|---|---|
| ORA-12154 / TNS:could not resolve | 服務名拼寫錯/tnsnames.ora未生效 | 檢查 tnsping、sqlnet.ora NAMES.DIRECTORY_PATH |
| ORA-12514 / Listener does not know SID | 遠程 listener.ora 缺少 SID_LIST | 遠程配置 SID_LIST_LISTENER 包含目標 SID |
| ORA-02019 / Connection description for remote database not found | DBLink USING 字符串與本地 tnsnames 不匹配 | 核對 USING 服務名 |
| ORA-01017 / Invalid username/password | 遠程用戶/密碼錯誤或大小寫 (11g+ 區分大小寫) | 確認遠程認證信息 |
GLOBAL_NAME,避免 GLOBAL_NAMES=TRUE 限制。CREATE SESSION + 查詢對象權限)。TRANSPARENT GATEWAY 或 DG4ODBC 異構連接。DBA_DB_LINKS、V$DBLINK 定期巡檢。