ITPub博客

首页 > Linux操作系统 > Linux操作系统 > ORACLE官方文档中 DB LINK的名字 与全局数据库的名字关系的疑问

ORACLE官方文档中 DB LINK的名字 与全局数据库的名字关系的疑问

原创 Linux操作系统 作者:ysp_1984 时间:2009-05-20 15:53:23 0 删除 编辑

 在看分布式数据库的时候,有一点小疑问。创建DB LINK的时候,DB LINK的名称与GLOBAL_NAME的关系。 官方的文档有下面一段话:

“The name that you give to a link on the local database depends on whether the remote
database that you want to access enforces global naming. If the remote database
enforces global naming, then you must use the remote database global database name
as the name of the link. For example, if you are connected to the local hq server and
want to create a link to the remote mfg database, and mfg enforces global naming,
then you must use the mfg global database name as the link name.”

这句话说明,如果你要创建一个连接到远程数据库的连接,且远程数据库GLOBAL_NAMES设置了TRUE 哪么数据连接的名字必须和远程数据库一样。下面验证一下是否如此:
    本地库:SID=devdb2 网络服务名:devdb
    远程库:SID=YSP  网络服务名:YSP10G
为了好区分,在本地和远程设置一下SQL提示符:

本地:
SQL> SET SQLPROMPT "_CONNECT_IDENTIFIER> "
devdb2>
远程:
SQL> SET SQLPROMPT "_CONNECT_IDENTIFIER> "
YSP>

1、本地GLOBAL_NAMES=FALSE,远程GLOBAL_NAMES=TRUE
此时远程数据库“enforces global naming” 按照文档所说的创建的数据库连接应该和远程数据的全局数据库名字一样才对。

设置本地库的GLOBAL_NAMES=FALSE:
devdb2> SHOW PARAMETER GLOBAL_NAMES

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
global_names                         boolean     TRUE
devdb2> ALTER SYSTEM SET GLOBAL_NAMES=FALSE;

System altered.

devdb2> SHOW PARAMETER GLOBAL_NAMES

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
global_names                         boolean     FALSE
devdb2>

设置远程数据库的GLOBAL_NAMES=TRUE:
YSP> SHOW PARAMETER GLOBAL_NAMES

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
global_names                         boolean     TRUE
已经为TRUE,不需要在设置。

查看本地的全局数据库名:

devdb2> SELECT * FROM GLOBAL_NAME;

GLOBAL_NAME
--------------------------------------------------------------------------------
DEVDB.ORACLE.COM.CN

查看远程的全局数据库名字:
YSP> SELECT * FROM GLOBAL_NAME;

GLOBAL_NAME
--------------------------------------------------------------------------------
YSP10G.ORACLE.COM.US


在本地DEVDB创建一个链接到远程YSP10G的数据库连接:
devdb2> CREATE PUBLIC DATABASE LINK YSPTEST
  2  CONNECT TO ORACLE
  3  IDENTIFIED BY ORACLE
  4  USING 'YSP10G';

Database link created.

devdb2> SELECT DB_LINK FROM DBA_DB_LINKS;

DB_LINK
--------------------------------------------------------------------------------
YSPTEST.ORACLE.COM.CN

数据库连接的名字是随意起的,并不是远程数据库的全局数据库名字(YSP10G.ORACLE.COM.US).
由于没有使用全局数据库名字,ORACLE将本地的数据库域名(ORACLE.COM.CN)作为后缀加到YSPTEST
上.

此时我们验证一下,是否能访问远程数据库的数据:
devdb2> SELECT * FROM T@YSPTEST;

        ID NAME
---------- ----------
         1 ysp
        10 垃圾广告
        50 LINUX
可以看到没有什么问题。插入一条数据看看:
devdb2> INSERT INTO T@YSPTEST VALUES(2,'test');

1 row created.

devdb2> COMMIT;

Commit complete.

devdb2> SELECT * FROM T@YSPTEST;

        ID NAME
---------- ----------
         2 test
         1 ysp
        10 垃圾广告
        50 LINUX

远程库上查看是否存在刚刚插入的数据:
YSP> SELECT * FROM ORACLE.T;

        ID NAME
---------- ----------
         2 test
         1 ysp
        10 垃圾广告
        50 LINUX
可以看到没有问题。
当然此时你创建一个和远程数据库全局数据库名字一样的数据库连接也不会有什么问题。

devdb2> CREATE PUBLIC DATABASE LINK YSP10G.ORACLE.COM.US
  2  CONNECT TO ORACLE
  3  IDENTIFIED BY ORACLE
  4  USING 'YSP10G';

Database link created.

devdb2> SELECT DB_LINK FROM DBA_DB_LINKS;

DB_LINK
--------------------------------------------------------------------------------
YSP10G.ORACLE.COM.US
YSPTEST.ORACLE.COM.CN

devdb2> SELECT * FROM T@YSP10G.ORACLE.COM.US;

        ID NAME
---------- ----------
         2 test
         1 ysp
        10 垃圾广告
        50 LINUX

可见:如果本地数据库的GLOBAL_NAMES=FALSE,远程数据库的GLOBAL_NAMES=TRUE,哪么在本地创建的数据库连接的名字既可以与远程的全局数据库的名字一样,也可以不一样,即名字可以随意起。

