今天测试global_name的使用。发现修改后,无法还原。记录一下修改过程。
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
SQL> select * from global_name;
GLOBAL_NAME
-----------------------------------------------------------------------
ORASJH
SQL> alter database rename global_name to orasjh.oracle.com;
数据库已更改。
SQL> select * from global_name;
GLOBAL_NAME
-----------------------------------------------------------------------
ORASJH.ORACLE.COM
SQL> alter database rename global_name to orasjh;
数据库已更改。
SQL> select * from global_name;
GLOBAL_NAME
-----------------------------------------------------------------------
ORASJH.ORACLE.COM
--global_name无法修改成原来的值。郁闷...
到网上查了一下,也有人遇到这样的问题。解决方法是直接修改global_name这张表。我看了一下global_name的结构,只有一个字段。
SQL> desc global_name;
名称 是否为空? 类型
----------------------------------------- -------- -----------------
GLOBAL_NAME VARCHAR2(4000)
SQL> update global_name set global_name='ORASJH';
已更新 1 行。
SQL> COMMIT;
提交完成。
SQL> select * from global_name;
GLOBAL_NAME
-------------------------------------------------
ORASJH
--当global_names=true 或者 global_name有后缀,创建db link时db link 的名字都需要是对方的global_name。默认global_names是false。也就是说查询all_db_links db_link是带上.xxx的,但是实际上使用的时候不必带上.xxx,只是按照创建时候的名字使用就可以。
另外转载一篇关于global_name设置的文章,自己偷个懒不做实验了。
1. 数据库域名
1)全局数据库名(GLOBAL DATABASE NAME)
全局数据库名是在分布式数据库系统中用于标识数据库的唯一名称,默认为DB_NAME.DB_DOMAIN。该默认值在数据库创建的时候被标记,如果数据库创建后手工修改了DB_NAME或者DB_DOMAIN,全局数据库名称仍然保持为数据库创建时候的DB_NAME.DB_DOMAIN。
SQL> show parameter db_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_name string test
SQL> show parameter db_domain
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_domain string
SQL> select *from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------
TEST.US.ORACLE.COM
SQL> alter system set db_domain='test.com' scope=spfile;
系统已更改。
SQL> shutdown abort
ORACLE 例程已经关闭。
SQL>
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 114061244 bytes
Fixed Size 282556 bytes
Variable Size 79691776 bytes
Database Buffers 33554432 bytes
Redo Buffers 532480 bytes
数据库装载完毕。
数据库已经打开。
SQL>
SQL> show parameter db_domain
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_domain string test.com
SQL> select *from global_name;
GLOBAL_NAME
-------------------------------------------------------------------------------
TEST.US.ORACLE.COM
SQL>
2) 修改域名
可以通过修改全局数据库名来修改域名。
如果alter database rename global_name to 中的name没有指定域名,则默认为先前global_name中包含的域名.
SQL> select *from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------
TEST.US.ORACLE.COM
SQL> alter database rename global_name to test1;
数据库已更改。
SQL> select *from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------
TEST1.US.ORACLE.COM
SQL>
US.ORACLE.COM即为域名.不妨通过建立数据库链接来测试一下:
QL> column db_link format a20
SQL> column username format a20
SQL> column host format a10
SQL> column owner format a20
> select owner,db_link,username,host from dba_db_links;
未选定行
>
> create database link test connect to test identified by test using
'test';
数据库链接已创建。
-- 默认为US.ORACLE.COM
> select owner,db_link,username,host from dba_db_links;
OWNER DB_LINK USERNAME HOST
-------------------- -------------------- -------------------- ----------
TEST TEST.US.ORACLE.COM TEST test
> alter database rename global_name to oracle.test.com;
数据库已更改。
> create database link test connect to test identified by test using
'test';
数据库链接已创建。
-- 通过改变全局数据库名改变域名为TEST.COM
> select owner,db_link,username,host from dba_db_links;
OWNER DB_LINK USERNAME HOST
-------------------- -------------------- -------------------- ----------
TEST TEST.TEST.COM TEST test
TEST TEST.US.ORACLE.COM TEST test
>
> show parameter db_domain
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_domain string test.com
SQL> alter database rename global_name to oracle.com.cn;
数据库已更改。
SQL> create database link test connect to test identified by test using
'test';
数据库链接已创建。
-- 通过改变全局数据库名改变域名为COM.CN
> select owner,db_link,username,host from dba_db_links;
OWNER DB_LINK USERNAME HOST
-------------------- -------------------- -------------------- ----------
TEST TEST.COM.CN TEST test
TEST TEST.TEST.COM TEST test
TEST TEST.US.ORACLE.COM TEST test
--以上案例有几个地方有笔误,不知道大家看出来没有。
2.sqlnet.ora中的域名
在sqlnet.ora配置文件中指定了域名,比如NAMES.DEFAULT_DOMAIN = com.cn
1) 如果在tns配置中没有加域名com.cn
如:
test =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = )
)
)
则tnsping test会失败:
D:>tnsping test
TNS Ping Utility for 32-bit Windows: Version 9.0.1.1.1 - Production on 22-11月-2
004 15:03:14
Copyright (c) 1997 Oracle Corporation. All rights reserved.
已使用的参数文件:
D:oracleora90networkadminsqlnet.ora
D:oracleora90networkadmintnsnames.ora
TNS-03505: 未能分解名称
但在netmgr中可以测试成功:
正在尝试使用以下用户名连接:test
连接测试成功。
这可能是oracle net的一个bug.
2) 如果在tns中有与DEFAULT_DOMAIN不一致的域名,用tnsping可以ping通并且可以连接上数据库:
tns配置
test.test.com =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = )
)
)
D:>tnsping test.test.com
TNS Ping Utility for 32-bit Windows: Version 9.0.1.1.1 - Production on 23-11月-2
004 11:17:43
Copyright (c) 1997 Oracle Corporation. All rights reserved.
已使用的参数文件:
D:oracleora90networkadminsqlnet.ora
D:oracleora90networkadmintnsnames.ora
已使用 TNSNAMES 适配器来解析别名
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = )(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = )))
OK(430毫秒)
D:>sqlplus
SQL*Plus: Release 9.0.1.0.1 - Production on 星期二 11月 23 11:17:52 2004
(c) Copyright 2001 Oracle Corporation. All rights reserved.
连接到:
Oracle9i Enterprise Edition Release 9.0.1.0.0 - 64bit Production
With the Partitioning option
JServer Release 9.0.1.0.0 - Production
SQL>
3) 如果在tns中有与DEFAULT_DOMAIN一致的域名,则连接可以省略域名。
Tns配置如下:
test.com.cn =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = )
)
)
D:>tnsping test
TNS Ping Utility for 32-bit Windows: Version 9.0.1.1.1 - Production on 23-11月-2
004 11:17:43
Copyright (c) 1997 Oracle Corporation. All rights reserved.
已使用的参数文件:
D:oracleora90networkadminsqlnet.ora
D:oracleora90networkadmintnsnames.ora
已使用 TNSNAMES 适配器来解析别名
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = )(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = )))
OK(430毫秒)
D:>sqlplus
SQL*Plus: Release 9.0.1.0.1 - Production on 星期二 11月 23 11:17:52 2004
(c) Copyright 2001 Oracle Corporation. All rights reserved.
连接到:
Oracle9i Enterprise Edition Release 9.0.1.0.0 - 64bit Production
With the Partitioning option
JServer Release 9.0.1.0.0 - Production
SQL>
3. 结论
数据库域名与数据库全局名称相关,可以通过修改数据库全局名达到修改数据库域名的目的;
如果在sqlnet.ora中设置了默认域名则需要在tns中设置与DEFAULT_DOMAIN一致或不一致的域名。为避免不必要的麻烦,最好DEFAULT_DOMAIN要么在sqlnet.ora和tnsnames.or中同时出现,要么同时不出现。