利用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;
*********************************************************************************
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29500582/viewspace-1314580/,如需转载,请注明出处,否则将追究法律责任。