ORACLE数据库中Global Database Name与DB LINKS的关系还真是有点纠缠不清,在说清楚这个关系前,我们先来了解一下Global Database Name的概念

Global DataBase Name 概念

1. What is a global database name?

-------------------------------------------------------------------------------

The global database name is the unique name of the database. In a distributed

database system (a set of databases stored on multiple computers that typically

appears to applications as a single database) the global database name ensures

that each database is distinct from all other databases in the system. Oracle

forms a database's global database name by prefixing the database's network

domain with the individual database's name. For example: sales.us.oracle.com

and sales.uk.oracle.com.

The global database name defaults to DB_NAME.DB_DOMAIN and this value is marked

at database creation time. If you change the DB_NAME or DB_DOMAIN after the

database has been created, the value for the global database name (GLOBAL_NAME)

will not change.

说简单一点,global database name就是用来唯一标识数据库的东东。global database name由两部分组成,DB_NAME和DB_DOMAIN。在创建db link的时候,Oracle会自动将db_domain作为后缀添加上去。而且一旦加入就很难变更。所以在进行高级复制、Streams复制等配置时,最好首先将多个节点的global_name规划好。

如何查看Global Database Name

SQL> select * from global_name;

 

GLOBAL_NAME

--------------------------------------------------------------------------------

TEST.REGRESS.RDBMS.DEV.US.ORACLE.COM

 

SQL> 

如下所示,可以知道global_name为一个视图。

SQL> select object_name,object_type from dba_objects where object_name=upper('global_name');

 

OBJECT_NAME                              OBJECT_TYPE

---------------------------------------- -------------------------------

GLOBAL_NAME                              VIEW

GLOBAL_NAME                              SYNONYM

视图global_name的定义可以从DBA_VIEWS里面查看,如下所示,它来源于sys.props$内部表

select value$ from sys.props$ where name = 'GLOBAL_DB_NAME'

那么参数global_name与Global Database Name又没有区别呢? 其实参数global_name仅仅表示指定数据库的链接是否需要和它所连接的数据库相同的名称。

GLOBAL_NAMES specifies whether a database link is required to have the same name as the database to which it connects.

SQL> show parameter global_name

 

NAME                                 TYPE        VALUE

---------------------------------- ----------- -----------------

global_names                         boolean     FALSE

SQL> 

所以两者完全是两个不同的概念,但是global_name也很重要,因为它的值会影响DB LINK.接下来,我们来创建一个DB Link,如下所示

SQL> select * from global_name;

 

GLOBAL_NAME

-------------------------------------

KKK.REGRESS.RDBMS.DEV.US.ORACLE.COM

 

SQL> CREATE PUBLIC DATABASE LINK "TEST"

     CONNECT TO "test" IDENTIFIED BY test1111

     USING '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = 

     (PROTOCOL = TCP)(HOST = 192.168.27.109)(PORT = 1521)))

              (CONNECT_DATA = (SERVICE_NAME = QWR)))';

 

Database link created.

 

SQL> 

如上所示,我创建的DB Link名字为TEST,但是你查询DBA_DB_LINKS时,你会发现链接服务器自动加上了域名,变成了TEST.REGRESS.RDBMS.DEV.US.ORACLE.COM, 当你查询时,使用TEST或TEST.REGRESS.RDBMS.DEV.US.ORACLE.COM都OK。

SQL> SELECT * FROM DUAL@TEST;

 

D

-

X

 

SQL> SELECT * FROM DUAL@TEST.REGRESS.RDBMS.DEV.US.ORACLE.COM;

 

D

-

X

 

SQL> 

当Global Database Name只有DB_NAME,但是没有DB_DOMAIN时,此时,如果创建的DB Link是没有db_domain作为后缀添加上去的,你查询时,就必须使用全名TEST.REGRESS.RDBMS.DEV.US.ORACLE.COM,不能像上面那样使用TEST,否则会报ORA-02019: connection description for remote database not found 错误。

SQL> select * from global_name;

 

GLOBAL_NAME

--------------------------------------------------------------------------------

EPPS

 

SQL>  CREATE PUBLIC DATABASE LINK "TEST.REGRESS.RDBMS.DEV.US.ORACLE.COM"

  2     CONNECT TO "test" IDENTIFIED BY test1111

  3     USING '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = 

         (PROTOCOL = TCP)(HOST = 192.168.27.109)(PORT = 1521)))(CONNECT_DATA = (SERVICE_NAME = QWR)))';  

 

Database link created.

SQL> SELECT * FROM DUAL@TEST;

SELECT * FROM DUAL@TEST

                   *

ERROR at line 1:

ORA-02019: connection description for remote database not found

 

 

SQL> SELECT * FROM DUAL@TEST.REGRESS.RDBMS.DEV.US.ORACLE.COM;

 

D

-

X

 

SQL> 

 

