您的位置:首页 > 其它

database link问题解决

2016-04-12 13:27 218 查看
Oracle数据库中关于database link

可以通过在A库设置指向B库的database link来直接访问B库的数据

语法

Sql代码


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库名称

也可以直接使用以下的语句代替

Sql代码


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

Sql代码


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.+造成查询失败

Sql代码


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或者不能达到预期效果。

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

Sql代码


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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: