数据oracle11g怎么查看dblink的调用情况?
一套数据库准备下线,但是其他数据库有配置dblink连接这套数据库,现在需要排查这个dblink的使用情况,哪些人或程序在使用?
解决办法:
首先了解以下什么是dblink
DB Link简介
简单的说,DB Link就是建立在两个数据库服务器上面的单向链接数据通道。从数据库对象的角度看,DB Link是一个对象,结构和定义是保存在数据库服务器上的。当客户端登录到数据库服务器A上后,通过调用在A上定义的DB Link,可以访问到数据库服务器B上的数据对象。但是,这种连接是一种单向链接,登录到服务器B上的客户端是不能借这个链接访问到数据库服务器A上的对象。因为DB Link的定义是保存在服务器A的数据字典中
首先我们看一个小例子。我们有两个数据库服务器wilson和orcl。Wilson是一台运行在CentOS上的Oracle11g服务器,而Orcl是在windows环境下。现在要建立一条从orcl访问到wilson数据库的dblink。

首先,我们登录orcl,以soctt用户登录系统。使用create database link语句建立一个database link。语句的含义:创建一个dblink,连接到本地命名服务wilson对应的数据库服务器上,连接的时候使用HR/HR作为用户名和密码。
注意:create database link语句是需要用户具有create database link的系统权限。如果没有,就不能创建。
创建之后,我们发现创建的dblink名称不为db_Wilson,而是加入了wilson的全局网络名称。为:DB_WILSON.A.COM;使用DB Link的方法,如下:

下面我们来看看dblink的本质。我们知道,客户端连接到数据库实例之后,在实例上是通过server process进行代理进行操作。一直以来,操作本地数据库(local database)的时候,server process与实例进程进行交互,获取本地数据库数据。那么,在使用dblink的时候,这个过程是怎么样的呢?
我们检查一下进程情况。在确保没有其他链接到oracle11g服务器的情况下,我们检查服务器所在Linux的进程情况。

注意,当我们使用过dblink后,在link的remote数据库上出现了一个server process进程,而且是长期保存。根据我们的之前blog中对server process的实验,server process是一个忠实于client的进程对象。只要client存在,并且保持连接,server process会一直驻留在服务器进程列表中。
现在我们看到了有server process驻留在里面,说明存在与dblink相关的一个client,在与其建立通信调用关系。那么,究竟是谁呢???

根据OS上面的SPID编号(5749),我们定位了会话的信息(SID=35)。使用的数据库用户是HR,程序名称为ORACLE.exe。
到这里,我们似乎可以猜到dblink的工作原理了。ORACLE.exe是Oracle在Windows下的实例程序进程,其中的Server process和后台进程都被实现为线程模型。但是在使用dblink连接到remote database的时候,却是充当了program客户端的角色。
在回顾一下我们建立dblink的参数:一个本地命名服务名、登录用户名/密码。这些信息完全具备了客户端登录服务器的全部要素。那么,一切都可以清楚了。
当我们使用dblink,要求访问remote数据对象数据时候。本地实例上的进程(server process)会去充当客户端程序的角色,利用本地命名服务和用户名密码连接远程服务器。之后的过程同一般的客户端连接服务器没有任何差距了。
当访问数据(如select),实际上是将数据从远程的数据库服务器上,通过dblink对应的连接线路,传递到本地数据库服务器实例上,再进行额外的处理。如果直接返回结果,就将remote实例上的数据,经过local实例,传回到客户端。的确是很漫长的过程……如果需要和local数据库上的数据表进行额外的关联查询或者连接,就在local实例上进行。




