在oracle下如何创建database link全面总结

来源:互联网 发布:公司网络监控到手机 编辑:程序博客网 时间:2024/05/21 10:15

部分来源于:http://hi.baidu.com/mataoxf/blog/item/86e2be51db2a538e8d54306a.html

物理上存放于网络的多个ORACLE数据库,逻辑上可以看成一个单一的大型数据 库,用户可以通过网络对异地数据库中的数据进行存取,而服务器之间的协同处理对于工作站用户及应用程序而言是完全透明的,开发人员无需关心网络的链接细节、数据在网络节点中的具体分布情况和服务器间的协调工作过程。

数据库之间的链接建立在DATABASE LINK上。要创建一个DATABASE LINK,必须首先在建立链接的数据库上设置链接字符串,即配置一个远程数据库的本地网络服务名。

链接字符串的配置参见《客户端连接服务器》一节。


数据库全局名称可以用以下命令查出:

SELECT* FROM GLOBAL_NAME;

修改可以用以下语句来修改参数值:

ALTERSYSTEM SET GLOBAL_NAME=TRUE/FALSE;

<1>、当数据库参数global_name=false时,就不要求数据库链接名称跟远端数据库名称一样。

oracle数据库之间进行连接通讯。
创建数据库链接的语法如下:
CREATE [PUBLIC] DATABASE LINK link

CONNECTTO username IDENTIFIED BY password

USING‘connectstring’

其中:
--demona为用net8 easyconfig创建的连接字符串
目的方数据库的init.ora文件中的global_names设为false
重新启动数据库设置才能生效
或者用sys用户执行

注意:创建数据库链接的帐号必须有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的系统权限,用来登录到远程数据库的帐号必须有CREATE SESSION权限。这两种权限都包含在CONNECT角色中(CREATE PUBLIC DATABASE LINK权限在DBA中)。

一个公用数据库链接对于数据库中的所有用户都是可用的,而一个私有链接仅对创建它的用户可用。由一个用户给另外一个用户授权私有数据库链接是不可能的,一个数据库链接要么是公用的,要么是私有的。

创建数据库链接时,还可以使用缺省登录方式,即不指定远程数据库的用户名和密码:

createpublic database link zrhs_link

using‘zrhs’;

在不指定用户名和口令的情况下,ORACLE使用当前的用户名和口令登录到远程数据库。

USING后面指定的是链接字符串,也就是远程数据库的网络服务名,这个服务名保存在TNSNAMES.ORA文件中,在该文件中定义了协议、主机名、端口和数据库名。

删除数据库链接的语句是:

DROP[PUBLIC] DATABASE LINK zrhs_link

数据库链接的引用

一般情况下引用数据库链接,可以直接将其放到调用的表名或视图名称后面,中间使用一个 @ 作为分割符:

SELECT* FROM worker@zrhs_link ;

对于经常使用的数据库链接,可以建立一个本地的同义词,方便使用:

CREATESYNONYM worker_syn FOR worker@zrhs_link;

还可以建立一个本地的远程视图,方便使用:

CREATEVIEW worker AS SELECT * FROM worker@zrhs_linkwhere… ;

现在本视图可与本地数据库中的任何其它视图一样对待,也可以授权给其它用户,访问此视图,但该用户必须有访问数据库链接的权限。

对于另外一种情况,所要访问的表不在数据库链接中指定的远程帐户下,但该帐户有访问该表的权限,那么我们在表名前要加上该表的用户名:

SELECT* FROM camel.worker@zrhs_link;

<2>、当数据库参数global_name=true时,那就要求数据库链接名称跟远端数据库名称一样
数据库全局名称可以用以下命令查出

SELECT* FROM GLOBAL_NAME;

atabaselink(dblink)--数据库链路
创建dblink的语法:
sql>create database link 数据库链路名
connect to 用户名 identifiedby 口令
using '主机字符串名';
如:
sql>create database link ora9i.us.oracle.com ### 这里的us.oracle.com为oracle默认域名 ###
connect to scott identified by tiger
using 'sun';

1)dblink名必须与远程数据库的全局数据库名(global_name)相同;
2)用户名,口令为远程数据库用户名,口令;
3)主机字符串为本机tnsnames.ora中定义的串;
4)两个同名的数据库间不得建立dblink;
然后,你就可以通过dblink访问远程数据库了。
如:
sql>select * from 表名@ora9i.us.oracle.com;
还可以建立快照(snapshot)通过dblink实现远程数据自动传输。

查看所有的数据库链接,进入系统管理员SQL>操作符下,运行命令:

SQL>select owner,object_name from dba_objects where object_type='DATABASELINK';



---------------------------------------------------------------

11G以下版本:

//建立数据库链接

