利用DB Link實現資料庫間的表同步
利用DB Link實現資料庫間的表同步
######################################
使用create Database link語句建立資料庫連結。資料庫連結是本地資料庫中的模式物件,利用它可以訪問遠端資料庫的物件。遠端資料庫不必是Oracle系統。
一旦建立了資料庫連結,就可以用它來引用遠端資料庫上的表和檢視。在表或檢視名後附加@[dblink],就可以在SQL語句中引用遠端表或檢視。
用select語句可以查詢遠端表或檢視。如果正以分散式選項使用Oracle,還可以使用任何insert、update、delete或lock table語句訪問遠端表或檢視。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1 檢視dblink
SQL> select owner,object_name from dba_objects where object_type='DATABASE LINK';
OWNER
------------------------------
OBJECT_NAME
-----------------------------------------------------------------------
PUBLIC
DBLINK1
PUBLIC
DBLINK2
PUBLIC
DBLINK3
或者
select * from dba_db_links;
#######################################
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
建立dblink
前提:
建立dblink的使用者有對應的資料庫許可權
create public database link 或者create database link
可以使用
grant create public database link,create database link to myAccount;
來授權.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
如果在create之後不加public,則建立的dblink就不是公共的,就只有建立者可以使用了.
補充:
如何確定目標資料庫的servicename:
a.在sqlplus中使用
show parameter[s] service_names;
注意parameter和parameters都可以
b.或者
SQL> select name,value from v$parameter where name='service_names';
NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
service_names
testdb
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
**********************************************************************************
2 建立dblink
語法
CREATE [SHARED][PUBLIC] DATABASE LINK dblink
CONNECT TO [username IDENTIFIED BY password authenticated_clause|| CURRENT_USER]
USING ‘connectstring’
關鍵字和引數
shared:指定shared使用一個單獨的網路連線建立可被多個使用者共享的公用資料庫連結。
public:建立可被全體使用者使用的公用資料庫連結。若省略該子句,資料庫連結為私有的,只能由建立者使用。
dblink:指定資料庫連結的完整名或部分名。GLOBAL_NAMES初始化引數決定資料庫連結是否必須具有與該連結相連的資料庫的相同的名字。
在一個會話或真正的應用叢集配置中的一個例項可以開啟的資料庫連結的最大數量,取決於初始化引數OPEN_LINKS和OPEN_LINKS_PER_INSTANCE的值。
限定:不能在其他使用者的模式中建立資料庫連結,不能用模式名限定dblink(在資料庫連結名中允許有“.”字元,所以Oracle將全名,如RALPH.LINKTOSALES,
解釋為你的模式中的資料庫連結名,而不是RALPH模式中的LINKTOSALES資料庫連結。
connect to子句:connect to子句允許啟用對遠端資料庫的連線。
CURRENT_USER子句:使用CURRENT_USER建立當前使用者的資料庫連結。為使連結成功,當前使用者必須是在遠端資料庫上具有有效賬戶的全域性使用者。
若直接使用資料庫連結(即不是從儲存物件中使用),當前使用者即為被連線的使用者。
當執行儲存物件(如過程、檢視或觸發器)啟用資料庫連結時,CURRENT_USER是擁有儲存物件的使用者名稱,而不是呼叫物件的使用者名稱。例如,若資料庫連結出現在過程SCOTT.P(由SCOTT建立)內部並且使用者JANE呼叫過程SCOTT.P,當前使用者是SCOTT。
但是,若儲存物件是一個呼叫方權利(invoker-right)函式、過程或包,呼叫方的授權ID用於連線作為遠端使用者。例如,資料庫連結出現在過程SCOTT.P(由SCOTT建立的呼叫方權利過程)的內部,使用者JANE呼叫該過程,那麼CURRENT_USER是JANE並且用JANE的許可權執行該過程。
user IDENTIFIED BY password:是使用固定使用者資料庫連結連線遠端資料庫的使用者名稱和口令。若省略該子句,資料庫連結使用連線到資料庫的每個的使用者的名字和口令(這稱為連線的使用者資料庫連結)。
authenticated_clause:指定目標例項上的使用者名稱和口令。該子句在遠端伺服器驗證使用者,是安全性所必須的。指定的使用者名稱和口令必須是遠端例項上的有效使用者名稱和口令。使用者名稱和口令只用於驗證。其他操作不以該使用者的名義執行。
使用SHARED子句時必須指定該子句。
USING 'connect string':指定遠端資料庫的服務名。
example:
create public database link dblink1
connect to sales identified by sales
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.9.142)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = heksales)
)
)';
host=資料庫的ip地址
service_name=資料庫的ssid。
資料庫連線字串可以用NET8 EASY CONFIG或者直接修改TNSNAMES.ORA裡定義
資料庫全域性名稱可以用以下命令查出
SELECT * FROM GLOBAL_NAME;
需要DB支援Advanced replication(高階複製)功能,是否支援,可用如下SQL檢視:
SQL> select * from v$option where PARAMETER='Advanced replication';
PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
Advanced replication
TRUE
SQL>
如果是返回True就表示支援。
檢視Global_name引數是true還是False
SQL> show parameter global_name;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
global_names boolean FALSE
SQL>
該引數為true時,在本地建立的DBLINK的名稱必須和遠端的Global_name一致才行。
create public database link dblink1
connect to GGSYNC identified by "123456"
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.9.142)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = testdb)
)
)';
insert into GGSYNC.GG_SYNC_TESTDB select * from GGSYNC.GG_SYNC_TESTDB@dblink1;
create public database link dblink2
connect to test1 identified by "123456"
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.9.142)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = testdb)
)
)';
create public database link dblink3
connect to test2 identified by "123456"
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.9.142)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = testdb)
)
)';
insert into test1.t1 select * from test1.t1@dblink2;
insert into test1.t2 select * from test1.t1@dblink2;
insert into test2.t1 select * from test2.t1@dblink3;
insert into test2.t2 select * from test2.t1@dblink3;
**********************************************************************************
3 使用db link
例如,在本機資料庫上建立了一個scott_rmthost的public dblink(使用遠端主機的scott使用者連線),則用sqlplus連線到本機資料庫,
執行select * from scott.emp@scott_rmthot即可以將遠端資料庫上的scott使用者下的emp表中的資料獲取到.
也可以在本地建一個同義詞來指向scott.emp@scott_rmthost,這樣取值就方便多了.
可建立同義詞省略@dblink字尾
CREATE SYNONYM 同義詞名FOR 表名;
CREATE SYNONYM 同義詞名FOR 表名@資料庫連結名;
*********************************************************************************
*********************************************************************************
4 刪除
注意:使用者有create public database link 或者create database link 許可權.
drop public database link dblinkname;
*********************************************************************************
######################################
使用create Database link語句建立資料庫連結。資料庫連結是本地資料庫中的模式物件,利用它可以訪問遠端資料庫的物件。遠端資料庫不必是Oracle系統。
一旦建立了資料庫連結,就可以用它來引用遠端資料庫上的表和檢視。在表或檢視名後附加@[dblink],就可以在SQL語句中引用遠端表或檢視。
用select語句可以查詢遠端表或檢視。如果正以分散式選項使用Oracle,還可以使用任何insert、update、delete或lock table語句訪問遠端表或檢視。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1 檢視dblink
SQL> select owner,object_name from dba_objects where object_type='DATABASE LINK';
OWNER
------------------------------
OBJECT_NAME
-----------------------------------------------------------------------
PUBLIC
DBLINK1
PUBLIC
DBLINK2
PUBLIC
DBLINK3
或者
select * from dba_db_links;
#######################################
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
建立dblink
前提:
建立dblink的使用者有對應的資料庫許可權
create public database link 或者create database link
可以使用
grant create public database link,create database link to myAccount;
來授權.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
如果在create之後不加public,則建立的dblink就不是公共的,就只有建立者可以使用了.
補充:
如何確定目標資料庫的servicename:
a.在sqlplus中使用
show parameter[s] service_names;
注意parameter和parameters都可以
b.或者
SQL> select name,value from v$parameter where name='service_names';
NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
service_names
testdb
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
**********************************************************************************
2 建立dblink
語法
CREATE [SHARED][PUBLIC] DATABASE LINK dblink
CONNECT TO [username IDENTIFIED BY password authenticated_clause|| CURRENT_USER]
USING ‘connectstring’
關鍵字和引數
shared:指定shared使用一個單獨的網路連線建立可被多個使用者共享的公用資料庫連結。
public:建立可被全體使用者使用的公用資料庫連結。若省略該子句,資料庫連結為私有的,只能由建立者使用。
dblink:指定資料庫連結的完整名或部分名。GLOBAL_NAMES初始化引數決定資料庫連結是否必須具有與該連結相連的資料庫的相同的名字。
在一個會話或真正的應用叢集配置中的一個例項可以開啟的資料庫連結的最大數量,取決於初始化引數OPEN_LINKS和OPEN_LINKS_PER_INSTANCE的值。
限定:不能在其他使用者的模式中建立資料庫連結,不能用模式名限定dblink(在資料庫連結名中允許有“.”字元,所以Oracle將全名,如RALPH.LINKTOSALES,
解釋為你的模式中的資料庫連結名,而不是RALPH模式中的LINKTOSALES資料庫連結。
connect to子句:connect to子句允許啟用對遠端資料庫的連線。
CURRENT_USER子句:使用CURRENT_USER建立當前使用者的資料庫連結。為使連結成功,當前使用者必須是在遠端資料庫上具有有效賬戶的全域性使用者。
若直接使用資料庫連結(即不是從儲存物件中使用),當前使用者即為被連線的使用者。
當執行儲存物件(如過程、檢視或觸發器)啟用資料庫連結時,CURRENT_USER是擁有儲存物件的使用者名稱,而不是呼叫物件的使用者名稱。例如,若資料庫連結出現在過程SCOTT.P(由SCOTT建立)內部並且使用者JANE呼叫過程SCOTT.P,當前使用者是SCOTT。
但是,若儲存物件是一個呼叫方權利(invoker-right)函式、過程或包,呼叫方的授權ID用於連線作為遠端使用者。例如,資料庫連結出現在過程SCOTT.P(由SCOTT建立的呼叫方權利過程)的內部,使用者JANE呼叫該過程,那麼CURRENT_USER是JANE並且用JANE的許可權執行該過程。
user IDENTIFIED BY password:是使用固定使用者資料庫連結連線遠端資料庫的使用者名稱和口令。若省略該子句,資料庫連結使用連線到資料庫的每個的使用者的名字和口令(這稱為連線的使用者資料庫連結)。
authenticated_clause:指定目標例項上的使用者名稱和口令。該子句在遠端伺服器驗證使用者,是安全性所必須的。指定的使用者名稱和口令必須是遠端例項上的有效使用者名稱和口令。使用者名稱和口令只用於驗證。其他操作不以該使用者的名義執行。
使用SHARED子句時必須指定該子句。
USING 'connect string':指定遠端資料庫的服務名。
example:
create public database link dblink1
connect to sales identified by sales
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.9.142)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = heksales)
)
)';
host=資料庫的ip地址
service_name=資料庫的ssid。
資料庫連線字串可以用NET8 EASY CONFIG或者直接修改TNSNAMES.ORA裡定義
資料庫全域性名稱可以用以下命令查出
SELECT * FROM GLOBAL_NAME;
需要DB支援Advanced replication(高階複製)功能,是否支援,可用如下SQL檢視:
SQL> select * from v$option where PARAMETER='Advanced replication';
PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
Advanced replication
TRUE
SQL>
如果是返回True就表示支援。
檢視Global_name引數是true還是False
SQL> show parameter global_name;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
global_names boolean FALSE
SQL>
該引數為true時,在本地建立的DBLINK的名稱必須和遠端的Global_name一致才行。
create public database link dblink1
connect to GGSYNC identified by "123456"
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.9.142)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = testdb)
)
)';
insert into GGSYNC.GG_SYNC_TESTDB select * from GGSYNC.GG_SYNC_TESTDB@dblink1;
create public database link dblink2
connect to test1 identified by "123456"
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.9.142)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = testdb)
)
)';
create public database link dblink3
connect to test2 identified by "123456"
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.9.142)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = testdb)
)
)';
insert into test1.t1 select * from test1.t1@dblink2;
insert into test1.t2 select * from test1.t1@dblink2;
insert into test2.t1 select * from test2.t1@dblink3;
insert into test2.t2 select * from test2.t1@dblink3;
**********************************************************************************
3 使用db link
例如,在本機資料庫上建立了一個scott_rmthost的public dblink(使用遠端主機的scott使用者連線),則用sqlplus連線到本機資料庫,
執行select * from scott.emp@scott_rmthot即可以將遠端資料庫上的scott使用者下的emp表中的資料獲取到.
也可以在本地建一個同義詞來指向scott.emp@scott_rmthost,這樣取值就方便多了.
可建立同義詞省略@dblink字尾
CREATE SYNONYM 同義詞名FOR 表名;
CREATE SYNONYM 同義詞名FOR 表名@資料庫連結名;
*********************************************************************************
*********************************************************************************
4 刪除
注意:使用者有create public database link 或者create database link 許可權.
drop public database link dblinkname;
*********************************************************************************
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29500582/viewspace-1314580/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE資料庫的中的db-linkOracle資料庫
- 利用python實現mysql資料庫向sqlserver的同步PythonMySql資料庫Server
- DB2建立資料庫,建立表空間DB2資料庫
- 教你如何運用python實現不同資料庫間資料同步功能Python資料庫
- 利用 DB 實現分散式鎖的思路分散式
- MySQL下的DB LinkMySql
- 技術乾貨|如何利用 ChunJun 實現資料實時同步?
- 如何有效利用資料庫中間表這把雙刃劍資料庫
- PostgreSQL:表空間-->資料庫-->表SQL資料庫
- Restcloud ETl資料通過時間戳實現增量資料同步RESTCloud時間戳
- 資料庫系列——基於Canal實現MySQL增量資料同步資料庫MySql
- 美團DB資料同步到資料倉儲的架構與實踐架構
- 分享自研實現的多資料來源(支援同DB不同表、跨DB表、記憶體資料、外部系統資料等)分頁查詢工具類實現原理及使用記憶體
- 技術乾貨|如何利用 ChunJun 實現資料離線同步?
- 利用Java的API實現HBase資料庫的增刪查改JavaAPI資料庫
- 實現報表資料分庫儲存
- 潤乾報表實現中間資料外接
- db2 資料庫DB2資料庫
- DB資料庫面試資料庫面試
- 利用Dbutils實現往兩個有關聯的表新增資料
- 利用LangGraph和Waii實現你的chat2db!AI
- (7)資料庫讀寫分離,主從同步實現方法(資料庫設定)資料庫主從同步
- 如實實現不同資料庫之間的 (模型) Eloquent: 關聯資料庫模型
- 高效資料移動指南 | 如何快速實現資料庫 SQL Server 到 Dameng 的資料同步?資料庫SQLServer
- 巧妙利用 iframe,實現和 Ajax 一樣的非同步提交表單效果非同步
- 資料庫讀寫分離,主從同步實現方法資料庫主從同步
- linux下mysql主從複製,實現資料庫同步LinuxMySql資料庫
- 如何在 PyQt 中實現非同步資料庫請求QT非同步資料庫
- c++11 執行緒間同步---利用std::condition_variable實現C++執行緒
- 資料庫同步資料庫
- 【SQL】Oracle資料庫通過job定期重建同步表資料SQLOracle資料庫
- 如何實現資料庫資料到Abp vnext實體物件的同步?以及程式碼生成工具資料庫物件
- 直播帶貨系統原始碼,實現MYSQL資料庫的主從同步原始碼MySql資料庫主從同步
- [20180823]IMU與db link.txt
- linux 利用rsync實現檔案增量同步Linux
- 達夢資料庫表空間管理方法及實戰演示資料庫
- 利用Kettle進行資料同步(下)
- 利用Kettle進行資料同步(上)
- 如何高效實現 MySQL 與 elasticsearch 的資料同步MySqlElasticsearch