物理上存放於網絡的多個ORACLE數據庫,邏輯上可以看成一個單一的大型數據庫,用戶可以通過網絡對異地數據庫中的數據進行存取,而服務器之間的協同處理對於工作站用戶及應用程序而言是完全透明的,開發人員無需關心網絡的鏈接細節、數據在網絡節點中的具體分布情況和服務器間的協調工作過程。
數據庫之間的鏈接建立在DATABASE LINK上。要創建一個DATABASE LINK,必須首先在建立鏈接的數據庫上設置鏈接字符串,即配置一個遠程數據庫的本地網絡服務名。
鏈接字符串的配置參見《客戶端連接服務器》一節。
數據庫全局名稱可以用以下命令查出:
SELECT * FROM GLOBAL_NAME;
修改可以用以下語句來修改參數值:
ALTER SYSTEM SET GLOBAL_NAME=TRUE/FALSE;
<1>、當數據庫參數global_name=false時,就不要求數據庫鏈接名稱跟遠端數據庫名稱一樣。
oracle數據庫之間進行連接通訊。
創建數據庫鏈接的語法如下:
create database link
CREATE [PUBLIC] DATABASE LINK link
CONNECT TO username IDENTIFIED BY password
USING ‘connectstring’
其中:
--demona為用net8 easy config創建的連接字符串
目的方數據庫的init.ora文件中的global_names設為false
重新啟動數據庫設置才能生效
或者用sys用戶執行
注意:創建數據庫鏈接的帳號必須有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的系統權限,用來登錄到遠程數據庫的帳號必須有CREATE SESSION權限。這兩種權限都包含在CONNECT角色中(CREATE PUBLIC DATABASE LINK權限在DBA中)。
一個公用數據庫鏈接對於數據庫中的所有用戶都是可用的,而一個私有鏈接僅對創建它的用戶可用。由一個用戶給另外一個用戶授權私有數據庫鏈接是不可能的,一個數據庫鏈接要麼是公用的,要麼是私有的。
創建數據庫鏈接時,還可以使用缺省登錄方式,即不指定遠程數據庫的用戶名和密碼:
create public database link zrhs_link
using ‘zrhs’;
在不指定用戶名和口令的情況下,ORACLE使用當前的用戶名和口令登錄到遠程數據庫。
USING後面指定的是鏈接字符串,也就是遠程數據庫的網絡服務名,這個服務名保存在TNSNAMES.ORA文件中,在該文件中定義了協議、主機名、端口和數據庫名。
刪除數據庫鏈接的語句是:
DROP [PUBLIC] DATABASE LINK zrhs_link
數據庫鏈接的引用
一般情況下引用數據庫鏈接,可以直接將其放到調用的表名或視圖名稱後面,中間使用一個 @ 作為分割符:
SELECT * FROM worker@zrhs_link;
對於經常使用的數據庫鏈接,可以建立一個本地的同義詞,方便使用:
CREATE SYNONYM worker_syn FOR worker@zrhs_link;
還可以建立一個本地的遠程視圖,方便使用:
CREATE VIEW worker AS SELECT * FROM worker@zrhs_link where… ;
現在本視圖可與本地數據庫中的任何其它視圖一樣對待,也可以授權給其它用戶,訪問此視圖,但該用戶必須有訪問數據庫鏈接的權限。
對於另外一種情況,所要訪問的表不在數據庫鏈接中指定的遠程帳戶下,但該帳戶有訪問該表的權限,那麼我們在表名前要加上該表的用戶名:
SELECT * FROM camel.worker@zrhs_link ;
<2>、當數據庫參數global_name=true時,那就要求數據庫鏈接名稱跟遠端數據庫名稱一樣
數據庫全局名稱可以用以下命令查出
SELECT * FROM GLOBAL_NAME;
atabase link(dblink)--數據庫鏈路
創建dblink的語法:
sql>create database link 數據庫鏈路名
connect to 用戶名 identified by 口令
using '主機字符串名';
如:
sql>create database link ora9i.us.oracle.com ### 這裡的us.oracle.com為oracle默認域名 ###
connect to scott identified by tiger
using 'sun';
1)dblink名必須與遠程數據庫的全局數據庫名(global_name)相同;
2)用戶名,口令為遠程數據庫用戶名,口令;
3)主機字符串為本機tnsnames.ora中定義的串;
4)兩個同名的數據庫間不得建立dblink;
然後,你就可以通過dblink訪問遠程數據庫了。
如:
sql>select * from 表名@ora9i.us.oracle.com;
還可以建立快照(snapshot)通過dblink實現遠程數據自動傳輸。
查看所有的數據庫鏈接,進入系統管理員SQL>操作符下,運行命令:
SQL>select owner,object_name from dba_objects where object_type='DATABASE LINK'
-------------------------------------------------------------------------------------------------------------------
兩台不同的數據庫服務器,從一台數據庫服務器的一個用戶讀取另一台數據庫服務器下的某個用戶的數據,這個時候可以使用dblink。
其實dblink和數據庫中的view差不多,建dblink的時候需要知道待讀取數據庫的ip地址,ssid以及數據庫用戶名和密碼。
創建可以采用兩種方式:
1、已經配置本地服務
以下是引用片段:
create public database
link fwq12 connect to fzept
identified by neu using 'fjept'
CREATE DATABASE LINK數據庫鏈接名CONNECT TO 用戶名 IDENTIFIED BY 密碼 USING ‘本地配置的數據的實例名’;
2、未配置本地服務
以下是引用片段:
create database link linkfwq
connect to fzept identified by neu
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.142.202.12)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = fjept)
)
)';
host=數據庫的ip地址,service_name=數據庫的ssid。
其實兩種方法配置dblink是差不多的,我個人感覺還是第二種方法比較好,這樣不受本地服務的影響。
數據庫連接字符串可以用NET8 EASY CONFIG或者直接修改TNSNAMES.ORA裡定義.
數據庫參數global_name=true時要求數據庫鏈接名稱跟遠端數據庫名稱一樣
數據庫全局名稱可以用以下命令查出
SELECT * FROM GLOBAL_NAME;
查詢遠端數據庫裡的表
SELECT …… FROM 表名@數據庫鏈接名;
查詢、刪除和插入數據和操作本地的數據庫是一樣的,只不過表名需要寫成“表名@dblink服務器”而已。
附帶說下同義詞創建:
CREATE SYNONYM同義詞名FOR 表名;
CREATE SYNONYM同義詞名FOR 表名@數據庫鏈接名;
刪除dblink:DROP PUBLIC DATABASE LINK linkfwq。
如果創建全局dblink,必須使用systm或sys用戶,在database前加public。