ORA-02085
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 连接到一个数据库时,用了不同的名字。这个名字是什么名字?是在用什么名字做对比? 这个说明不清楚。不过可以从下面的解决方法中找到一点线索。
解决有两种:
- 创建一个dblink , 名字和要连的数据库保持一致。 其实这里也说得不清楚。从这段话里来看,是对dblink的命名有了要求。而从解决方法二中,我们判断出,前提条件是global_names = true 时才会报错的。 那么这个要求,是和要连的数据库的哪个名字保持一致呢?global_name? db_name ? service_name ? pdb_name ?
- 设置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='*';
===================
天行健,君子以自强不息
地势坤,君子以厚德载物
===================