多个oracle数据库之间数据共享-database link

    dblink 是数据库对数据库的访问, 可以用来做分布式处理(分布式处理:就是在一次事务中,同时处理多个数据库中的数据,将一个工作分配到了多个数据库,这种跨多个库的事务处理,就是分布式处理),而客户端一个时间点只能访问一个数据库
 (两台不同的数据库服务器,从一台数据库服务器的一个用户读取另一台数据库服务器下的某个用户的数据,这个时候可以使用dblink。)
   其实dblink和数据库中的view差不多,建dblink的时候需要知道待读取数据库的ip地址,ssid以及数据库用户名和密码。
   首先说下DBLINK吧。
  比方说有两个数据库A/B,DBLINK可以提供在A数据库上操作B的数据。
  例子:
  SELECT * form TABLE_A@DBLINK
  在数据库上每创建一个DBLINK,就会往link$这个表放记录,里面的密码是明码,所以设置了权限,不是每个用户都可以看到的

    因为公司的掌上城市系统在多个地势同时上线,而为了让每个城市的3G快讯具有地势特色性,每个地势有自己单独的数据库系统,而每个地势的快讯又一些共同的,譬如突然出了一条国际新闻,那么是不是每个地势的后台编辑都要录入一遍,这样无疑是做了许多无用功,所以公司考虑架设一个总站,总站上有专门的人负责,每天负责录入一些通用的,不具有地势特色的新闻资讯,而各个城市的数据库都将共享总站的内容,同时又具有本地特色的资讯,同时解放了人力资源,各个城市可以集中于地势特色的建设上。

这样的方案,在技术上,就演变成了数据库之间的数据共享,每当录入总站录入数据的时候,调用触发器,通过databaselink向其它各个分站同步数据

     用到oracle的database link,之前也没接触过,这两天依据资料摸索了一下,做个记录如下:

作用:将多个oracle数据库逻辑上看成一个数据库,也就是说在一个数据库中可以操作另一个数据库中的对象。

语法:
     CREATE [PUBLIC] DATABASE LINK dblink CONNECT TO user IDENTIFIED BY password USING ‘connect_string’;
     DROP [PUBLIC] DATABASE LINK dblink;
     注意:你必须有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的权限(可用sys身份去分配),另外,在你要连接的数据库上,的权限.

参数说明:
    dblink: 你所创建的database link的名字,
    user和password:要连接的数据库的用户名和密码
    connect_string:可以是经过Net Manager配置的(tnsnames.ora)且经测试可以连接的服务名,不过也可写成这种形式,更直接:(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.116.200)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME =orcl) )

使用:
select * from scott@dblink ;
UPDATE scott@dblink m set m.type_name='83-6' where m.type_id =6;

具体步骤:

1、 链接字符串即服务名,首先在本地配置一个服务名,地址指向远程的数据库地址,当然也可向下面那样直接写的。  
2、创建数据库链接(前提是已分配相应权限),进入系统管理员SQL>操作符下,运行命令:
create database link scott_dblink

connect to scott identified by tiger

using '(DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.166.200)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = orcl) –这个service_name是您要链接到的数据库服务端的服务名

    )

)';

则创建了一个以scott用户和orcl数据库的链接scott_dblink

   host=数据库的ip地址,service_name=数据库的ssid。

数据库连接字符串可以用NET8 EASY CONFIG或者直接修改TNSNAMES.ORA里定义.

 

数据库参数global_name=true时要求数据库链接名称跟远端数据库名称一样

数据库全局名称可以用以下命令查出
SELECT * FROM GLOBAL_NAME;

 如何查看Global_name参数是true还是False

SQL> show parameter global_name;

NAME                                 TYPE               VALUE
------------------------------------ ----------- -------------
global_names                         boolean     FALSE

 

3.使用database link

select * from emp@scott_dblink ;

查询远端数据库里的表
SELECT ...... FROM 表名@数据库链接名;
查询、删除和插入数据和操作本地的数据库是一样的,只不过表名需要写成"表名@dblink服务器"而已。
UPDATE emp@scott_dblink set jop='CEO' ;

4、查看所有的数据库链接,进入系统管理员SQL>操作符下,运行命令:
SQL>select owner,object_name from dba_objects where object_type='DATABASE LINK';
5、查看数据库连接
sql> select owner, db_link from dba_db_links;
ower db_link

6、删除数据库连接
drop databaselink db_link
补充:同步数据时设计的巧妙之处:在触发器中,为了避免总分站资讯id冲突,创建序列的时候设计为总站中id始终为奇数,而分站中则只为偶数,这样就可以达到总分站相应资讯id一致,根据id再通过database link 进行同时的增删改,分站的数据则会跟着总站的同步。
 
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值