有時候,需要在兩個Oracle數據庫之間手工同步數據時,DBLink是最方便快捷的手段之一,創建DBLink的方式一般是這樣:
1. create public database link <DBLink名稱> connect to <被連接庫的用戶名> identified by <被連接庫的密碼> using '<Oracle客戶端工具建立的指向被連接庫服務名>';
2. create public database link XMDS_KF connect to XMDS identified by XMDS using 'XMDS_KF';
[sql]
create public database link XMDS_KF connect to XMDS identified by XMDS using 'XMDS_KF';
但這種方式有個缺點就是必須要在服務器建立一個被連接庫的服務名,如果不建則會報錯:
ORA-12154: TNS: 無法處理服務名
,但如果直接使用地址來建DBLink,就可以省去配置服務名的麻煩了:
[sql]
<ol><li><span><span class="keyword">create</span><span> </span><span class="keyword">public</span><span> </span><span class="keyword">database</span><span> link XMDS_KF </span><span class="keyword">connect</span><span> </span><span class="keyword">to</span><span> XMDS identified </span><span class="keyword">by</span><span> XNDS using '(DESCRIPTION = </span></span></li><li><span> (ADDRESS_LIST = </span></li><li><span> (ADDRESS = (PROTOCOL = TCP)(HOST = 145.24.16.182)(PORT = 1521)) </span></li><li><span> ) </span></li><li><span> (CONNECT_DATA = </span></li><li><span> (SERVICE_NAME = XMDS) </span></li><li><span> ) </span></li><li><span> )'; </span></li></ol>
1.create public database link XMDS_KF connect to XMDS identified by XNDS using '(DESCRIPTION =
- (ADDRESS_LIST =
- (ADDRESS = (PROTOCOL = TCP)(HOST = 145.24.16.182)(PORT = 1521))
- )
- (CONNECT_DATA =
- (SERVICE_NAME = XMDS)
- )
8. )';
oracle dblink創建過程
兩台不同的數據庫服務器,從一台數據庫服務器的一個用戶讀取另一台數據庫服務器下的某個用戶的數據,這個時候可以使用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。
oracle dblink解決后台卻出現鎖
創建是很簡單,但是在使用中后台卻出現鎖,查看這個鎖的方法可以去console中看到或者查詢數據庫。其實這個鎖倒不是最讓人心煩的,而是每次使用dblink查詢的時候,均會與遠程數據庫創建一個連接,dblink應該不會自動釋放這個連接,如果是大量使用dblink查詢,會造成web項目的連接數不夠,導致系統無法正常運行。