Oracle DBLink 问题总结

DBLINK详解

1.创建dblink语法:

CREATE [PUBLIC] DATABASE LINK link

CONNECT TO username IDENTIFIED BY password

USING ‘connectstring’

说明:

1) 权限:创建数据库链接的帐号必须有CREATE DATABASE LINKCREATE PUBLIC DATABASE LINK的系统权限,用来登录到远程数据库的帐号必须有CREATE SESSION权限。这两种权限都包含在CONNECT角色中(CREATE PUBLIC DATABASE LINK权限在DBA中)。一个公用数据库链接对于数据库中的所有用户都是可用的,而一个私有链接仅对创建它的用户可用。由一个用户给另外一个用户授权私 有数据库链接是不可能的,一个数据库链接要么是公用的,要么是私有的。

2)link : GLOBAL_NAME=TRUE时,link名必须与远程数据库的全局数据库名global_name)相同;否则,可以任意命名。

3)connectstring:连接字符串,tnsnames.ora中定义远程数据库的连接串。

4)usernamepassword:远程数据库的用户名,口令。如果不指定,则使用当前的用户名和口令登录到远程数据库。

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修饰关键字。在createdrop的时候都需要使用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以及数据库用户名和密码。
创建可以采用两种方式:
1、已经配置本地服务
create public database
link fwq12 connect to fzept
identified by neu using 'fjept' Create DATABASE LINK 数据库链接名CONNECT TO 用户名 IDENTIFIED BY 密码 USING ‘本地配置的数据的实例名’;
2、未配置本地服务
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;


问题1

SQL> show parameter global


NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
global_context_pool_size string
global_names boolean TRUE

当值为TRUE时, 你创建的dblinkName必须和Connection_Server(想要连接的数据库)的 global_name相同.( 想要连接的数据库的global_name通过查询 select * from global_name;)

--更改本自参数,不要求必须和连接的数据库global_name相同,即可以自行创建想要的名称.

alter system set global_names =false;


问题二

配置DBLINK细节很重要,请重点关注下面几点

1.确定被连接数据库可以连通,监听是好的

2.用户角色与权限 配置下面4项(很重要):

dba,conn,create database link,create public database link

3.客户机上的using中的连接一定要记得重写,只有服务端的链接配置才能在dblink中引用,配置在oracle客户端的tnsnane.ora中的链接配置是不能在dblink中使用的

用户名和密码不要加''或者""
create database link ydccs_link
connect to 用户名 identified by 密码
using ' (DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 11.11.11.11)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = test)
)
)';

如果是在数据库主机上,使用tnaname.ora中配的引用就行了

例如


create database link ydccs_link
connect to 用户名 identified by 密码
using ' TESTS';

4.删掉dblink
drop database link ydccs_link;

5使用DBLINK
SELECT * FROM v_base_cpcent@ydccs_link;


问题三

服务器A & B:WINDOWS2003 server + Oracle 10g

需要在服务器A上建立DBLINK,连接上服务器B上的数据库。

执行步骤:

1、在A中的tnsname中建立服务器B上的数据库的连接描述符

2、在A中以sys身份建立DBLINK

连接测试:

conn user/user@a as

select * from table@b

提示错误:ora-12154 无法解析指定的连接描述符

原因分析:

1、检查tnsname.ora文件,确认连接符和服务器名、Oracle服务名无误

2、检查global name,确认无误

3、A服务器用SQL PLUS连接B数据库,成功

4、在B服务器上建立A的DBLINK,成功

从上面的结果可以看出,一定是A服务器的Oracle设置有问题,而且从提示上看,只能是Tnsname的问题。A和B服务器唯一不同的就是,B只装了数据库,而A同时装了数据库和客户端。

经过小栋的提醒,突然想起来,A应该有两个tnsname,而我只改了client端的。

解决方法:

%ORACLE_HOME%/tnsname改完之后,成功查出结果。

借此机会感谢小栋!

tips: 如果连接的是UNIX服务器上的数据库,tnsname中的host只能填写IP地址。

发现,即使是SELECT 一个DBLINK,也会有COMMIT按钮,说明有可能锁住远程表。查找相关资料,大致意思是属于分布式查询,以事务形式提交,因此在查询完后尽量使用COMMIT或ROLLBACK来释放锁。切记



你可能感兴趣的:(Oracle DBLink 问题总结)