Oracle數據庫鏈路的建立和使用
一、數據庫鏈路的建立:
1、數據庫鏈路的建立語法一般是:CREATE DATABASE LINK[db_link_name] CONNECT TO
[user_name] IDENTIFIED BY [password] USING '[tns_name]';
其中:
[DB_LINK_NAME]:是所要連接的數據庫的服務名,也就是該數據庫的真實名稱(通常就是SID)。
[USRE_NAME]:是所要連接的用戶名稱。
[PASSWORD]:是所要連接的用戶的密碼。
[TNS_NAME]:是所要連接的數據庫的服務命名,也就是在本機上建立的NET8服務命名。
2、當使用當前用戶做為連接者時,語法可以是:CREATE DATABASE LINK[db_link_name] CONNECT TO CURRENT_USER USING '[tns_name]' (某些情況下這種方法建立的數據庫鏈路都未處於活動狀態,不知道是不是語法有誤,暫不推薦使用)。
3、當使用已連接用戶做為連接者時,語法可以是:CREATE DATABASE LINK[db_link_name]
USING '[tns_name]' 。
4、要建立公共的數據庫鏈路語法可以是:只要在CREATE后加PUBLIC關鍵字就可以了。
5、假如你在init.ora文件里的global_names = true只能用上面的方法,如果global_names =false,[DB_LINK_NAME]不一定要是數據庫的真實名稱,可以是一個隨意的名字。也就是說,當global_names = true時,數據庫的每一個用戶只能有一個數據庫鏈路,而當global_names = false時,每一個用戶都可以建立N多個鏈路,但一般情況下是沒有意義的。
二、數據庫鏈路的使用:
1、數據庫鏈路的主要用途就是實現對遠程數據庫的訪問,你可以通過數據庫鏈路直接對遠程數據庫
的表進行讀寫,也可以在本地建立遠程數據庫的視圖和同意詞,另外在進行雙機熱備份時也要用到數據庫鏈路。
2、直接訪問:SELECT * FROM[user_name].[table_name]@[db_link_name];INSERT,UPDATE,DELETE等也同樣適用。
3、建立同義詞:CREATE SYNONYM[user_name].[synonym_name] FOR [user_name].[table_name]@
[db_link_name] ; 視圖也是一個道理。
4、由於雙機熱備是另一個復雜的問題,本文暫不贅述。如果想在兩個數據庫間實現幾個表的同步,做一個雙機太復雜,可以考慮用觸發器來解決,在觸發器中用以上方法引用遠程表,對其進行插入,刪除也可以做到同步。
數據庫之間的鏈接建立在DATABASE LINK上。要創建一個DB LINK,必須先在每個數據庫服務器上設置鏈接字符串。
1、鏈接字符串即服務名,首先在本地配置一個服務名,地址指向遠程的數據庫地址,服務名取為將來你要使用的數據庫鏈名:tobeijing
2、創建數據庫鏈接,
進入系統管理員SQL>操作符下,運行命令:
SQL>create public database link beijing connect to scott identified bytiger using 'tobeijing';
則創建了一個以scott用戶和北京數據庫的鏈接beijing,我們可以查詢北京的scott數據:
SQL>select * from emp@beijing;
這樣就可以把深圳和北京scott用戶的數據做成一個整體來處理。
3、建立同義詞,為了使有關分布式操作更透明,ORACLE數據庫里有同義詞的對象synonym
SQL>create synonym bjscottemp for emp@beijing;
於是就可以用bjscottemp來替代帶@符號的分布式鏈接操作emp@beijing。
4、查看所有的數據庫鏈接,進入系統管理員SQL>操作符下,運行命令:
SQL>select owner,object_name from dba_objects whereobject_type='DATABASE LINK';
如果使用數據連接出現錯誤ORA-02085
SQL> SHOW PARAMETER GLOBAL_NAMES
global_names boolean
TRUE
SQL> ALTER SYSTEM SET GLOBAL_NAMES=FALSE;
使用數據連接可以很方便的引用其它數據庫的數據,但是設置不當可能遇到ORA-02085錯誤。如果被連接對方的GLOBAL_NAMES參數設置成了TRUE,那么要求數據庫連接與對方實例名有相同的名稱。這樣就可以通過下面3中的任意一種方法來解決:
1.修改對方的GLOBAL_NAMES參數為FALSE
2.將對方的GLOBAL_NAME設置成與數據庫連接相同的名稱
3.將數據庫連接刪掉重新創建成與對方實例名相同的數據庫連接。下面是測試結果:
SQL> CREATE PUBLIC DATABASE LINK "MASTER.COM" USING 'ORA9I';
數據庫鏈接已創建。
select * from v$parameter where name = 'global_names';
SQL> ALTER SYSTEM SET GLOBAL_NAMES=FALSE;
或者修改D:\Oracle\admin\einfo\pfile\init.ora文件中global_names = false,重啟數據庫。
SQL> SELECT * FROM DUAL@MASTER.COM;
X
SQL> ALTER SYSTEM SET GLOBAL_NAMES=TRUE;
系統已更改。
SQL> SELECT * FROM DUAL@MASTER.COM;
SELECT * FROM DUAL@MASTER.COM
ERROR 位於第 1 行:
ORA-02085: 數據庫鏈接MASTER.COM與ORA9I相連結
SQL> ALTER DATABASE RENAME GLOBAL_NAME TO MASTER.COM;
數據庫已更改。
SQL> SELECT * FROM DUAL@MASTER.COM;
createuser GUEST_B identified by guest_b_psw default tablespace TABLE_SPACE temporarytablespace PCS_TEMP;
grantconnect to GUEST_B;
A使用管理員賬號為GUEST_B用戶授權兩個表,以下授以完全控制兩個表的權限。
代碼如下:
grantall on TABLE_A1 to guest_b;
grantall on TABLE_A2 to guest_b;
A在NetManager中建立到B數據庫服務器的NetServiceName,也可以修改在Oracle的安裝目錄下的文件\Oracle\network\admin\tnsnames.ora,在里面添加一個NetServiceName,如“TO_B”。
創建數據鏈路名為“GOTO_B”,要使用第四步創建的NetServiceName: TO_B。這里假設了B同樣創建了一個賬號guest_a/guest_a提供給A使用。
CREATE PUBLIC DATABASE LINK " GOTO_B"
CONNECT TO "GUEST_A" IDENTIFIED BY"guest_a"
USING ' TO_B ' ;
另提供一個范例,這個例子創建可以不用配置NetServiceName就可以直接創建:
--Drop existing database link
dropdatabase link TOCCIC;
--Create database link
createdatabase link TOCCIC
connect to ZTRY identified by ZTRY
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =fengwenwei)(PORT = 1521))
)
(CONNECT_DATA =
(SID = ZTRY)
)
)';
小結
1. 在創建鏈路時,如果是使用生成鏈路代碼測試連接不成功的話,請使用Enterprise Manager Console來創建。
2. 在注意兩邊的賬號使用對應,不要搞混。
3. 注意:Oracle中的SERVICE_NAME可以對應多個SID。
4. 注意如果鏈路建立不成功,請檢查Oracle中的參數配置是否正確,如:global_names需要設置為True。Oracle9i安裝時默認為False。