`
sony-soft
  • 浏览: 1021702 次
文章分类
社区版块
存档分类
最新评论

分布式Oracle的database link --建立数据库间的通迅通道

 
阅读更多

分布式Oracle的database link --建立数据库间的通迅通道

url:http://hi.baidu.com/lgh_boffin/blog/item/2ff4f33872b4eb2a97ddd886.html

2009年07月26日 星期日 22:24

Oracle的database link --建立数据库间的通迅通道

数据库链接定义从一个Oracle数据库到另一个数据库的单行通信通道。

建立链接前要先有到远程数据库的命名服务(连接字符串),就是tnsnames.ora中描述的那个,如远程数据库SID名 'ora10g'
[测试] cmd:tnsping ora10g
Attemping to contact(...) OK (810 msec) // 说明对远程数据库ora10g可访问


创建数据库链接的语法分为 public链接 和 私有链接;

public链接创建语法:
CREATE PUBLIC DATABASE LINK org10g USING 'org10g';
其中 org10g 必须是远程数据库的全局名(SID), ' org10g ' 就是到远程的连接字符串

全局名可以通过远程登陆数据库执行SQL:

SELECT * FROM global_name@ora10g 查看到.

删除public link :
drop public database link linkname;

[注意]登陆名口令就是当前登陆本机的用户名和口令。也就是如果你用的是public链接,那么在远程就要有一个和本机相同的用户/口令才行。如:你以aa/111登录本机,然后执行
SELECT * FROM bb@ora10g;
那么对远程数据bb的访问用户为aa口令为11
也就是在本机和远程机上都有用户aa口令都为11才能执行成功!

私有链接创建语法:
CREATE DATABASE LINK ora10g CONNECT TO system IDENTIFIED BY aa;
这就建立了system的私有链接。


私有链接和public链接的差别就是登录名口令的限制。


即你不管用什么用户登录本机,执行
SELECT * FROM bb@ora10g;
访问远程机数据bb的用户和口令都为system/aa

建好的数据链接放在系统表SYS.link$表中

删除私有 link :
drop database link linkname;

或者: 当然,直接删除SYS.link$表中的记录一样可行。

oracle创建db link访问远程数据库中LOB表
2008-06-27 16:51

创建语句:

create database link REMOTE.US.ORACLE.COM
connect to REMOTEUSER
identified by "<pwd>"
using 'REMOTEDB';

信息:
Link Owner: LOCALUSER
Link Name: REMOTE.US.ORACLE.COM
Host : REMOTEDB
User Name :REMOTEUSER

查询远程数据库用户表的内容:
select * from tablename@REMOTE.US.ORACLE.COM

ora-22992 通过DBLINK 访问远程CLOB表问题(转载)

在本地用select语句访问远程,如果远程表有CLOB字段的话则会有错:ora-22992;
如果真的想看到clob字段的内容的话就得在本地建立一个表,用下面两条语句:
我刚才试验insert into table select * from remote table成功
remote table含有CLOB
总结:在我的环境中成功
(1)create table aaa select * from remote table
(2)insert into table select * from remote table


不过网上也有以下说法,虽然有错,不过也是一种方法,

通过临时表从DBLink中获取Blob对象2006-12-05 20:37做系统集成时,通过Database Link共享数据是不错的选择。不过真正使用DBLink时却碰到一个不小的问题:从远程数据库上查询Blob字段时总返回ORA-22992错误,如下:

select blobcolumn from remoteTable
@dl_remote;

ORA-22992: 无法使用从远程表选择的 LOB 定位器

查找了一下解决方法,有人提出了采用物化视图可以解决这个问题。物化视图唯一的缺陷在于同步机制的问题,如果同步时间设置过短,则占用大量的系统资源,给服务器带来极大的压力;如果设置时间过长,前台用户不可接受。

后来还是AskTom给出了极好的解决方案:使用全局临时表。

SQL
> create global temporary table foo

2
(

3 X BLOB

4
)

5 on commit delete rows;

Table created

SQL
> insert into foo select blobcolumn from remoteTable@dl_remote where rownum = 1;

1 row inserted

SQL
>

插入本地临时表之后,在本地的操作就没有任何问题了。

至于为什么临时表可以直接插入,而永久表为什么不能插入,本人未做具体研究?/

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics