什么是databaselink?数据库中的databaselink是什么?
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上面有相应的访问权限。
创建dblink一般有两种方式,不过在创建dblink之前用户必须有创建dblink的权限。想知道有关dblink的权限,以sys用户登录到本地数据库:
(资料图片)
select * from user_sys_privs t where t.privilege like upper("%link%");
1 SYS CREATE DATABASE LINK NO
2 SYS DROP PUBLIC DATABASE LINK NO
3 SYS CREATE PUBLIC DATABASE LINK NO
可以看出在数据库中dblink有三种权限CREATE DATABASE LINK(所创建的dblink只能是创建者能使用,别的用户使用不了),CREATE PUBLIC DATABASE LINK(public表示所创建的dblink所有用户都可以使用),DROP PUBLIC DATABASE LINK。
在sys用户下,把CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK权限授予给你的用户
grant CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK to scott;
database link分类
类型Owner描述
Private创建database link的user拥有该database link在本地数据库的特定的schema下建立的database link。只有建立该database link的schema的session能使用这个database link来访问远程的数据库。同时也只有Owner能删除它自己的private database link。
PublicOwner是PUBLIC.Public的database link是数据库级的,本地数据库中所有的拥有数据库访问权限的用户或pl/sql程序都能使用此database link来访问相应的远程数据库。
GlobalOwner是PUBLIC.Global的database link是网络级的,When an Oracle network uses a directory server, the directory server automatically create and manages global database links (as net service names) for every Oracle Database in the network. Users and PL/SQL subprograms in any database can use a global link to access objects in the corresponding remote database. Note: In earlier releases of Oracle Database, a global database link referred to a database link that was registered with an Oracle Names server. The use of an Oracle Names server has been deprecated. In this document, global database links refer to the use of net service names from the directory server.
创建dblink所需的权限
PrivilegeDatabaseRequired For
CREATE DATABASE LINKLocalCreation of a private database link.
CREATE PUBLIC DATABASE LINKLocalCreation of a public database link.
CREATE SESSIONRemoteCreation of any type of database link.
database link的使用基本语法CREATE [SHARED][PUBLIC] database link link_name
[CONNECT TO [user][current_user] IDENTIFIED BY 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。使用shared方式的database link是数据库会限制到远程数据库的连接的数量,这样以避免过多的连接对远程数据库造成太大的压力。在使用shared database link的时候,到database link的连接会在连接以后与本地连接断开,为防止未授权的session使用此链接而要求在创建shared database link的时候必须要指定database link_authentication。(from Oracle document: A shared database link is a link between a local server process and the remote database. The link is shared because multiple client processes can use the same link simultaneously.)
共享链接更多资料共享数据库链接是指该链接的多个用户可以共享同一个底层网络连接。例如,在有四位用户的MTS(多线程服务器)环境下,每一个共享服务器进程都将与远程服务器有一个物理链接,这四位用户共享这两个链接。表面上,共享链接乍一听起来像是一件好事。在某些环境下的确如此,但是,当你考虑使用共享链接时,应当意识到这有许多局限性和警告:如果你使用一个专用的服务器连接来连接到你的本地数据库,链接只能在你从那些连接中创建的多重会话间共享。在MTS环境里,每一个共享服务器进程潜在地打开一个链接。所有的会话被同一共享服务器进程提供并且分享被那个进程打开的任意共享链接。因为在MTS环境里的一个共享服务器进程能够服务于许多用户连接,共享链接的使用可能导致打开的链接远多于所必须的链接。用SHARED关键字建立共享数据库链接。还必须使用AUTHENTICATED BY 子句在远程系统上指定一有效的用户名和口令。如下命令建立一个共享的、公用的、连接用户数据库链接:CREATE SHARED PUBLIC database link GNISAUTHENTICATED BY DUMMY_USER IDENTIFIED BY SECRETUSING ‘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 StatementConnects To DatabaseConnects AsLink Type
CREATE database linksales.us.americas.acme_auto.com USING ‘sales_us’;sales using net service name sales_usConnected userPrivate connected user
CREATE database link foo CONNECT TO CURRENT_USER USING ‘am_sls’;sales using service name am_slsCurrent global userPrivate current user
CREATE database linksales.us.americas.acme_auto.comCONNECT TO scott IDENTIFIEDBY tiger USING ‘sales_us’;sales using net service name sales_usscott using password tigerPrivate fixed user
CREATE PUBLIC database linksales CONNECT TO scottIDENTIFIED BY tiger USING ‘rev’;sales using net service name revscott using password tigerPublic fixed user
CREATE SHARED PUBLIC database linksales.us.americas.acme_auto.com CONNECT TO scott IDENTIFIEDBY tiger AUTHENTICATED BYanupam IDENTIFIED BY bhide USING ‘sales’;sales using net service name salesscott using password tiger, authenticated as anupam using password bhideShared public fixed user
不使用TNS Name一例:CREATE database link link_nameCONNECT TO user IDENTIFIED BY screctUSING "(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 SYNONYMtable_name FOR table_name@database link;SELECT * FROM table_name;
-- 或者,也可以建立一个视图来封装CREATEVIEWtable_name AS SELECT * FROM table_name@database link;
database link删除-- 删除public类型的database linkDROP PUBLIC database link link_name;
-- 删除非public类型的database link注意:只有owner自己能删除自己的非public类型database linkDROP 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 A15COL DB_LINK FOR A25COL HOST FOR A25COL USERNAME FOR A15SELECT * FROM DBA_DB_LINKS;DBA_OBJECTS (ALL_OBJECTS/USER_OBJECTS)在这个视图里面只能查询到系统有那些database link以及他们的owner,创建时间等信息。
COL OWNER FOR A15COL OBJECT_NAME FOR A25COL OBJECT_TYPE FOR A25SELECT OWNER,OBJECT_NAME,OBJECT_TYPE FROM DBA_OBJECTS WHERE OBJECT_TYPE LIKE "database link";查看保存的Fixed user database link所保存的用户密码,该密码是经过加密的。这是比较危险的一件事,有必要对表sys.link$的权限进行限制。col host for a15col userid for a15col passwordx for a40col name for a20select name, host, userid, passwordx from sys.link$;通过database link去SELECT远程数据库的一个表也是一个事务吗?select * from v$transaction;-- 没有记录,说明没有事务-- 通过database link连接远程数据库,select 其中一个表select * from bbs_news@mylinkselect * from v$transaction;-- 发现有一条记录。解释因为本地数据库只是将对应的sql发送给远程数据库执行,接受remote db返回的结果,但他并不知道是否该sql修改了数据; 所以需要为select 语句也标示一个事务。具体可以参考otn 分布式数据库手册,所以在用database link远程访问时,要加上set transaction read only;
close database link:关闭db_linkALTER 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> exec dbms_utility.EXEC_DDL_STATEMENT@dblink("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 objectsExecute DESCRIBE operations on some remote objects. The following remote objects, however, do support DESCRIBE operations:TablesViewsProceduresFunctionsAnalyze remote objectsDefine or enforce referential integrityGrant roles to users in a remote databaseObtain nondefault roles on a remote database. For example, if jane connects to the local database and executes a stored procedure that uses a fixed user link connecting as scott, jane receives scott"s default roles on the remote database. Jane cannot issue SET ROLE to obtain a nondefault role.Execute hash query joins that use shared server connectionsUse a current user link without authentication through SSL, password, or NT native authentication
注意区别:共有dblink和私有dblink,下面两个dblink ,sys用户的,一定要用sys用户使用dblink,如果scott用户连接,也会报错的。public dblink是哪个一个用户都可以使用。删除的时候同样,私有dblink一定要用制定的用户去删除。
SQL> create database link ts connect to scott identified by "tiger" using "ora11g";Database link created.SQL> select * from dba_db_links;OWNER DB_LINK USERNAME HOST CREATED------------------------------ -------------------- PUBLIC TS SCOTT ora11g 2013-06-03 22:06:35SYS TSSCOTT ora11g 2013-06-03 22:29:38
标签:
相关推荐:
最新新闻:
- 经典摄影技巧有哪些?经典摄影技巧分享_全球快播
- idx是什么文件?idx文件怎么打开?|快讯
- 【组装电脑配置清单】组装电脑报价及配置清单
- 以太网或令牌环物理地址——ARP缓存
- 【计算】边缘水平边缘竖直边缘计算 Robert详解:全球速讯
- 什么是databaselink?数据库中的databaselink是什么?
- 环球热资讯!工作做多少年就该换一份?如何应对背景调查?
- 如何打开、隐藏和关闭外部exe?详细的操作步骤 天天日报
- 消费机哪款好?推荐几款消费机产品:焦点热议
- 战术层出不穷 EU流永不过时 为什么会诞生这个战术?
- 视频实时换脸明星动画 人工智能“换脸术”秒变大牌明星-天天报资讯
- 【adbshell】abd命令的使用方法|天天热门
- 魅族20系列首发游戏模式6.0|天天新要闻
- 骨戒对剑魂的伤害提升有多大?测试结果告诉你|世界时讯
- 如何查看.dat文件内容?dat文件是什么意思?|天天播资讯
- 宫本茂认为他离世后任天堂也不会有变化_天天快播报
- 《塞尔达传说:王国之泪》官网确定游戏将推出DLC|世界观察
- 环球微速讯:Twitter已经解雇了产品经理Esther Crawford
- 世界热推荐:内存崩盘光威特价内存条仅需115元
- 恐怖生存游戏《森林之子》现已发售 热销榜登顶好评如潮!
- 5G时代: 多路径实现收入与资本效率:环球短讯
- 行业崩盘!威刚1TB固态硬盘仅需299元_新消息
- 高盛董事会批准300亿美元股票回购计划_讯息
- Paradox Interactive 2023发布会将于3/7举行:环球资讯
- 天天通讯!《匹诺曹的谎言》宣布推出实体版 全新预告释出
- 顾客疑给差评被商家曝光姓名住址 商家:没有泄露隐私:环球焦点
- 《宝可梦睡觉》今夏推出:和卡比兽一起呼呼大睡吧 天天资讯
- 《天外世界:太空人之选》版公布 登陆PC/PS5/Xbox Series
- 一日一历·老手艺
- 强人集团董事长_强人集团_环球热门
- 增田顺一贺宝可梦27周年:用科技为玩家带来更多乐趣
- 全球讯息:《宝可梦:朱/紫》DLC公开 年内推出
- 巴奴火锅回应包厢收15%使用费:收费合规合法!
- 荣耀Magic5 Pro发布:5000万像素 100倍变焦
- 百事通!荣耀Magic5 Pro摄像头152分 行业第一
- 荣耀Magic5 Pro采用最好屏幕:151分 世界第一!
- 环球精选!荣耀Magic5 Pro亮相:星轮3摄+开孔四曲面
- 焦点速看:荣耀Magic5 Pro发布:首发5款颜色
- 《森林之子》没有捏脸引不满:性别歧视+种族歧视?|世界通讯
- 实时焦点:TV《火影忍者》20周年纪念PV公开 火之意志生生不息
- 新安洁2022年实现营收6亿元:增加信用减值损失约6100余万元:新动态
- 《战地7》爆料:4代男主回归 新引擎开发-世界快资讯
- 《刺客信条:RED》有双主角 计划在2024年发售
- 游客热衷打包柳州螺蛳粉 机场火车站:可以携带但途中不能吃|每日讯息
- DOTA2利马Major淘汰赛对阵出炉 两支中国队出局:天天关注
- 每日热讯!泰山站候车乘客集体呼呼大睡:6366级台阶专治不服
- 今日热闻!诺基亚近60年来首次更换Logo 宣布改变业务战略方向
- 《超凡蜘蛛侠》彼得梅姨重聚!莎莉·菲尔德获美国演员工会终身成就奖-全球热门
- 【当前独家】过于激动!杨紫琼获奖后没忍住飙出脏话
- 中兴发布新路由器:方糖造型99元_环球热点
- 世界速讯:高通详解骁龙X75 5G调制解调器,首个面向毫米波频段的十载波聚合
- 世界视点!万维望远镜
- 遭老罪喽!《狂飙》麻子变成景点:粉丝合影演驴哥_全球时快讯
- 天天消息!超模“卡抽”亮相红毯 黑色长裙气场全开
- 《天国大魔境》动画新PV公开 定档4月1日开播
- 零下50℃!小姐姐在漠河室外玩电脑 显卡都冻傻了
- 2023款雷蛇灵刃16笔记本开售:i9-13950HX/4090/4KMiniLED顶配38999元
- 权威调研:海信成中国消费者心中电视第一品牌
- 一加11概念版手机发布,支持主动液冷散热
- 一加Ace2天玑9000跑分曝光:105万分-环球热资讯
- 环球观察:一加11概念版正式亮相:后盖可见液体流动
- 大户型三层别墅,标准配件的飘窗,才是精髓之处
- 国产雷达厂商木牛科技完成数亿元C轮融资 世界焦点
- 8GB显存畅玩儿3A大作!RTX 3060 Ti破发了
- 权威发布:海信电视用户满意度连续8年居行业第一-天天最新
- 当前最新:8GB GDDR6X显存加持!映众RTX 3060 Ti史低价2949元
- 硬核性能再创巅峰 三星Galaxy S23系列值得游戏玩家拥有_全球视点
- MWC2023联想展示12寸卷轴屏笔记本:可扩展至15.3寸:快看
- 艾莉同性恋身份确认 《最后生还者》第七集让观众落泪
- 每日热闻!真·对标苹果!小米13海外售价与iPhone14近乎同价
- 《塞尔达传说:王国之泪》或有DLC计划 任天堂官网泄露相关信息-天天即时
- 史玉柱:氪金玩家不能太弱了 但也不能太强!
- 焦点精选!《高达:激战任务2》纪念雷霆宙域活动 限时上线动画版
- 《卧龙苍天陨落》怎么组队?卧龙苍天陨落联机教程
- MWC2023首发!荣耀Magic5系列正面照曝光