database link问题解决
发布日期:2021-07-22 16:17:49 浏览次数:1 分类:技术文章

本文共 2474 字,大约阅读时间需要 8 分钟。

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;   

转载地址:https://blog.csdn.net/makang110/article/details/51132510 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java中的运算符都有哪些
下一篇:线程、多线程与线程池总结

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年03月16日 13时15分21秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

3dmax如何拆分模型_3D建模大佬如何制作出惊艳四方的游戏建模,看完这篇文章我知道了... 2019-04-21
x86so文件装换成arm64位_64位系统正式发布说明及介绍!! 2019-04-21
for循环中取出最大最小 累加_LeetCode之长度最小的子数组 2019-04-21
如何打开老公人脸识别_【话题】南宁已有小区启用人脸识别门禁,有人点赞有人忧... 2019-04-21
makex机器人程序_机器人教育为相城青少年叩开科学世界大门 2019-04-21
一寸照纯红色底图片_Ella陈嘉桦也是“时髦精”,穿玫红色西装配拼色半身裙,高级洋气... 2019-04-21
米哈游客户端笔试题_Garena校招 游戏客户端开发通关面经 2019-04-21
airpodspro没有弹窗_使用AirPods Pro一天的主观感受 2019-04-21
创建物化视图commit_视图及范式 2019-04-21
函数传参字典_Python新手上车17:函数传递任意多个参数 2019-04-21
去掉数组最后一个元素_【一天一大 lee】在排序数组中查找元素的第一个和最后一个位置 (难度:中等) Day20201201... 2019-04-21
秦九韶算法递推公式_算法讲解之复杂度分析 2019-04-21
添加绝对路径_网站中如何添加绝对路径 2019-04-21
python房价数据分析波士顿代码数据_python数据分析-波士顿房价预测-Go语言中文社区... 2019-04-21
redis线程阻塞原因排插_Redis阻塞原因详解 2019-04-21
labview自动保存报表_基于LabVIEW的Excel报表的自动生成功能 2019-04-21
geotool 导出shp_Java 读取shape文件 2019-04-21
mysql 关联更新_MySQL UPDATE多表关联更新 2019-04-21
mysql call_mysql的call用法 call调用函数的例子 2019-04-21
python参数验证_参数验证,Python中的最佳实践 2019-04-21