DB link的迁移
我们在做某些Schema的迁移的时候,由于用到Public的db link,然而由于不知道db link中目标端账号的密码,因此无法在新环境重新创建DB link。
本次实验的思路是将视图dba_db_links的基表link$迁移到出来并替换到新环境。因为用户的password密文保存在link$基表中。
---------------------
源端操作:
首先还在源端创建一个public 的db link 名为test。
Asherdb1 >create public database link test connect to scott identified by tiger using 'ginna';
Database link created.
seven >select * from global_name@test;
GLOBAL_NAME
---------------------
GINNA
Asherdb1 >select * from dba_db_links;
OWNER DB_LINK USERNAME HOST CREATED
------------------------------ -----------------------------
PUBLIC TEST SCOTT 1
Asherdb1 >create public database link test connect to scott identified by tiger using 'ginna';2
Database link created.3
seven >select * from global_name@test;4
5
GLOBAL_NAME6
---------------------7
GINNA8
9
Asherdb1 >select * from dba_db_links;10
11
OWNER DB_LINK USERNAME HOST CREATED12
------------------------------ -----------------------------13
PUBLIC TEST SCOTT 创建中间表trans1,CTAS基表sys.link$。
Asherdb1 >create table trans1 as select * from sys.link$;1
Asherdb1 >create table trans1 as select * from sys.link$;目标端操作:
在目标端创建名为test2的Public db link。连接源端库
Asherdb2 >create public database link test2 connect to seven identified by oracle using 'seven';
Database link created.
Asherdb2 >select * from global_name@test2;1
Asherdb2 >create public database link test2 connect to seven identified by oracle using 'seven';2
Database link created.3
4
Asherdb2 >select * from global_name@test2;通过test2的db link将Asher端的trans2表insert link$中。
Asherdb2 >insert into sys.link$ select * from trans1@test2;1
Asherdb2 >insert into sys.link$ select * from trans1@test2;现在再查一下dba_db_links就可以发现名为test的db link已经成功迁移在Asher端。
Asherdb2 >select * from dba_db_links;1
Asherdb2 >select * from dba_db_links;测试db link 的有效性:
Asherdb2 >select * from global_name@test;1
Asherdb2 >select * from global_name@test;主要就是将trans1这张中间表迁移至Asher库就可以了,这有很多方法,可以直接使用exp/imp或者数据泵都可以。条条大道通罗马,方法有很多种,主要就是将seven端的sys.link$基表迁移至Asher端并替换掉Asher端的sys.link$。
注: public dblink的 user# 是1
SQL> SELECT USER#,NAME FROM USER$ WHERE name in ('SYS','PUBLIC');
USER# NAME
---------- ------------------------------
1 PUBLIC
0 SYS6
1
SQL> SELECT USER#,NAME FROM USER$ WHERE name in ('SYS','PUBLIC');2
3
USER# NAME4
---------- ------------------------------5
1 PUBLIC6
0 SYS--------------
另: 可以通过修改基表(link$)让非public dblink变为public

浙公网安备 33010602011771号