DB_LINK与GLOBAL_NAMES参数的关系

当GLOBAL_NAMES为TURE时,影响的是创建数据库链接的那个库对数据库链接的使用。而不是链接到该数据库的链接服务器的使用。也就是说,如果一个库(实例)的global_names参数设值为TRUE,则该库连接其他库的数据库链接,其名称必须要与被连接的库的global_name相同,是否有点绕口,那么从下面实验看看。

服务器B

SQL> show parameter global_names;

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

global_names                         boolean     FALSE

SQL> select * from global_name;

 

GLOBAL_NAME

--------------------------------------------------------------------------------

KKK.REGRESS.RDBMS.DEV.US.ORACLE.COM

服务器A

SQL> show parameter global_name;

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

global_names                         boolean     FALSE

SQL> select * from global_name;

 

GLOBAL_NAME

--------------------------------------------------------------------------------

SCM2.REGRESS.RDBMS.DEV.US.ORACLE.COM

在服务器B上创建链接服务器,链接到服务器A

SQL>  CREATE PUBLIC DATABASE LINK "LINK1"

  2     CONNECT TO "test" IDENTIFIED BY test1111

  3     USING 'SERVER_A';

 

Database link created.

 

 

SQL> SELECT * FROM DUAL@LINK1;

 

D

-

X

在服务器A上启用参数global_names,设置为TRUE。

SQL> show parameter global_names;

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

global_names                         boolean     FALSE

SQL> alter system set global_names=true;

 

System altered.

 

SQL> 

然后在服务器B上,再次创建链接服务器LINK2,如下所示

 

SQL>  CREATE PUBLIC DATABASE LINK "LINK2"

  2     CONNECT TO "test" IDENTIFIED BY test1111

  3     USING 'SERVER_A';

 

Database link created.

 

SQL> SELECT * FROM DUAL@LINK2;

 

D

-

X

从上可以看出,服务器B上的global_names设置为TRUE是不影响服务器A上的DB LINK的,那么在服务器A上,将参数global_names设置为TRUE呢?

SQL> alter system set global_names=true;

 

System altered.

 

SQL> SELECT * FROM DUAL@LINK1;

SELECT * FROM DUAL@LINK1

                   *

ERROR at line 1:

ORA-02085: database link LINK1.REGRESS.RDBMS.DEV.US.ORACLE.COM connects to

SCM2.REGRESS.RDBMS.DEV.US.ORACLE.COM

 

 

SQL> SELECT * FROM DUAL@LINK2;

SELECT * FROM DUAL@LINK2

                   *

ERROR at line 1:

ORA-02085: database link LINK2.REGRESS.RDBMS.DEV.US.ORACLE.COM connects to

SCM2.REGRESS.RDBMS.DEV.US.ORACLE.COM

此时我们来创建一个与被链接数据库global_name一致的DB Link,如下所示

SQL> show parameter global_names

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

global_names                         boolean     TRUE

SQL> select * from global_name;

 

GLOBAL_NAME

--------------------------------------------------------------------------------

KKK.REGRESS.RDBMS.DEV.US.ORACLE.COM

 

SQL> 

SQL> 

SQL>  CREATE PUBLIC DATABASE LINK SCM2

  2     CONNECT TO "test" IDENTIFIED BY test1111

  3     USING 'SERVER_A';

 

Database link created.

 

SQL> SELECT * FROM DUAL@SCM2;

 

D

-

X

另外,我们来看看如何修改Global Database Name,如下所示

SQL> select * from global_name;

 

GLOBAL_NAME

--------------------------------------------------------------------------------

KKK.REGRESS.RDBMS.DEV.US.ORACLE.COM

 

SQL> alter database rename global_name to TEST;

 

Database altered.

 

SQL> select  * from global_name;

 

GLOBAL_NAME

--------------------------------------------------------------------------------

TEST.REGRESS.RDBMS.DEV.US.ORACLE.COM

 

SQL> 

如上所示,修改rename global_name只能修改DB_NAME部分,不能修改DB_DOMAIN,没有常规的办法去掉"."分隔符后面部分,要去掉只能用update语句

update global_name set global_name='xxxx';

但是网上很多大神的建议都是不要更新global_name. 例如AskTom里面How to change the value in GLOBAL_NAME table就提到

you don't UPDATE a global_name like that. You NEVER update any data dictionary table -- never.

另外在老熊的博客Oracle数据库的global_name里面,提到不要直接用update global_name set global_name=''将global_name设置为空,否则数据库不能启动,会报ORA-00600[18061] 或 ORA-00600[18062]这样的错误。除非万不得已,不要去更新global_name视图,即使更新,也不要去更新global_name的基表props$,更不要将global_name更新为空。

参考资料:

http://www.laoxiong.net/oracle_global_name.html

http://www.laoxiong.net/database_link_global_names.html

https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:1392538395678

