数据库链:Database Link与GLOBAL_NAMES参数的关系
(题图授权来自Oracle VP , Sally Piao的摄影佳作)
编辑手记:最近大讲堂中很多朋友在讨论DB Link的问题,我们精选一些文章与大家分享这方面的知识。
当GLOBAL_NAMES参数设置为TRUE时,使用DATABASE LINK时,DATABASE LINK的名称必须与被连接库的GLOBAL_NAME一致。
下面做一个测试,在测试中,创建数据库链接的库为XJ(WINDOWS 2003 ORACLE 10g 10.2.0.1),被链接的库为DMDB(LINUX AS5 ORACLE 10g 10.2.0.1 RAC)
首先查看DMDB的相关配置:
可以看到这个被链接的库其global_names参数为FALSE。
要创建数据库链接的库的配置:
可以看到数据库链接工作正常。
在DMDB库上将global_names设为TRUE:
在XJ库上再次查询,并新建一个DATABASE LINK再进行查询:
此时可以看数据库链接工作正常。我们再将XJ库的global_names参数设置为TRUE:
而再次将XJ库的global_names设为FALSE,则数据库链接又可用了。
再将DMDB库的global_names设为FALSE,数据库链接仍然可用:
在DMDB库上:
可以看到,链接仍然可以用。
如果在DMDB库上创建链接到XJ库上,可以观察到同样的结果。
可以得出一个结论:
global_names参数设置为TRUE(感谢Robert.Li指出的此前的错误),影响的是创建数据库链接的那个库对数据库链接的使用。也就是说,如果一个库(实例)的global_names参数设值为TRUE,则该库连接其他库的数据库链接,其名称必须要与被连接的库的global_name相同:
在XJ库上:
如果在GLOBAL_NAMES设置为TRUE的情况下,如果要建多个数据库链接到同一个库,怎么办呢?因为数据库链接的名称必须与目标库的GLOBAL_NAME相同。
可以按如下的方法:
也就是在GLOBAL_NAME后面加上@再加上一个标识。这样就能够创建多个数据库链接到同一目标库上了。
另外在创建数据库链接时,不能给其他SCHEMA创建链接,这是因为数据库链接(database link)其名称可以含有'.'即点号。比如A用户想给B用户创建一个DBLINK名叫LINKB,CREATE DATABASE LINK B.LINKB ......这个语句将会实际创建一个A用户下的名为B.LINKB的数据库链接。
设置 global_names 初始化参数为 true 后,本地的数据库链接名称必须与远程数据库的 global_name 相同,才能正常使用数据库链接。那么怎么查询数据库的global_name 呢?
那么怎么样修改 global_name?
注意不要直接用 update global_name set global_name=''将global_name 设置为空,否则数据库不能启动,会报 ORA-00600[18061] 或 ORA-00600[18062] 这样的错误。 只有用备份进行恢复后才能打开。(参见metalink note 743676.1)。
那么 global_name 到底是个什么对象呢?
可以看到 global_name 实际上是一个视图,来源于 sys.props$ 表,而这个表是非常重要的一个关于数据库属性的表,不要随意更改此表的内容,否则将引起无可预料的、无法挽回的损失。
在用 alert database rename global_name 时,如果设置了 global_name类似于"dmdb.com"这样的名称,则以后更改名称,则没有常规的办法去掉"."分隔符了。
要去掉点分隔符,只有用 update:
郑重提示:除非万不得已,不要去更新 global_name 视图,即使更新,也不要去更新 global_name 的基表 props$,更不要将 global_name 更新为空,否则数据库可能无法启动。
搜索 盖国强(Eygle)微信号:eeygle,或者扫描下面二维码,备注:云和恩墨大讲堂,即可入群。每周与千人共享免费技术分享,与讲师在线讨论。
关注本微信(OraNews)回复关键字获取 2016DTCC, 2016数据库大会PPT; DBALife,"DBA的一天"精品海报大图; 12cArch,“Oracle 12c体系结构”精品海报; DBA01,《Oracle DBA手记》第一本下载; YunHe,“云和恩墨大讲堂”案例文档下载;