远程数据库名:
SQL> show parameter db_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_name string xjny
本地数据库上创建db_link,其名称与远程数据库的db_name不同:
SQL> conn / as sysdba
已连接。
会话已更改。
SQL> select * from dba_db_links;
未选定行
SQL> show parameter global_names
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
global_names boolean FALSE
SQL> create public database link xjnydb using 'xj';
数据库链接已创建。
SQL> conn scott/tiger
已连接。
会话已更改。
SQL> select count(*) from t1@xjnydb;
COUNT(*)
----------
101
此时可以正常使用已经创建的db link ,修改本地数据库的global_names参数为true:
SQL> conn / as sysdba
已连接。
会话已更改。
SQL> alter system set global_names=true scope=memory;
系统已更改。
SQL> conn scott/tiger
已连接。
会话已更改。
SQL> select count(*) from t1@xjnydb;
select count(*) from t1@xjnydb
*
第 1 行出现错误:
ORA-02085: 数据库链接 XJNYDB.REGRESS.RDBMS.DEV.US.ORACLE.COM 连接到 XJNY
可见,当global_names设置为true时,数据库将强制使用global db name来访问远程的数据库,此时报错。
将db link的名称改为远程数据库的db_name后再测试:
SQL> conn / as sysdba
已连接。
会话已更改。
SQL> drop public database link xjnydb;
数据库链接已删除。
SQL> create public database link xjny using 'xj';
数据库链接已创建。
SQL> conn scott/tiger
已连接。
会话已更改。
SQL> select count(*) from t1@xjnydb;
select count(*) from t1@xjnydb
*
第 1 行出现错误:
ORA-02019: 未找到远程数据库的连接说明
SQL> select count(*) from t1@xjny;
select count(*) from t1@xjny
*
第 1 行出现错误:
ORA-02085: 数据库链接 XJNY.REGRESS.RDBMS.DEV.US.ORACLE.COM 连接到 XJNY
可以看出,数据库会自动将.REGRESS.RDBMS.DEV.US.ORACLE.COM 的域名追加到db link名字后面,并认为这个追加后的名字就是远程数据库的global_db_name,
修改远程数据库的db_domain为9fsystem.com
SQL> alter system set db_domain='9fsystem.com' scope=spfile;
System altered.
SQL> startup force;
ORACLE instance started.
Total System Global Area 134217728 bytes
Fixed Size 1272408 bytes
Variable Size 109053352 bytes
Database Buffers 20971520 bytes
Redo Buffers 2920448 bytes
Database mounted.
Database opened.
SQL> show parameter global
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
global_context_pool_size string
global_names boolean TRUE
SQL> show parameter domain
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_domain string 9fsystem.com
此时在本地数据库通过db link访问远程数据库,仍然报错:
SQL> select count(*) from t1@xjny;
select count(*) from t1@xjny
*
第 1 行出现错误:
ORA-02085: 数据库链接 XJNY.REGRESS.RDBMS.DEV.US.ORACLE.COM 连接到 XJNY
再修改本地数据库库的db_domain名称为9fsystem.com
SQL> alter system set db_domain='9fsystem.com' scope=spfile;
系统已更改。
SQL> startup force;
ORACLE 例程已经启动。
Total System Global Area 209715200 bytes
Fixed Size 1248164 bytes
Variable Size 88081500 bytes
Database Buffers 113246208 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
数据库已经打开。
SQL> show parameter global
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
global_context_pool_size string
global_names boolean TRUE
SQL> show parameter db_domain
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_domain string 9fsystem.com
SQL> conn scott/tiger
已连接。
会话已更改。
SQL> select count(*) from t1@xjny;
select count(*) from t1@xjny
*
第 1 行出现错误:
ORA-02085: 数据库链接 XJNY.REGRESS.RDBMS.DEV.US.ORACLE.COM 连接到 XJNY
仍然报错:
SQL> select * from dba_db_links;
OWNER DB_LINK USERNAME HOST CREATED
------------------------------ -------------------------------------------------- ------------------------------ ---------- -----------------
PUBLIC XJNY.REGRESS.RDBMS.DEV.US.ORACLE.COM xj 20110729 10:16:51
万恶的domain name,居然还是REGRESS.RDBMS.DEV.US.ORACLE.COM
SQL> SELECT * FROM global_name;
GLOBAL_NAME
-------------------------------------------------------------------------------------------------
TEST.REGRESS.RDBMS.DEV.US.ORACLE.COM
SQL> update global_name SET global_name='test.9fsystem.com';
已更新 1 行。
SQL> commit;
提交完成。
SQL> desc global_name
名称
------------------------------------------------------------------------------------------------
GLOBAL_NAME
SQL> select * from global_name;
GLOBAL_NAME
-------------------------------------------------------------------------------------------------
test.9fsystem.com
SQL> drop public database link xjny ;
数据库链接已删除。
SQL> create public database link xjny using 'xj';
数据库链接已创建。
SQL> select * from dba_db_links;
OWNER DB_LINK USERNAME HOST CREATED
------------------------------ ------------------------------ ------------------------------ ---------- -----------------
PUBLIC XJNY.SYSTEM9F.COM 20110729 10:44:36
SQL> conn scott/tiger
已连接。
会话已更改。
SQL> select count(*) from t1@xjny.system9f.com;
select count(*) from t1@xjny.system9f.com
*
第 1 行出现错误:
ORA-02019: 未找到远程数据库的连接说明
居然不行,看上去好像是找不到这个名字,真是百思不得其解,明明看文档上是可以的,将名字修改一下,去掉数字9试试:
远程数据库:
SQL> alter system set db_domain='system.com' scope=spfile;
System altered.
SQL> update global_name set global_name='xjny.system.com' ;
1 row updated.
SQL> commit;
本地数据库:
SQL> drop public database link xjny.system9f.com;
数据库链接已删除。
SQL> create public database link xjny.system.com using 'xj';
数据库链接已创建。
SQL> conn scott/tiger
已连接。
会话已更改。
SQL> select count(*) from t1@xjny.system.com;
COUNT(*)
----------
101
终于ok,看来真是名字中包含了数字导致的问题。
结论:在global_names参数设置为true时,访问db link时将使用数据库的global name,
1. 如果在db link名字中指定了远程数据库的domain name,本地数据库就使用这个名字作为db link的全名。
2. 如果在db link 名字中没有指定远程数据库的domain name,oracle会自动将本地数据库的domain name追加到db link名字里,也就是说oracle会认为远程数据库跟本地数据库是在同一个domain里。
3.数据库自动添加的domain name不是由damain_name这个参数决定的,而是由数据字典里的global database name决定的,所以上述测试中修改domain_name这个初始化参数实际上是没有作用的。
附:下表为官方文档上关于db link几种类型的举例:
SQL Statement Connects To Database Connects As Link Type CREATE
DATABASE LINK sales.us.americas.acme_auto.com USING 'sales_us'; sales using net service
namesales_us Connected
user Private
connected user CREATE
DATABASE LINK foo CONNECT TO CURRENT_USER USING 'am_sls'; sales using service
name am_sls Current
global user Private
current user CREATE
DATABASE LINK sales.us.americas.acme_auto.com CONNECT TO scott IDENTIFIED BY
tiger USING 'sales_us'; sales using net service
namesales_us scott using password tiger Private
fixed user CREATE
PUBLIC DATABASE LINK sales CONNECT TO scott IDENTIFIED BY tiger USING 'rev'; sales using net service
name rev scott using password tiger Public
fixed user CREATE
SHARED PUBLIC DATABASE LINK sales.us.americas.acme_auto.com CONNECT TO scott
IDENTIFIED BY tiger AUTHENTICATED BY anupam IDENTIFIED BY bhide USING
'sales'; sales using net service
name sales scott using password tiger,
authenticated as anupam using passwordbhide Shared
public fixed user
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10972173/viewspace-703477/ ,如需转载,请注明出处,否则将追究法律责任。