https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=265322928260367&parent=DOCUMENT&sourceId=742140.1&id=115499.1&_afrWindowMode=0&_adf.ctrl-state=1hwssfmxb_203

Oracle global database name与db link的纠缠关系的更多相关文章

  1. Oracle创建Database Link

    一菜单方式: 打开plsql,点击[File]-[New]-[Database link],打开如下图所示窗口 填好各项信息后,点击[Apply]即可完成Database Link的创建. 二SQL方 ...

  2. 全面解读Oracle同义词的概念作用、创建删除查看及Oracle的db link

    Oracle的同义词(synonyms)从字面上理解就是别名的意思,和视图的功能类似,就是一种映射关系. 在Oracle中对用户的管理是使用权限的方式来管理的,也就是说,如果我们想使用数据库,我们就必 ...

  3. oracle db link的查看创建与删除

    1.查看dblink select owner,object_name from dba_objects where object_type='DATABASE LINK'; 或者 select * ...

  4. 关于DB Link

    概述 DB Link是一个定义了本地数据库到远程数据库路径的对象,是schema object,它是单向连接 通过DB Link可查询remote数据库的对象及运行其程序 在分布式环境里,DB Lin ...

  5. [20180823]IMU与db link.txt

    [20180823]IMU与db link.txt --//当使用db link查看远程表时,实际上会产生小小的日志.--//当时如果与IMU结合在一起,可以导致IMU的失效. 1.环境:SCOTT@ ...

  6. DB link的迁移

    我们在做某些Schema的迁移的时候,由于用到Public的db link,然而由于不知道db link中目标端账号的密码,因此无法在新环境重新创建DB link. 本次实验的思路是将视图dba_db ...

  7. DB Link 去除域名

    1.查看global_name的设置 SQL> show parameters global_name; NAME                                 TYPE    ...

  8. Oracle Created Database Users: Password, Usage and Files References (文档 ID 160861.1)

    This document is no longer actively maintained, for info on specific (new) users in recent product e ...

  9. db link的查看创建与删除(转)

    1.查看dblink select owner,object_name from dba_objects where object_type='DATABASE LINK'; 或者 select * ...

随机推荐

  1. ISP接口隔离原则

    一.定义 不应该强迫客户程序依赖并未使用的方法 二.接口污染 接口污染,在C#.C++这样的静态类型语言中是很常见的.一个接口会被他不需要的方法污染.在接口中假如一个方法只是为了能给它的一个子类带来好 ...

  2. 介绍开源的.net通信框架NetworkComms框架 源码分析(二十一 )TCPConnectionListener

    原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架  作者是英国人  以前是收费的 目前作者已经开源  许可是 ...

  3. HTML标签小结

    HTML:超文本标记语言 超:超链接       超文本:超出文本(可加入图片,文字,音频视频播放器)  标记:标签 HTML文档 以<html...>开始 , 以</html> ...

  4. Python语言and-or的用法

    [原]python语言的 and-or 常常被用来实现类C语言中的三元运算符 : ?   , 更为骚气的写法是  xxx and xxx or xxx and xxx or xxx,这样就可以可以做到 ...

  5. mousewheel

    判断鼠标往上还是往下滚动 html代码: <div class="div"> </div> css代码: .div{ position:absolute; ...

  6. Nunchuck.js - 轻松实现多个设备的数据同步

    Nunchuck.js 是对用于移动设备上的浏览器应用程序的控制库,通过浏览器轻松实现多设备数据同步.他们提供了一个库,很容易使开发人员能够整合移动浏览器控件到桌面的基于浏览器的 JavaScript ...

  7. 20个基于 WordPress 搭建的精美网站

    WordPress 无处不在,小到人博客,大到广受欢迎的各类特色网站,你都能发现 WordPress 的影子,因为它是创建和维护一个网站最容易使用的平台. 另外,网络上有很多资源来创建你的网站,你基本 ...

  8. 20个新鲜出炉的网站模板【HTML & PSD】

    这里给大家分享20 个新鲜出炉的免费网站模板.这些设计元素将成为你下一个项目的重要素材,可以帮你节省很多的时间.与往常一样,我们经常漫游网络,寻找最好的资源, HTML.CSS 和 PSD 等等,记得 ...

  9. Ioc容器Autofac系列(1)-- 初窥

     一.前言 第一次接触Autofac是因为CMS系统--Orchard,后来在一个开源爬虫系统--NCrawler中也碰到过,随着深入了解,我越发觉得Ioc容器是Web开发中必不可少的利器.那么,Io ...

  10. Autodesk 360 Viewer 已经发布到Autodesk 360平台

    我们之前已经在小范围内透露过,Autodesk 将发布一款完全无需插件的三维模型浏览器 Autodesk 360 Viewer,比如我们的Meetup线下小聚会,或者黑客马拉松(hackathon)的 ...