1. 前言
dblink 介绍 :
dblink(Database Link)数据库链接顾名思义就是数据库的链接 [1] ,就像电话线一样,是一个通道,当我们要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中就必须要创建远程数据库的dblink,通过dblink本地数据库可以像访问本地数据库一样访问远程数据库表中的数据。
创建dblink语法:
CREATE [SHARED] [PUBLIC] database link link_name
[CONNECT TO [user] [current_user] IDENTIFIED BY [password]
[AUTHENTICATED BY user IDENTIFIED BY password]
[USING 'connect_string']
权限:
创建数据库链接的帐号必须有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的系统权限,用来登录到远程数据库的帐号必须有CREATE SESSION权限。这两种权限都包含在CONNECT角色中(CREATE PUBLIC DATABASE LINK权限在DBA中)。一个公用数据库链接对于数据库中的所有用户都是可用的,而一个私有链接仅对创建它的用户可用。由一个用户给另外一个用户授权私 有数据库链接是不可能的,一个数据库链接要么是公用的,要么是私有的。
2.场景(demo)
2.1 dblink 提供给对方数据 (只提供对应表的查看权限)
权限问题:
基于数据安全考虑,不要用sys用户建dblink ,正确方式:
新建一个有创建dblink权限的用户,再授予这个用户查看对应表的权限 (由于需要提供用户名和密码,防止用户访问其他表,以及修改表信息)
(该部分在自己数据库操作):
-- 执行sql 用户:dba权限用户
-- 新建一个用户
create user USER1 identified by passwd
--授予该用户创建dblink权限
grant connect to USER1;
-- 指定表授权查询权限。 如果是sys用户 要指定用户
grant select on USER2.tablename to USER1;
以上 ,好了之后 就可以提供给对方系统如下信息,供对方系统建立dblink 访问我们的 USER2.tablename 表:
数据库ip ,端口 ,USER1 用户名密码, 服务名 , USER2.tablename 用户名及表名
为了对方使用方便,通常情况下,直接给创建dblink语句,对方直接在对方数据库执行,demo:
(该部分提供给对方数据库): 【提供之前建议找个其他库测试一下】
--数据tablename
--创建dblink:
create public database link ECS_DBLINK
connect to USER1 identified by passwd
using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 172.16.3.xx)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = xxxx)))';
--数据表名称: tablename
--查询语句:
SELECT * FROM USER2.tablename@ECS_DBLINK;
2.1 dblink方式访问其他库数据
由上可知,如果对方系统不给建dblink语句 ,需要找对方系统 要 :
- 数据库ip ,
- 端口 ,
- USER1 用户名密码,
- 服务名 ,
- 你要访问的数据对应的 USER2.tablename 用户名及表名
在数据库执行 create public database link......语句即可。【同上】
2.数据库为集群
tns 如下 有多个ip ,说明数据库部署的是集群模式
PROD_BALANCE=(DESCRIPTION=
(ADDRESS_LIST=
(LOAD_BALANCE=YES)
(FAILOVER=YES)
(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.18.xx)(PORT=1521))
(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.18.xx)(PORT=1521))
)
(CONNECT_DATA=
(SERVICE_NAME=xxxxx)
)
)
那对应的创建dblink的语句 多加个ip
create database link ECS_DBLINK
connect to USER1 identified by passwd
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.3.xx)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.4.xx)(PORT = 1521))
(FAILOVER = on)
(LOAD_BALANCE = on)
)
(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = xxxx)))';
-- 负载均衡 LOAD_BALANCE = on