Oracle 使用 db_link 来跨数据库访问数据。db_link 信息可以在数据字典 dba_db_links 中查看。
select t.owner 用户,t.db_link,t.username 账号,t.host 主机,t.created 创建时间from dba_db_links torder by t.created desc;
db_link 分两类,一类是私有的,一类是公有的。在创建 db_link 时,默认创建的是私有的,如果加上 PUBLIC 关键字则创建的是公有的。
私有DBLINK
CREATE DATABASE LINK dblinktest1CONNECT TO remote_user IDENTIFIED BY passwordUSING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracledb.example.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=service_name)))';
公有DBLINK
CREATE PUBLIC DATABASE LINK dblinktest2CONNECT TO remote_user IDENTIFIED BY passwordUSING 'remote_database';
私有dblink只能供创建它的用户使用,也只有创建它的用户可以删除,其它用户无法删除。
DROP DATABASE LINK dblinktest1;
公有dblink,可以被所有用户使用,同时可以使用 dba 账号删除。
DROP PUBLIC DATABASE LINK dblinktest2;
如果远程数据库是一个 oracle 类型的 dblink,可以使用 dual 表进行测试 dblink 是否可以正常连接。
select sysdate from dual@dblinktest2;
从 dba_db_links 数据字典中可以查询到dblink的创建信息,如果需要获取dblink的创建语句,可以使用dbms包进行解析
SELECT DBMS_LOB.substr(dbms_metadata.get_ddl('DB_LINK', 'JINGYITIWEN', 'XYHIS'),4000)from dual;
其中 get_ddl 第一个参数为类型,即 DB_LINK,第二个参数为 dblink 的名字,第三个参数为创建用户,如果是公有db_link,第三个参数可以写 PUBLIC。最终解析出来的ddl语句为:
CREATE DATABASE LINK "JINGYITIWEN"CONNECT TO "KYEEINTER" IDENTIFIED BY VALUES ':1'USING '192.168.100.1:1521/orcl'
其中db_link中远程数据库的用户名是知道的,但创建db_link的密码是无法获取的。在日常管理中,db_link的创建会用到远程数据库的用户名和密码,将密码保存在代码中是很危险的,需要在创建完成后将语句中的密码无害化处理,并将用户名和密码单独保存,以便日后重建。
其中 db_link 的连接字符串可以使用三种形式
tnsname 的名字
tnsname 的内容
easy_connect 字符串
其中 tnsname 存放在 oracle 的网络配置目录
Linux :
$ORACLE_HOME/network/admin/tnsnames.ora
Window:
%ORACLE_HOME%\network\admin\tnsnames.ora
Easy_Connect 字符串格式:
host[:port][/service_name]
文章转载自生有可恋,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




