作用:將多個不同地點的服務器的oracle數據庫邏輯上看成一個數據庫,也就是說在一個數據庫中可以操作另一個遠程的數據庫中的對象。
語法:
CREATE [PUBLIC] DATABASE LINK dblink CONNECT TO user IDENTIFIED BY password USING ‘connect_string‘;
DROP [PUBLIC] DATABASE LINK dblink;
注意:你必須有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的權限(可用sys身份去分配),另外,在你要連接的數據庫上的權限.
grant CREATE DATABASE LINK to hr;
參數說明:
dblink: 你所創建的database link的名字,
user和password:要連接的數據庫的用戶名和密碼
connect_string:可以是經過Net Manager配置的(tnsnames.ora)且經測試可以連接的服務名,不過也更直接用tnsnames裏的字符串:(DESCRIPTION =
(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = even.oracle.com)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME =orcl) )
通過SHOW PARAMETER GLOBAL_NAMES,可以查看到其值是FALSE或者TRUE。
一)對於GLOBAL_NAMES=FALSE的情況,則DBLINK的名稱可以自定義,相關的過程如下:
實現從本地數據庫連接到遠端數據庫服務器:
遠程服務器要配置監聽並且啓動它
本地服務器要配置tnsnames
實現在本地服務器上連接到遠程服務器數據庫:
在本地數據庫上,創建連接:
1、 鏈接字符串即服務名,首先在本地配置一個服務名,地址指向遠程的數據庫地址,當然也直接寫的連接字符串。
2、創建數據庫鏈接(前提是已分配相應權限),
SQL> grant CREATE DATABASE LINK to hr;
Grant succeeded.
SQL> CREATE DATABASE LINK LinkRemoteTestDB CONNECT TO hr IDENTIFIED BY hr USING 'test';
Database link created.
當然也可以直接寫連接字符串
SQL>create database link LinkRemoteTestDB2 connect to hr identified by hr
using 'TEST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = even.oracle.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = test)
)
)';
則創建了一個以hr用戶和TEST數據庫的鏈接LinkRemoteTestDB.
3.使用database link來查詢遠程HR schema下的testdblink 表信息
SQL> select * from testdblink@LinkRemoteTestDB;
ID NAME
---------- ----------------------------------------
1 Watson
2 John
通過執行select * from testdblink@LinkRemoteTestDB; 進行測試,結果OK
二)對於GLOBAL_NAMES = TRUE的情況,數據庫鏈接(DATABASE LINK)的名字必須和數據庫的名字相同:
在本地服務器上執行下面語句使GLOBAL_NAMES=TRUE:
SQL>ALTER SYSTEM SET GLOBAL_NAMES=TRUE;
再查詢時,會有如下的錯誤:
SQL> select * from testdblink@LinkRemoteTestDB;
select * from testdblink@LinkRemoteTestDB
*
ERROR at line 1:
ORA-02085: database link LINKREMOTETESTDB.REGRESS.RDBMS.DEV.US.ORACLE.COM
connects to TEST.REGRESS.RDBMS.DEV.US.ORACLE.COM
登錄遠端數據庫,通過執行
SQL>SELECT * FROM GLOBAL_NAME;得到其數據庫全名爲TEST.REGRESS.RDBMS.DEV.US.ORACLE.COM
用原方式SQL> CREATE DATABASE LINK LinkRemoteTestDB CONNECT TO hr IDENTIFIED BY hr USING 'test';創建過程不會出錯,但執行“select * from
testdblink@LinkRemoteTestDB;”的時候,就會出現ORA-02085: database link LINKREMOTETESTDB.REGRESS.RDBMS.DEV.US.ORACLE.COM
connects to TEST.REGRESS.RDBMS.DEV.US.ORACLE.COM的錯誤了
所以需要採用下面的方式創建DBLINK:
SQL> create database link TEST.REGRESS.RDBMS.DEV.US.ORACLE.COM connect to HR identified by HR using 'TEST';
Database link created.再次執行
SQL> select * from [email protected];
ID NAME
---------- ----------------------------------------
1 Watson
2 John
SQL> UPDATE [email protected] t set t.name='WatsonModified' where id=1;
1 row updated.
SQL> select * from [email protected];
ID NAME
---------- ----------------------------------------
1 WatsonModified
2 John
執行成功了!!!!!
DBLINK其他相關的知識:
1、查看所有的數據庫鏈接
SQL>select owner,object_name from dba_objects where object_type='DATABASE LINK';
SQL>select * from dba_db_links;
2、刪除數據庫連接
SQL> drop database link LinkRemoteTestDB;
Database link dropped.
例子:
create public database link tblink
connect to EM identified by em123456
using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 172.24.105.70)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = orcl)))';
select * FROM em_person_list@tblink;
exp_requisition_headers
drop public database link tblink;