ITPub博客

首页 > Linux操作系统 > Linux操作系统 > global_name设置为true时 db link 的创建和使用

global_name设置为true时 db link 的创建和使用

原创 Linux操作系统 作者:lsq_008 时间:2011-07-29 11:34:42 0 删除 编辑

远程数据库名:

 

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_domain9fsystem.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 nameoracle会自动将本地数据库的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博客 ” ,链接:http://blog.itpub.net/10972173/viewspace-703477/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
十余年大型金融及电信系统数据库管理经验,曾服务于中国建设银行、中国移动。对oracle,mysql数据库有深入了解。 擅长python开发,独立开发了开源数据库自动化监控运维平台Power Monitor。

注册时间:2008-02-29

  • 博文量
    325
  • 访问量
    1258371