create   database  link   LINKNAME
 connect  to   USERID   identified  by   PASSWORD
 using  'SID ';
 / 查询数据
 select  *   from   SID.tableName@LINKNAME;
 / 删除链接
 drop  database   link   LINKNAME;

 

说明:
  LINKNAME 连接名字,可随便取一个
  USERID      连接目标数据库的用户名
  PASSWORD 连接目标数据库的密码
  SID             连接数据库的名字,注意一定加上引号;

 

11G版本:

create   database  link   LINKNAME
 connect  to   USERID   identified  by   "PASSWORD"
 using  'SID ';

//11G版本中密码区分大小写,注意 "PASSWORD" 需要加上双引号

/

select* from tablename@LINKNAME

 

另外在建该数据库链接的电脑上需要在tnsnames.ora文件里配置链接目标数据库的信息,

否则数据库链接语句需要写成:

createdatabase link dblink
connect to userid identified by "pwd"
using '(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.48.24)(PORT= 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = mydb)
    )
  )';


-----------------------------------------------------------------------

 1.查看数据库的global_name
        SELECT * FROM GLOBAL_NAME;
 
  2.查看global_name参数是true还是false
       show parameter global_name
       如果为true,本地建立的dblink名称必须与远程的global_name一致才行。
 
  3.创建dblink
       CREATE DATABASE LINK数据库链接名
       CONNECT TO 用户名
       IDENTIFIED BY 密码
       USING ‘数据库连接字符串’;


      例1:CREATE PUBLICDATABASE LINK CONN_MY_LINK
       CONNECT TO MYUSER IDENTIFIED BYMYPASSWORD
       USING 'MYORAL';
       其中MYORAL为客户端服务器建立的访问服务端服务器的本地命名,
       LINK CONN_MY_LINK为本地建立的dblink名称

 

       例2:CREATE PUBLICDATABASE LINK LINK_HSMIS
               CONNECT TO BI
               IDENTIFIED BY BI
              USING '(DESCRIPTION =
                         (ADDRESS_LIST =
                         (ADDRESS =(PROTOCOL = TCP)(HOST = 10.188.245.201)(PORT = 1521))
                          )
                        (CONNECT_DATA =
                        (SERVICE_NAME =hsmis)
                        )
                )';

          直接用本地命名连接字符串替代本地命名。

 

        // 赋予创建权限

        grant CREATE DATABASE LINK tosmis;      
        grant CREATE SYNONYM to smis;
 
  4.查询dblink是否创建成功
      SELECT * FROM DUAL@数据库链接名
      或SELECT * FROM表名@数据库链接名

 

  5.删除dblink
     drop public database linkCONN_MY_LINK

 

  6.使用同义词简化:
     CREATE SYNONYM S_MY_TABLE FORTABLENAME@数据库链接名;

 

  7.db_link查询时出现锁的解决方案
      每次使用db_link查询时释放连接,调用dbms_session包中的关闭函数即可
      例:dbms_session.close_database_link(CONN_MY_LINK);
      或使用dblink的时候,即使是select文也要进行commit,或者是rollback,
      否则时间长了会阻碍其他进程。

 

  8.查询dblink时出现无法处理服务器名的解决方案
       要在相应的数据库在服务器上建立相应的连接,如A数据库在A1服务器上,B数据库在b1服务器上,
       如果要在A数据库中连接B数据库,则要在服务器A1上建立相应的tnsnames配置项如下:
     (在Win环境下的Oracle中,Oracle\Network\ADMIN\tnsnames.ora 文件中进行配置)
      A_TO_B =  
      (DESCRIPTION = 
      (ADDRESS_LIST = 
      (ADDRESS = (PROTOCOL = TCP)(HOST=A2服务器的IP)(PORT =1521)) )        
      (CONNECT_DATA = 
      (SERVICE_NAME = B数据库的服务名)))        
      然后建立相应dblink,容易犯的错误是:
      在自已的客户端的tnsname.ora中建立连接,而没有在A数据库所有的
      服务器A1的tnsname.ora中建立连接。

 

  9.查看锁表进程和解锁
     (1)方式一:
     select sess.sid, 
     sess.serial#, 
     lo.oracle_username, 
     lo.os_user_name, 
     ao.object_name, 
     lo.locked_mode 
     from v$locked_object lo, 
     dba_objects ao, 
     v$session sess 
     where ao.object_id = lo.object_idand lo.session_id = sess.sid;
     (2)方式二:
      select * from v$session t1,v$locked_object t2
      where t1.sid = t2.SESSION_ID;
     (3)进程解锁 
     如有记录则表示有锁,记录下SID和serial# ,将记录的ID替換下面的SID, serial,即可解除LOCK
     alter system kill session'SID,serial';