database link问题解决
可以通过在A库设置指向B库的database link来直接访问B库的数据
语法
其中,如果省略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库名称
也可以直接使用以下的语句代替
a库使用dblink访问b库时比如select * from table@b_lk默认会在a库生成一个事务,可以查询v$transaction得到。有三种方法来控制这个事务
1.查询后执行rollback或者commit
注意:在rollback因为dblink查询产生的事务前,无法关闭dblink。关闭后可以再次执行基于dblink的查询
3.set transaction read only;让事务只读,dblink将不产生事务,但是也限制了同一个session下对本地库的写操作
注意:有了dblink后,可以执行对b库的insert等dml操作,有安全隐患,如何控制只能对b库进行读操作呢?
------------------------------
如果使用dblink,我们需要及时显示的关闭dblink。以下提供两种方式,因为并不会在你建立的以后就自动的关闭和远程服务器建立的session,如果session太多,会0.+造成查询失败
你的程序是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或者不能达到预期效果。
-------------------------------
发布日期:2021-07-22 16:17:49
浏览次数:1
分类:技术文章
本文共 2474 字,大约阅读时间需要 8 分钟。
Oracle数据库中关于database link可以通过在A库设置指向B库的database link来直接访问B库的数据
语法
- create [public] database 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库名称
也可以直接使用以下的语句代替
- USING '(DESCRIPTION =
- (ADDRESS_LIST =
- (ADDRESS = (PROTOCOL = TCP)(HOST = b.world.COM)(PORT = 1521))
- )
- (CONNECT_DATA =
- (SERVICE_NAME = b)
- )
- )';
a库使用dblink访问b库时比如select * from table@b_lk默认会在a库生成一个事务,可以查询v$transaction得到。有三种方法来控制这个事务
1.查询后执行rollback或者commit
- 2.查询后关闭link :alter session close database link b_lk
- SQL> alter session close database link b_lk;
- ERROR:
- ORA-02080: database link is in use
- SQL> rollback;
- Rollback complete.
- SQL> alter session close database link b_lk;
- Session altered.
注意:在rollback因为dblink查询产生的事务前,无法关闭dblink。关闭后可以再次执行基于dblink的查询
3.set transaction read only;让事务只读,dblink将不产生事务,但是也限制了同一个session下对本地库的写操作
注意:有了dblink后,可以执行对b库的insert等dml操作,有安全隐患,如何控制只能对b库进行读操作呢?
------------------------------
如果使用dblink,我们需要及时显示的关闭dblink。以下提供两种方式,因为并不会在你建立的以后就自动的关闭和远程服务器建立的session,如果session太多,会0.+造成查询失败
- alter session close database link <dblink_name>;
- 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或者不能达到预期效果。
-------------------------------
- ORACLE "ORA--22992:无法使用远程表选择的LOB定位器,database link"
- 解决办法:
- 先创建一个临时表,然后把远程的含CLOB字段的表导入到临时表中,再倒入本表。
- create global temporary table demo_temp as select * from demo;
- insert into demo_temp select * from demo@D_LINK;
- insert into demo select * from demo_temp;
- commit;
转载地址:https://blog.csdn.net/makang110/article/details/51132510 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
表示我来过!
[***.240.166.169]2024年03月16日 13时15分21秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
x86so文件装换成arm64位_64位系统正式发布说明及介绍!!
2019-04-21
for循环中取出最大最小 累加_LeetCode之长度最小的子数组
2019-04-21
如何打开老公人脸识别_【话题】南宁已有小区启用人脸识别门禁,有人点赞有人忧...
2019-04-21
makex机器人程序_机器人教育为相城青少年叩开科学世界大门
2019-04-21
米哈游客户端笔试题_Garena校招 游戏客户端开发通关面经
2019-04-21
airpodspro没有弹窗_使用AirPods Pro一天的主观感受
2019-04-21
创建物化视图commit_视图及范式
2019-04-21
函数传参字典_Python新手上车17:函数传递任意多个参数
2019-04-21
秦九韶算法递推公式_算法讲解之复杂度分析
2019-04-21
添加绝对路径_网站中如何添加绝对路径
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