2、本地GLOBAL_NAMES=TRUE,远程GLOBAL_NAMES=TRUE

设置本地库的GLOBAL_NAMES=TRUE:
devdb2> ALTER SYSTEM SET GLOBAL_NAMES=TRUE;

System altered.

devdb2> SHOW PARAMETER GLOBAL_NAMES

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
global_names                         boolean     TRUE

设置远程库的GLOBAL_NAMES=TRUE:
YSP> ALTER SYSTEM SET GLOBAL_NAMES=TRUE;

System altered.

YSP> SHOW PARAMETER GLOBAL_NAMES

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
global_names                         boolean     TRUE

我们使用以前的创建的数据库连接是否还能继续使用:
对于数据库连接YSPTEST ,名字是我们随意起的 看看还能继续使用否:
devdb2> SELECT * FROM T@YSPTEST;
SELECT * FROM T@YSPTEST
                *
ERROR at line 1:
ORA-02085: database link YSPTEST.ORACLE.COM.CN connects to YSP10G.ORACLE.COM.US
可以看到此时报错了,不能使用了。
看看和远程全局数据库名字一样的数据库连接还能使用否:
devdb2> SELECT * FROM T@YSP10G.ORACLE.COM.US;

        ID NAME
---------- ----------
         2 test
         1 ysp
        10 垃圾广告
        50 LINUX

可见:如果本地数据库的GLOBAL_NAMES=TRUE,远程数据库的GLOBAL_NAMES=TRUE,哪么在本地创建的数据库连接的名字必须和远程的数据库全局数据库的名字一样,名字不可以随意起。

3、本地GLOBAL_NAMES=TRUE,远程GLOBAL_NAMES=FALSE
设置本地库的GLOBAL_NAMES=TRUE:
devdb2> ALTER SYSTEM SET GLOBAL_NAMES=TRUE;

System altered.

devdb2> SHOW PARAMETER GLOBAL_NAMES

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
global_names                         boolean     TRUE

设置远程库的GLOBAL_NAMES=FALSE:
YSP> ALTER SYSTEM SET GLOBAL_NAMES=FALSE;

System altered.

YSP> SHOW PARAMETER GLOBAL_NAMES

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
global_names                         boolean     FALSE

看看数据库连接YSPTEST和YSP10G.ORACLE.COM.US还能继续使用否:
devdb2> SELECT * FROM T@YSPTEST;
SELECT * FROM T@YSPTEST
                *
ERROR at line 1:
ORA-02085: database link YSPTEST.ORACLE.COM.CN connects to YSP10G.ORACLE.COM.US
devdb2> SELECT * FROM T@YSP10G.ORACLE.COM.US;

        ID NAME
---------- ----------
         2 test
         1 ysp
        10 垃圾广告
        50 LINUX
可见:如果本地数据库的GLOBAL_NAMES=TRUE,远程数据库的GLOBAL_NAMES=FALSE,哪么在本地创建的数据库连接的名字也必须和远程的数据库全局数据库的名字一样,名字不可以随意起。

4、本地GLOBAL_NAMES=FALSE,远程GLOBAL_NAMES=FALSE
设置本地库的GLOBAL_NAMES=FALSE:

devdb2> ALTER SYSTEM SET GLOBAL_NAMES=FALSE;

System altered.

devdb2> SHOW PARAMETER GLOBAL_NAMES

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
global_names                         boolean     FALSE

设置远程库的GLOBAL_NAMES=FALSE:
YSP> ALTER SYSTEM SET GLOBAL_NAMES=FALSE;

System altered.

YSP> SHOW PARAMETER GLOBAL_NAMES

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
global_names                         boolean     FALSE

 

看看数据库连接YSPTEST和YSP10G.ORACLE.COM.US还能继续使用否:
devdb2> SELECT * FROM T@YSPTEST;

        ID NAME
---------- ----------
         2 test
         1 ysp
        10 垃圾广告
        50 LINUX

devdb2> SELECT * FROM T@YSP10G.ORACLE.COM.US;

        ID NAME
---------- ----------
         2 test
         1 ysp
        10 垃圾广告
        50 LINUX
2个都可以正常使用。

可见:如果本地数据库的GLOBAL_NAMES=FALSE,远程数据库的GLOBAL_NAMES=FALSE,哪么在本地创建的数据库连接的名字既可以与远程的全局数据库的名字一样,也可以不一样,即名字可以随意起。


通过上面可以看出:数据库连接的名字与创建它的数据库的初始化参数GLOBAL_NAMES有关,与它所连接的远程的数据库的GLOBAL_NAMES无关。例如:你在本地数据库创建一个数据库连接,如果本地数据库的参数GLOBAL_NAMES=TRUE,哪么你创建的数据库连接的名字必须与远程的数据库的全局数据库名字一样,否则,你过你使用其他的名字,即使你能创建成功,也不能正常连接;如果本地数据库的参数GLOBAL_NAMES=FALSE,数据库连接的名字可以随便起。

感觉好像与远程数据库的GLOBAL_NAMES毫无关系?????????????

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16162908/viewspace-600556/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-05-08

  • 博文量
    15
  • 访问量
    18403