zoukankan      html  css  js  c++  java
  • oracle之dblink

    当用户要跨本地Oracle数据库,访问另外一个数据库表中的数据时,本地数据库中必须创建了远程数据库的dblink,通过dblink本地数据库可以像访问本地数据库一样访问远程数据库表中的数据。下面讲介绍如何在本地数据库中创建dblink。

    创建dblink一般有两种方式,不过在创建dblink之前用户必须有创建dblink的权限。想知道有关dblink的权限,以sys用户登录到本地数据库:

      select * from user_sys_privs t
      where t.privilege like upper('%link%');
      1 SYS CREATE DATABASE LINK NO
      2 SYS DROP PUBLIC DATABASE LINK NO
      3 SYS CREATE PUBLIC DATABASE LINK NO

      可以看出在数据库中dblink有三种权限CREATE DATABASE LINK(所创建的dblink只能是创建者能使用,别的用户使用不了),CREATE PUBLIC DATABASE LINK(public表示所创建的dblink所有用户都可以使用),DROP PUBLIC DATABASE LINK。

      在sys用户下,把CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK权限授予给你的用户

      grant CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK to scott;

      然后以scott用户登录本地数据库

      1.创建dblink的第一种方式,是在本地数据库tnsnames.ora文件中配置了要远程访问的数据库。

      create public database link

      to_bylw connect to scott identified by tiger using 'bylw';

      其中to_bylw是你创建的dblink名字,bylw是远程数据库的实例名,scott/tiger是登录到远程数据库的用户/密码。然后在本地数据库中通过dblink访问远程数据库'bylw'中scott.tb_test表,sql语句如下所示

      select * from scott.tb_test@to_bylw;

      2.创建dblink的第二种方式,是在本地数据库tnsnames.ora文件中没有配置要访问的远程数据库

    创建dblink
    CREATE DATABASE LINK数据库链接名
    CONNECT TO 用户名
    IDENTIFIED BY 密码
    USING ‘数据库连接字符串’;

      create database link to_test
      connect to scott identified by tiger
      using '(DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.5)(PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = bylw)
      )
      )';

      3.第二种是把第一种配置在tnsnames.ora文件中的信息,直接放在创建dblink语句后面。第一种情况tnsnames.ora文件中信息如下:
    容易犯的错误是:
    在自已的(客户端的)tnsname.ora中建立连接,而没有在A数据库所有的
    (服务器)A1的tnsname.ora中建立连接。

      bylw =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.5)(PORT = 1521))
      )
      (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = bylw)
      )
      )
    4.使用同义词简化:
    CREATE SYNONYM S_MY_TABLE FOR TABLENAME@数据库链接名;

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

  • 相关阅读:
    sgu101Domino
    KM模版
    UVA11383 Golden Tiger Claw(KM算法)
    POJ3565Ants(KM算法)
    POJ3041Asteroids(二分图最小点覆盖)
    UVA1175 Ladies' Choice(稳定婚姻问题,二分图)
    POJ1273Drainage Ditches(裸的最大流)
    UVA1201 Taxi Cab Scheme(POJ2060)DAG的最小路径覆盖
    二分图最大匹配数模版
    11419 SAM I AM(二分图)
  • 原文地址:https://www.cnblogs.com/jinxf/p/8991584.html
Copyright © 2011-2022 走看看