DBLINK详解
1.建立dblink语法:
CREATE [PUBLIC] DATABASE LINK link
CONNECT TO username IDENTIFIED BY password
USING ‘connectstring’
说明:
1) 权限:建立数据库连接的账号必须有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的系统权限,用来登陆到远程数据库的账号必须有CREATE SESSION权限。这两种权限都包含在CONNECT角色中(CREATE PUBLIC DATABASE LINK权限在DBA中)。一个公用数据库连接对于数据库中的全部用户都是可用的,而一个私有连接仅对建立它的用户可用。由一个用户给另一个用户受权私 有数据库连接是不可能的,一个数据库连接要么是公用的,要么是私有的。
2)link : 当GLOBAL_NAME=TRUE时,link名必须与远程数据库的全局数据库名global_name)相同;不然,能够任意命名。
3)connectstring:链接字符串,tnsnames.ora中定义远程数据库的链接串。
4)username、password:远程数据库的用户名,口令。若是不指定,则使用当前的用户名和口令登陆到远程数据库。
2.删除数据库连接的语句:
DROP [PUBLIC] DATABASE LINK zrhs_link
3.查看已建立的dblink
select owner,object_name from dba_objects where object_type='DATABASE LINK';
4.dblink的引用:
[user.]table|view
@dblink 如: SELECT * FROM worker@zrhs_link; SELECT * FROM camel.worker@zrhs_link ; 5.建立同义词: 对于常用的数据库连接,能够创建一个本地的同义词,方便使用: CREATE SYNONYM worker_syn FOR worker@zrhs_link; 6.建立远程视图: CREATE VIEW worker AS SELECT * FROM worker@zrhs_link where…; 如今本视图可与本地数据库中的任何其它视图同样对待,也能够受权给其它用户访问此视图,但该用户必须有访问数据库连接的权限。 其余: 修改GLOBAL_NAME的方法: 1.在远程数据库的init.ora文件中将global_names设为false。 或者 2.用sys用户执行以下语句:ALTER SYSTEM SET GLOBAL_NAME=TRUE/FALSE; 修改后从新启动数据库设置才能生效。 数据库全局名称能够用如下命令查出:SELECT * FROM GLOBAL_NAME; ===== dblink 实战 ====== 1.dblink分为公有和私有两类。 公有dblink使用public修饰关键字。在create和drop的时候都须要使用public关键字。 公有dblink对全部人开放,在该dblink之上建立的同义词也会随之对全部人开放。(测试并确认,不过测试是在一个实例多个用户之间进行) 私有dblink只有建立者能够访问,其上的同义词不能被其余用户访问。需为用户建立视图,并将视图受权给所需用户后,用户才可访问该视图。 另外,不能将带有dblink的同义词直接受权给用户。不然报错,其等价于: grant select on table1@user1 to user2 * ERROR at line 1: ORA-02021: DDL operations are not allowed on a remote database 2.建立dblink时,可使用链接字符串(与tnsname.ora中的),效率较高。 --------------------------------------------------------------------------------------------------------------------------------------------------------------------- 注意:建立数据库连接的账号必须有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的系统权限,用来登陆到远程数据库的账号必须有CREATE SESSION权限。这两种权限都包含在CONNECT角色中(CREATE PUBLIC DATABASE LINK权限在DBA中)。 两台不一样的数据库服务器,从一台数据库服务器的一个用户读取另外一台数据库服务器下的某个用户的数据,这个时候可使用 dblink。 其实dblink和数据库中的view差很少,建dblink的时候须要知道待读取数据库的ip地址,ssid以及数据库用户名和密码。 建立能够采用两种方式: 一、已经配置本地服务 create public database link fwq12 connect to fzept identified by neu using 'fjept' Create DATABASE LINK 数据库连接名CONNECT TO 用户名 IDENTIFIED BY 密码 USING ‘本地配置的数据的实例名’; 二、未配置本地服务 create database link linkfwq connect to fzept identified by neu using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.142.202.12)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = fjept) ) )'; host=数据库的ip地址,service_name=数据库的ssid。 其实两种方法配置dblink是差很少的,我我的感受仍是第二种方法比较好,这样不受本地服务的影响。 数据库链接字符串能够用NET8 EASY CONFIG或者直接修改 TNSNAMES.ORA里定义. 数据库参数global_name=true时要求数据库连接名称跟远端数据库名称同样 数据库全局名称能够用如下命令查出 Select * FROM GLOBAL_NAME; 查询远端数据库里的表 Select …… FROM 表名@数据库连接名; 查询、删除和插入数据和操做本地的数据库是同样的,只不过表名须要写成“表名@dblink服务器”而已。 附带说下同义词建立: Create SYNONYM 同义词名FOR 表名; Create SYNONYM同义词名FOR 表名@数据库连接名; 删除 dblink:Drop PUBLIC DATABASE LINK linkfwq。 若是建立全局dblink,必须使用systm或sys用户,在database前加public。 oracle dblink解决后台却出现锁 建立是很简单,可是在使用中后台却出现锁,查看这个锁的方法能够去console中看到或者查询数据库。其实这个锁倒 不是最让人心烦的,而是每次使用 dblink查询的时候,均会与远程数据库建立一个链接,dblink应该不会自动释放这个链接 ,若是是大量使用dblink查询,会形成web 项目的链接数不够,致使系统没法正常运行。 例子: create database link hr_tables connect to manbu identified by "admin" using 'WALK' 其中hr_tables是远程数据库的一个别名 manbu是远程数据库的数据库用户名 admin为manbu的密码 WALK为数据库在本地数据库的SID (具体说是本地数据库服务器的服务名。须要在本地服务器tnsname.ora上创建一个服务。而不是在客户端建。) 接着,咱们能够作一下测试,好比咱们想拿到数据库的某一张表数据,那咱们能够在命名行下作以下的测试: select user_name from mall_user@hr_tables; 每一张表都必须加上@hr_tables字符串,表示该表是dblink所指向的远程数据库的表单 或者,你会以为这样子很麻烦,那咱们能够为mall_user@hr_tables配置一个别名,那就没有改须麻烦啦。 建立mall_user@hr_tables的同义词,也即别名: create synonym mall_user for mall_user@hr_tables;