数据库链:Database Link与GLOBAL_NAMES参数的关系

编辑手记:最近大讲堂中很多朋友在讨论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 更新为空,否则数据库可能无法启动。

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2016-07-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏拂晓风起

“class”类型重定义 || 防止头文件重复加载 || 两个类之间互相引用

1524
来自专栏java学习

Hibernate学习笔记2

定义hbm.xml映射文件和pojo类时都需要定义主键,Hibernate中定义的主键类型包括:自然主键和代理主键:

944
来自专栏信安之路

PHP使用了PDO还可能存在sql注入的情况

“用 PDO 来防止 SQL 注入。”大概学过 PHP 的都听说过这句话。代码中出现了 PDO 就行了吗?答案肯定是否定的。接下来给大家介绍几种使用了 PDO ...

2320
来自专栏程序员与猫

Elasticsearch 的一些关键概念

我更喜欢把 Elasticsearch 作为一种 nosql 去理解,它的一些开发概念和 MongoDB 以及 Redis 没有太大的区别,不过了解 Elast...

19210
来自专栏解Bug之路

MySQL多版本并发控制机制(MVCC)-源码浅析 顶

作为一个数据库爱好者,自己动手写过简单的SQL解析器以及存储引擎,但感觉还是不够过瘾。<<事务处理-概念与技术>>诚然讲的非常透彻,但只能提纲挈领,不能让你玩转...

1282
来自专栏程序猿

SQL注入与XSS漏洞

所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求 的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网 站泄...

5185
来自专栏魏琼东

一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-演示ORM的批量删除与更新

系列回顾           前面的文章一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-演示ORM的基本操作和一步一步教你使用AgileE...

2138
来自专栏Java架构师历程

mysql 谈谈innodb存储引擎

5.7版本引入了模式自动转换的功能,但该语法依然保留了。 另外一个有趣的点是,在5.7版本中,你可以通过设置session_track_transactio...

2872
来自专栏Linux驱动

C-fopen,fwrite,fread,fseek笔记

FILE * fopen(const char * path,const char * mode);

1642
来自专栏杨建荣的学习笔记

关于pl/sql的代码保护(r3笔记28天)

在开始学习数据库的时候,总是尝试手动创建数据库,安装完成之后需要运行一些脚本,总是看到屏幕上闪个不停,可以看到大多数的存储过程代码都是一堆乱码,最开始还以为是乱...

3027

扫码关注云+社区