Oracle建立DBLINK的詳細步驟記錄

 

Oracle建立DBLINK的詳細步驟記錄

測試條件:
假設某公司總部在北京,昆明有其下屬的一個分公司。在本次測試中,昆明的計算機爲本地計算機,即本要的IP地址爲:192.168.1.100
北京的總部有一個集中的數據庫,其SID是SIDBJ,用戶名:userbj,密碼:bj123,北京的IP地址是:192.168.1.101。
在本地(昆明)的分公司也有一個數據庫,其SID是SIDXJ,用戶:userxj,密碼:xj123,昆明的IP地址是:192.168.1.100。

要將本地昆明的SIDXJ數據庫中訪問到北京的數據庫SIDBJ中的數據。

也就是說,在sidxj的數據庫中,用戶userxj(192.168.1.100)需要建立DBLINK,以userbj的用戶身份訪問sidBJ(192.168.1.101)中的數據。
測試環境:兩個數據庫均建立在WINXP上,ORACLE的版本均爲Oracle9.1.4
建立環境時,要注意關閉兩臺計算機上的Windows的防火牆,否則,會出現能ping通,但Oracle連接不通的情況。
1、問:如何返回數據庫的GLOBAL_NAME?
執行
SELECT * FROM GLOBAL_NAME;
北京的數據庫的GLOBAL_NAME爲
SIDBJ.US.ORACLE.COM
昆明的數據庫的GLOBAL_NAME爲SIDXJ
2、問:如何查看Global_name參數是true還是False?
答:執行:
SQL> show parameter global_name;
執行的結果如下:

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
global_names boolean TRUE
表示該參數是true.
該參數爲true時,你在本地建立的DBLINK的名稱必須和遠程的Global_name一致才行。
3、問:查看遠程數據徊是否支持高級複製功能。
答:通過查看v$option視圖,如果其中Advanced replication爲TRUE,則支持高級複製功能;否則不支持。
執行語句爲:select * from v$option;
也可以執行select * from v$option where PARAMETER='Advanced replication'語句,
如何返回值爲True,那麼就是支持,否則就是不支持。在兩個數據庫中都是檢查是否支持才行。

建立步驟:
1、在本地tnsnames.ora裏建立一個北京數據庫連接的實例名tns_xj_to_bj。
tns_xj_to_bj =
(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.101)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = SIDBJ)
    )
)
在北京的數據庫中,建立一個表用於測試。
create table USERBJ.BJ_TEST
(
STU_ID NUMBER,
STU_NAME VARCHAR2(100)
)
在其中增加一條記錄:

insert into BJ_TEST (STU_ID, STU_NAME)
values (1, '張三);

2、新建一個連接tnsxj,用於連接本地的sidxj數據庫,以tnsxj/userxj/xj123登錄到PLSQL中。
下面開始創建連接到北京的遠程數據連接DBLink。
create database link SIDBJ.US.ORACLE.COM connect to userbj identified by bj123 using 'tns_xj_to_bj';
其中:SIDBJ.US.ORACLE.COM是遠程的數據庫的global_name,userbj是連接SIDBJ的用戶名,bj123是userbj的密碼,

tns_xj_to_bj是本地建立的連接到北京的數據庫的服務名。
3、測試連接是否成功:
select * from
[email protected]
如果返回結果如下則表示連接成功了。
DUMMY
-----
X
4、在本地數據爲中查詢已經建立的遠程連接名:
SQL> select owner,object_name from dba_objects where object_type='DATABASE LINK';
OWNER OBJECT_NAME
------------------------------ --------------------------------------------------------------------------------
SYSTEM SIDBJ.US.ORACLE.COM
USERXJ DBLINK_XJ_TO_BJ
USERXJ SIDBJ

5、至此,在昆明的計算機上建立了一個DBLINK,用於連接到北京的數據庫上,
在昆明的數據庫中查詢北京的數據庫中表的信息:

select * from
[email protected]
查詢結果:
STU_ID STU_NAME
---------- --------------------------------------------------------------------------------
1 張三
表示查詢是正常的。
6、關於global_name參數的測試
create database link a connect to userbj identified by bj123 using 'tns_xj_to_bj';
建立了一個DBLINK,執行下面的查詢:

select owner,object_name from dba_objects where object_type='DATABASE LINK';
可以看到已經建立了名爲:a的DBLINK。

但執行下面的查詢,檢索遠程數據時,就會出現錯誤。

select * from
bj_test@a
原因是因爲本地數據庫的global_names的參數值爲true,所以,dblink的名稱必須和遠程數據庫的global_names相同。
要修改本地數據庫的global_names參數爲false;(注意是修改本地數據庫SIDXJ,通過測試修改過程的參數不行,過程的global_names參數爲TRUE還是爲FALSE沒有關係
)
使用下面的語句修改該參數:

SQL> alter system set global_names=false;
再執行下面的幾步即可查詢出數據:
create database link a connect to userbj identified by bj123 using 'tns_xj_to_bj'; --創建DBLINK
select owner,object_name from dba_objects where object_type='DATABASE LINK';--查詢現有的DBLINK

select * from bj_test@a--查詢遠程表
7、下面在SIDXJ中建立存儲過程,通過DBLINK檢索遠程數據庫SIDBJ, 存儲過程如下:
CREATE OR REPLACE PROCEDURE test_cur
as
strSql1 varchar2(1000);
t_stu_name varchar2(100);
TYPE TCUR IS REF CURSOR;
CUR TCUR;
begin
strSql1:='select stu_name from
bj_test@a';
OPEN CUR FOR strSql1;
LOOP
FETCH CUR INTO t_stu_name;
EXIT WHEN CUR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(t_stu_name);
END LOOP;
CLOSE CUR;
end test_cur;
測試存儲過程顯示,輸出了過程數據庫中的STU_NAME的值。
以上腳本全部在ORACLE914下通過測試。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章