database link问题解决

来源:互联网 发布:最新电视直播软件 编辑:程序博客网 时间:2024/06/06 13:04
Oracle数据库中关于database link 
可以通过在A库设置指向B库的database link来直接访问B库的数据 
语法 
Sql代码  收藏代码
  1. create [publicdatabase link b_lk connect to userA identified by xxx using 'tnsname'  

其中,如果省略public则创建的是private的连接,只能当前所有者可以使用这个link 
使用connect to user identified by xxx则所有通过dblink的用户在访问B库时都使用userA这个用户 
b_lk指的是database link的名字,如果A库的global_names=true,则这个名字一定要使用B库的global_name.在b库执行select * from global_name可以得到。否则建立db link的时候不会报错,但是在执行查询时会报错 
ORA-02085: database link b_lk connects to b.world.COM 
tnsname指的是A库的tnsnames文件中配置的b库名称 
也可以直接使用以下的语句代替 
Sql代码  收藏代码
  1. USING '(DESCRIPTION =  
  2. (ADDRESS_LIST =  
  3. (ADDRESS = (PROTOCOL = TCP)(HOST = b.world.COM)(PORT = 1521))  
  4. )  
  5. (CONNECT_DATA =  
  6. (SERVICE_NAME = b)  
  7. )  
  8. )';  

a库使用dblink访问b库时比如select * from table@b_lk默认会在a库生成一个事务,可以查询v$transaction得到。有三种方法来控制这个事务 
1.查询后执行rollback或者commit 
Sql代码  收藏代码
  1. 2.查询后关闭link :alter session close database link b_lk  
  2. SQL> alter session close database link b_lk;  
  3. ERROR:  
  4. ORA-02080: database link is in use  
  5. SQL> rollback;  
  6. Rollback complete.  
  7. SQL> alter session close database link b_lk;  
  8. Session altered.  

注意:在rollback因为dblink查询产生的事务前,无法关闭dblink。关闭后可以再次执行基于dblink的查询 
3.set transaction read only;让事务只读,dblink将不产生事务,但是也限制了同一个session下对本地库的写操作 
注意:有了dblink后,可以执行对b库的insert等dml操作,有安全隐患,如何控制只能对b库进行读操作呢? 

------------------------------ 
如果使用dblink,我们需要及时显示的关闭dblink。以下提供两种方式,因为并不会在你建立的以后就自动的关闭和远程服务器建立的session,如果session太多,会0.+造成查询失败 

Sql代码  收藏代码
  1. alter session close database link <dblink_name>;  
  2.   
  3. dbms_session.close_database_link(<dblink_name>);  


你的程序是JAVA或者其他;可以写个存储过程,然后用动态sql实现database link的显示关闭. 

  ---用db link查询表事务的两个小灯也会亮!!! 
因为 DBLINK 会起一个新的事务处理的。 所以哪怕你是SELECT ROLLBACK和COMMIT都会亮的。 
每次使用db_link查询时释放连接,调用dbms_session包中的关闭函数即可 
    例:dbms_session.close_database_link(CONN_MY_LINK); 
   …… 
是本地数据库的事务 

加上set transaction read only; 

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

ORA-02068,ORA-03113 报错 
Cause: 
由于大量使用dblink远程连接未正常释放所致,也可能是bug所致。 
Solution: 
一,最好不要大量使用dblink方式实时远程取数据,有大概如下几个缺点: 
1,频繁对远程数据库创建连接,释放连接会有较大开销,特别是OLTP类数据库。 
2,此类远程dblink连接session,如本地session不退出或手动释放,此类session是不会及时自动释放的。大量耗用远程数据库资源。 
3,占用网络带宽 
4,触发bug,此类bug很多 
此类应用根绝实际需求可以用物化视图,触发器等方式替代. 
注:切忌使用dblink嵌套dblink的访问方式,性能会非常糟糕,而且不稳定。 
二,使用ALTER SESSION CLOSE DATABASE LINK dblink_name;语句来手动关闭远程dblink session. 
在使用此语句前,切忌先执行commit;否则报错ORA-02080或者不能达到预期效果。 

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

Sql代码  收藏代码
  1. ORACLE "ORA--22992:无法使用远程表选择的LOB定位器,database link"   
  2.   
  3.    解决办法:   
  4.    先创建一个临时表,然后把远程的含CLOB字段的表导入到临时表中,再倒入本表。   
  5.     create global temporary table demo_temp as select * from demo;   
  6.     insert into demo_temp select * from demo@D_LINK;   
  7.     insert into demo select * from demo_temp;   
  8.     commit;   
0 0