ORA-02085

发布时间 2023-08-23 16:43:39作者: halberd.lee

1 现象

  SQL> create public database link tocrm connect to dd identified by "dd" using 'BOSS_CRM';

Database link created.

SQL> select count(*) from v$instance@tocrm;
select count(*) from v$instance@tocrm
                                *
ERROR at line 1:
ORA-02085: database link TOCRM connects to BOSS_CRM_DB

首先,tns 配置是没有问题的。可以通过 sqlplus dd/dd@boss_crm 正常登录。 那么问题到底是出在哪儿了呢?

2 原因

关于此错误官方给出的说明如下:

 oerr ora 2085
02085, 00000, "database link %s connects to %s"
// *Cause: a database link connected to a database with a different name.
//  The connection is rejected.
// *Action: create a database link with the same name as the database it
//  connects to, or set global_names=false.
//

从上面的信息来看,原因是: dblink 连接到一个数据库时,用了不同的名字。这个名字是什么名字?是在用什么名字做对比? 这个说明不清楚。不过可以从下面的解决方法中找到一点线索。

解决有两种:

  1. 创建一个dblink , 名字和要连的数据库保持一致。 其实这里也说得不清楚。从这段话里来看,是对dblink的命名有了要求。而从解决方法二中,我们判断出,前提条件是global_names = true 时才会报错的。 那么这个要求,是和要连的数据库的哪个名字保持一致呢?global_name? db_name ? service_name ? pdb_name ?
  2. 设置global_names=false. 那么这个建议是哪儿改呢?源端?目标端?还是两边儿都得改?

2.1 分析

同时global_names = true的话,global_name = db_name + db_domain 。这又涉及到一个db_domain . 当db_domain 不为空的的话,service_name = global_name , PDB 中 db_link 创建好后,会自动补充db_domain ,而在cdb 中不会。 而dblink时,经测试,目标端是用pdb.name 或者是用db_name 与源端的db_link_name 进行匹配的。

各种乱糟糟的匹配,让我一点儿耐心也没有了。

2.2 结论

经过测试,得到如下结论:

待最终验证
最靠谱的方法就是在源端将global_names 设置为false. 目标端不用改。
alter system set global_names=false scoipe=both sid='*';