Oracle global database name与db link的纠缠关系

  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

时间: 2024-08-02 17:47:02

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

Oracle的DB Link

数据库之间的链接建立在DATABASE LINK上.要创建一个DB LINK,必须先在每个数据库服务器上设置链接字符串. 1. 配置TNS , $ORACLE_HOME/NETWORK/ADMIN/tnsname.ora 10gstandby = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = HFCC-KF-3068)(PORT = 1522)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NA

Oracle创建Database Link的两种方式详解_oracle

创建一个dblink,命名为dblink_name,从A数据库连到B数据库,B数据库的IP为192.168.1.73,端口为1521,实例名为oracle,登录名为tast,密码为test. 一菜单方式: 打开plsql,点击[File]-[New]-[Database link],打开如下图所示窗口 填好各项信息后,点击[Apply]即可完成Database Link的创建. 二SQL方式 -- Drop existing database link drop public database

创建Oracle sharding database的例子

一.Oracle sharding database的一些概念 (1)Table family: 有相关关联关系的一组表,如客户表(customers),订单表(order),订单明细表(LineItems).这些表之间往往有外键约束关系,可以通过如下2中方式建立table family: (1.1)通过CONSTRAINT [FK_name] FOREIGN KEY (FK_column) REFERENCES [R_table_name]([R_table_column]) --这种关系可以

[20150907]关于db link.txt

[20150907]关于db link.txt --有时候学习的需要,要测试db link的sql语句,需要使用到db link,而实际的情况仅仅1台机器,1个数据库. --即使你什么都不建立.也可以使用global_name作为db link. SCOTT@test> select global_name c10 from global_name; C10 ---------- TEST.COM --另外说明以下实际上访问的是sys.props$ 表.现在执行计划就可以知道. SCOTT@te

[20130701]db link与事务.txt

[20130701]db link与事务.txt 昨天帮别人修复数据库,安全起见,我先启动read only模式,叫他们检查一些相关数据是否正常,但是在程序界面上出现:ORA-16000: database open for read-only access. 我跟踪发现执行的实际上通过db_link访问远程数据库的语句,不是dml语句(注:实际上执行dml,发生的事务也在远端,不在本地).按照这个道理如果数据库在只读的情况下,是不能访问远端的数据库的. google 发现如下链接: 我回来后在

[20130415]数据泵与db link.txt

[20130415]数据泵与db link.txt 数据泵是10g以后采用的新特性,按照一些介绍速度比exp/imp快.以前我总是成对的使用它,也就是先expdp导出数据,然后再传输到新的服务器,然后在impdp导入数据,这样的过程明显不是很快,特别是导出文件很大的情况下,速度并没有感觉快到哪里,如果数据泵加上db link,这样仅仅使用impdp导入就可以,省去了前面的步骤. 自己做一个测试: 测试数据从10g服务器到11g的测试机的导入情况: 1.测试环境与配置如下: --测试机器A(11g

[20140408]db link 口令安全问题.txt

[20140408]db link 口令安全问题.txt 测试在11GR2 ,如果以sys用户登录,查询sys.link$基表,通过简单的函数很容易知道db link的口令. 例子: SYS@test> @ver BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.3

Oracle Active database duplication

001 理论基础 active database duplication :A duplicate database that is created over a network without restoring backups of the target database. This technique is an alternative to backup-based duplication. 意即:duplicate数据库不需要通过还原目标数据库的备份,而是直接通过网络而创建.这项技术是

关于db link权限分配的苦旅(二)

在几天前说过关于db link分配权限的问题,当时也折磨了我好一会儿 http://blog.itpub.net/23718752/viewspace-1869425/ 大体的情况还是在118的服务器中去访问128中的某个表的时候存在一些访问的问题,最后是重建了一个public的db link得以修复,当时对于这个问题的临时处理也是一波三折,还触发了一个oracle的bug,也算是有惊无险. 但是对于之前操作中的疑问在解释之后统一进行解答. 第二天的时候,开发的同事反馈说线上进行测试提dblin