Oracle dblink详解
database link概述
database link是定义一个数据库到另一个数据库的路径的对象,database
link允许你查询远程表及执行远程程序。在任何分布式环境里,database都是必要的。另外要注意的是database
link是单向的连接。
在创建database link的时候,Oracle再数据字典中保存相关的database
link的信息,在使用database link的时候,Oracle通过Oracle
Net用用户预先定义好的连接信息访问相应的远程数据库以完成相应的工作。
建立database link之前需要确认的事项:
确认从local database到remote
database的网络连接是正常的,tnsping要能成功。
确认在remote database上面有相应的访问权限。
database link分类
类型 |
Owner |
描述 |
Private |
创建database link的user拥有该database link |
在本地数据库的特定的schema下建立的database link。只有建立该database link的schema的session能使用这个database |
Public |
Owner是PUBLIC. |
Public的database link是数据库级的,本地数据库中所有的拥有数据库访问权限的用户或pl/sql程序都能使用此database |
Global |
Owner是PUBLIC. |
Global的database link是网络级的,When |
创建dblink所需的权限
Privilege |
Database |
Required For |
CREATE DATABASE LINK |
Local |
Creation of a private database link. |
CREATE PUBLIC DATABASE LINK |
Local |
Creation of a public database link. |
CREATE SESSION |
Remote |
Creation of any type of database link. |
database link的使用
基本语法
CREATE [SHARED][PUBLIC] database link link_name
[CONNECT TO [user][current_user] IDENTIFIEDBY password]
[AUTHENTICATED BY user IDENTIFIED BY password]
[USING 'connect_string']
说明:
1) 权限:创建数据库链接的帐号必须有CREATE DATABASE LINK或CREATE
PUBLIC DATABASE LINK的系统权限,用来登录到远程数据库的帐号必须有CREATE
SESSION权限。这两种权限都包含在CONNECT角色中(CREATE
PUBLIC DATABASE LINK权限在DBA中)。一个公用数据库链接对于数据库中的所有用户都是可用的,而一个私有链接仅对创建它的用户可用。由一个用户给另外一个用户授权私有数据库链接是不可能的,一个数据库链接要么是公用的,要么是私有的。
2)link : 当source端的数据库GLOBAL_NAME=TRUE时,link名必须与远程数据库的全局数据库名global_name)相同;否则,可以任意命名。
3)current_user使用该选项是为了创建global类型的dblink。在分布式体系中存在多个数据库的话。如果想要在每一个数据库中都可以使用同样的名字来访问数据库a,那在每个数据库中都要创建一个到数据库a的db_link,太麻烦了。所以现在有这个选项。你只要创建一次。所有的数据库都可以使用这个db_link来访问了。要使用这个特性,必须有oracle
nameserver或者ORACLE目录服务器。并且数据库a的参数global_names=true.具体我也没有创建过,没有这个环境。
4)connectstring:连接字符串,tnsnames.ora中定义远程数据库的连接串,也可以在创建dblink的时候直接指定。
5)username、password:远程数据库的用户名,口令。如果不指定,则使用当前的用户名和口令登录到远程数据库,当创建connected
user类型的dblink时,需要如果采用数据字典验证,则需要两边数据库的用户名密码一致。
创建database link选项说明
取值 |
说明 |
不指定 |
默认值建立一个dedicated的连接,每一个使用database link的本地session都会对应有一个远程数据库的session。 |
SHARED |
创建一个共享的数据库连接,同时要指定database link_authentication。 |
共享链接更多资料
共享数据库链接是指该链接的多个用户可以共享同一个底层网络连接。例如,在有四位用户的MTS(多线程服务器)环境下,每一个共享服务器进程都将与远程服务器有一个物理链接,这四位用户共享这两个链接。
表面上,共享链接乍一听起来像是一件好事。在某些环境下的确如此,但是,当你考虑使用共享链接时,应当意识到这有许多局限性和警告:
如果你使用一个专用的服务器连接来连接到你的本地数据库,链接只能在你从那些连接中创建的多重会话间共享
。在MTS环境里,每一个共享服务器进程潜在地打开一个链接。所有的会话被同一共享服务器进程提供并且分享被那个进程打开的任意共享链接。因为在MTS环境里的一个共享服务器进程能够服务于许多用户连接,共享链接的使用可能导致打开的链接远多于所必须的链接。用SHARED关键字建立共享数据库链接。还必须使用AUTHENTICATED
BY 子句在远程系统上指定一有效的用户名和口令。如下命令建立一个共享的、公用的、连接用户数据库链接:
CREATE SHARED PUBLIC database linkGNIS
AUTHENTICATED BY DUMMY_USER IDENTIFIED BY SECRET
USING ‘GNIS’;
要获得创建链接和管理分布式系统的更多资料,请查阅Oracle
Technology Network (http://otn.oracle.com/)。
使用AUTHENTICATED BY子句稍微有些困扰,但是由于实现共享链接的方式安全性决定它是必须的。这个例子中的用户名和口令DUMMY_USER/SECRET必须在远程系统上有效。然而,远程系统上使用的帐户仍就是连接用户的帐户。如果我以JEFF/SECRET登陆到我的本地数据库并使用我刚建好的共享链接,将会发生以下一系列事件:
为了打开链接,Oracle使用DUMMY_USER/SECRET向远程数据库授权。然后,Oracle试图使用HMAD/SECRET使我登陆到远程数据库。共享链接的主要目的是减少两个数据库服务器之间的底层网络连接数量。它们最适合于MTS环境,在那你拥有大量的通过这一链接访问远程数据库的用户。观念上,你想让用户数量超过共享服务器进程的数量。那么你可以通过为每一共享服务器进程打开一个链接而不是每位用户打开一个链接的方法,节省资源。
database link使用方式
取值 |
说明 |
不指定 |
默认值建立一个private的database link |
PUBLIC |
公共连接,这样的连接可以被数据的所有的用户访问 |
database link用户验证方法
取值 |
说明 |
不指定 |
默认值采取Connected User的验证方法 |
CONNECT TO CURRENT_USER |
采取CURRENT_USER的验证方式 |
CONNECT TO user_name IDENTIFIED BY password |
采取Fiexed User的验证方式 |
database link创建举例
SQL Statement |
Connects To Database |
Connects As |
Link Type |
CREATE database link |
sales using net service name sales_us |
Connected user |
Private connected user |
CREATE database link foo |
sales using service name am_sls |
Current global user |
Private current user |
CREATE database link |
sales using net service name sales_us |
scott using password tiger |
Private fixed user |
CREATE PUBLIC database link |
sales using net service name rev |
scott using password tiger |
Public fixed user |
CREATE SHARED PUBLIC database link |
sales using net service name sales |
scott using password tiger, authenticated as anupam using password bhide |
Shared public fixed user |
不使用TNS
Name一例:
CREATE database link link_name
CONNECT TO user IDENTIFIED BY screct
USING '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =sales.company.com)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = sales)
)
)';
database link的使用
--
最简单的用法
SELECT * FROM table_name@database link;
--
不想让使用的人知道database link的名字的时候
-- 建一个别名包装一下
CREATE SYNONYM table_name FOR table_name@database link;
SELECT * FROM table_name;
--
或者,也可以建立一个视图来封装
CREATE VIEW table_name AS SELECT * FROM table_name@database link;
database link删除
-- 删除public类型的database
link
DROP PUBLIC database link link_name;
--
删除非public类型的database
link
-- 注意:只有owner自己能删除自己的非public类型database
link
DROP database link link_name;
查看database link的信息
查看系统database link的基本信息
DBA_DB_LINKS (ALL_DB_LINKS/USER_DB_LINKS)
DBA_DB_LINKS视图为每一定义的链接返回一行。OWNER
列和DB_LINK列分别显示了这一链接的所有者及名称。对公用数据库链接,OWNER列将包含’PUBLIC’。如果你建立固定用户链接,用户名应在DBA_DB_LINKS视图的USERNAME列里。ALL_DB_LINKS
视图和 USER_DB_LINKS视图与
DBA_DB_LINKS视图相类似-它们分别显示了你能够访问的所有链接及你所拥有的全部链接。
COL OWNER FOR A15
COL DB_LINK FOR A25
COL HOST FOR A25
COL USERNAME FOR A15
SELECT * FROM DBA_DB_LINKS;
DBA_OBJECTS (ALL_OBJECTS/USER_OBJECTS)
在这个视图里面只能查询到系统有那些database link以及他们的owner,创建时间等信息。
COL OWNER FOR A15
COL OBJECT_NAME FOR A25
COL OBJECT_TYPE FOR A25
SELECT OWNER,OBJECT_NAME,OBJECT_TYPE FROM DBA_OBJECTS WHERE OBJECT_TYPE LIKE'database link';
查看保存的Fixed user database link所保存的用户密码,该密码是经过加密的。
这是比较危险的一件事,有必要对表sys.link$的权限进行限制。
col host for a15
col userid for a15
col passwordx for a40
col name for a20
select name, host, userid, passwordx from sys.link$;
通过database link去SELECT远程数据库的一个表也是一个事务吗?
select * from v$transaction;
--
没有记录,说明没有事务
-- 通过database link连接远程数据库,select
其中一个表
select * from bbs_news@mylink
select * from v$transaction;
--
发现有一条记录。
解释
因为本地数据库只是将对应的sql发送给远程数据库执行,接受remote
db返回的结果,但他并不知道是否该sql修改了数据;所以需要为select
语句也标示一个事务。
具体可以参考otn
分布式数据库手册,所以在用database link远程访问时,要加上set
transaction read only;
close database link
ALTER SESSION CLOSE database link sales;
其实,dblink的相应属性对应了Oracle的数据字典link$,任何针对dblink的操作都是操作该数据字典。在9i的时候,如果Oracle的global_name仅包括db_name,也就是说DB_DOMAIN的值为空。那么这个时候建立的数据库链,在数据库修改全局名GLOBAL_NAME之后(修改为db_name.db_domain格式),会无法删除。
如果要产生数据库链,必须将GLOBAL_NAME改回DB_NAME格式,即去掉后面的DOMAIN,但是这个时候,RENAME操作会自动添加域名,使得Oracle全局名无法恢复到初始状态。因此在这情况下,如果需要删除dblink,只能直接操作link$数据字典
delete from link$ where owner#=user_id and name=dblink_name
当然直接操作数据字典是危险的,最好做好备份,然后再进行操作。
利用dblink执行ddl
我们知道任何ddl语句都无法在dblink中直接执行,示例如下
SQL> desc db_test;
Name Null? Type
----------------------------------------- ------------------------------------
ID NUMBER(38)
SQL> drop table db_test@DBLINK_CONNECTED_HR;
drop table db_test@DBLINK_CONNECTED_HR
*
ERROR at line 1:
ORA-02021: DDL operations are not allowed on a remote database
通过创建存储过程,使得能在dblink中执行ddl语句。
注意需在目标数据库的相应用户下创建存储过程
,具体如下
SQL> create or replace procedure p_execute_ddl(p_ddl in varchar2)
2 as
3 begin
4 execute immediate p_ddl;
5 end;
6 /
删除目标数据库的表
SQL> exec p_execute_ddl@DBLINK_CONNECTED_HR('drop table db_test');
PL/SQL procedure successfully completed.
SQL> desc db_test;
ERROR:
ORA-04043: object db_test does not exist
dblink的限制
You cannot perform the following operations using database links:
Grant privileges on remote objects
Execute DESCRIBE operations on some remote objects. The following remoteobjects, however, do support DESCRIBE operations:
Tables
Views
Procedures
Functions
Analyze remote objects
Define or enforce referential integrity
Grant roles to users in a remote database
Obtain nondefault roles on a remote database. For example, if jane connects tothe local database and executes a stored procedure that uses a fixed user linkconnecting as scott, jane receives scott's default roles on the remotedatabase. Jane cannot issue SET
ROLE to obtain a nondefault role.
Execute hash query joins that use shared server connections
Use a current user link without authentication through SSL, password, or NTnative authentication
Oracle dblink详解的更多相关文章
- (转)Oracle 使用 DBLINK详解
DBLINK详解 1.创建dblink语法: CREATE [PUBLIC] DATABASE LINK link CONNECT TO username IDENTIFIED BY password ...
- Oracle内存详解之 Library cache 库缓冲
Oracle内存详解之 Library cache 库缓冲 2017年11月09日 11:38:39 阅读数:410更多 个人分类: 体系结构 Library cache是Shared pool的一部 ...
- oracle 数据类型详解---日期型(转载)
oracle 数据类型详解---日期型 oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据类型的一些整理,都是开发入门资料,与大家分享: 注:由于INTER ...
- oracle 序列 详解
序列: 是oacle提供的用于产生一系列唯一数字的数据库对象. l 自动提供唯一的数值 l 共享对象 l 主要用于提供主键值 l 将序列值装入内存可以提高访问效率 创建序列: 1. 要有创建 ...
- oracle checkpoint 详解
Oracle checkpoint详解 topcheckpoint扫盲 top什么是checkpoint 在数据库系统中,写日志和写数据文件是数据库中IO消耗最大的两种操作,在这两种操作中写数据文件属 ...
- Oracle数据字典详解
学习笔记:oracle数据字典详解 --- 本文为TTT学习笔记,首先介绍数据字典及查看方法,然后分类总结各类数据字典的表和视图.然后列出一些附例. 数据字典系统表,保存在system表空间中. ...
- oracle rowid 详解
oracle rowid详解 今天是2013-09-15,存储在数据库中的每一行数据都有一个地址,oracle使用rowid数据类型在存储地址.rowid有如下类别: 1)physical rowid ...
- Oracle索引详解
Oracle索引详解(二) --索引分类 Oracle 提供了大量索引选项.知道在给定条件下使用哪个选项对于一个程序的性能来说非常重要.一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程 ...
- Oracle date 详解
oracle 数据类型详解---日期型 oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据类型的一些整理,都是开发入门资料,与大家分享:注:由于INTERV ...
随机推荐
- Java利用Apache POI将数据库数据导出为excel
将数据库中的数据导出为excel文件,供其他人查看 public class POITest { public static void main(String[] args) { POITest te ...
- C# 异步转同步
当我们的程序运行时,调用了一段异步的逻辑A,这段异步的逻辑无法转化为同步(如动画.下载进度等) 而,我们又需要等待异步逻辑A处理完成,然后再执行其它逻辑B. 那就迫切需要将异步转同步了! //参数bo ...
- Lintcode391 Number of Airplanes in the Sky solution 题解
[题目描述] Given an interval list which are flying and landing time of the flight. How many airplanes ar ...
- Emacs Python 自动补全--Elpy
安装方法: 首先,安装一些依赖包: # Either of these pip install rope pip install jedi # flake8 用来检查语法错误 pip install ...
- 原生JS实现圆周运动
<body> <div id="ball" style="width:20px; height:20px; background:red; border ...
- 下篇:python的基本数据类型以及对应的常用方法(列表、元组、字典、集合)
为了日后便于查询,本文所涉及到的所有命令集合如下: python中的基本数据类型有数字.字符串.布尔值.列表.元组.字典.就像每一个职业有自己特定的技能,比如医生能看病,农民能种田,每种数据类型也有属 ...
- C语言多维数组的指针传递
在C语言中为了节省空间,提高运行速度经常使用指针来完成数组的传递. 对于一维数组而言可以直接传递首地址 而对于二维数组必须在传递时声明是二维数组的指针,并且调用时也要经过一些运算 首先是定义形参: 函 ...
- Docker 镜像
Docker 镜像就是一个只读的模板. 例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序. 镜像可以用来创建 Docker 容器. D ...
- OAuth 2 深入介绍
1. 前言 2. OAuth2 角色 2.1 资源所有者(Resource Owner) 2.2 资源/授权服务器(Resource/Authorization Server) 2.3 客户端(Cli ...
- django+uwsgi+nginx+postgresql备忘
安装pg创建数据库xxx设置用户密码111111 apt-get install postgresql su - postgres psql create database xxx; alter us ...