一、现象描述
为减轻当前一套19C RAC主库负载压力,另搭建了一套 RAC备库,目前和主库实时同步,计划将一些实时性要求比较低的应用迁移到该RAC备库。当前应用并不是直接连接生产库,而是通过一个中间库使用dblink来连接生产库的。于是修改中间库的dblink,将IP修改为19C RAC备库对应IP,但在测试dblink时发现不通,报了如下错误:
SQL> drop database link XXX.XXXX;
Database link dropped.
SQL> CREATE DATABASE LINK "XXX.XXXX" CONNECT TO "XXX" IDENTIFIED BY "XXX" USING '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST =192.168.xxx.xxx)(PORT = xxxx))) (CONNECT_DATA = (SERVICE_NAME = xxx.xxxx) (INSTANCE_NAME = xxxx)))';
Database link created.
SQL> select * from dual@XXX.XXXX;
select * from dual@XXX.XXXX
*
ERROR at line 1:
ORA-01017: invalid username/password; logon denied
ORA-02063: preceding line from XXX.XXXX
登陆19C RAC备库,验证用户名和密码,也无法登陆,报错如下:
SQL> conn xxxx/xxxxx
ERROR:
ORA-01017: invalid username/password; logon denied
查询当前RAC备库模式及状态也都是正常的,如下所示:
SQL> select status from v$instance;
STATUS
------------
OPEN
SQL> select open_mode,database_role,protection_mode from v$database;
OPEN_MODE DATABASE_ROLE PROTECTION_MODE
-------------------- ---------------- --------------------
READ ONLY WITH APPLY PHYSICAL STANDBY MAXIMUM PERFORMANCE
并将该测试用户在主库进行了测试,也是可以正常连接的,那问题出现在哪呢?
二、问题分析
主库能登陆,备库无法登陆,究竟是哪地方出现问题呢,是我当时部署DG的时候有什么误操作和遗漏的操作吗,回想下,和之前的部署没什么区别啊。
RAC备库这样,那这套RAC生产库的单机备库是否也这样呢,于是,登陆该生产RAC库的一套单机19C 备库,使用conn xxx/xxx测试连接,发现正常。
SQL> conn xxx/xxxx
Connected.
SQL> select status from v$instance;
STATUS
------------
OPEN
SQL> select open_mode,database_role,protection_mode from v$database;
OPEN_MODE DATABASE_ROLE PROTECTION_MODE
-------------------- ---------------- --------------------
READ ONLY WITH APPLY PHYSICAL STANDBY MAXIMUM PERFORMANCE
那看来不是用户名和密码的问题了。
此时查看了下该单机备库的$ORACLE_HOME/network/admin目录,再和那套RAC备库的同目录做了对比,发现单机备库多了sqlnet.ora,而那套RAC备库的 $ORACLE_HOME/network/admin目录是没有设置sqlnet.ora,会不会是sqlnet.ora问题导致的呢,于是我做了如下测试,将该单机备库的sqlnet.ora文件修改了后缀名,并再测试conn连接是否正常,测试及结果如下:
[oracle@xxxx ~]$ cd $ORACLE_HOME/network/admin
[oracle@xxxx admin]$ ll
total 16
-rw-r--r-- 1 oracle oinstall 283 Jul 15 14:50 listener.ora
drwxr-xr-x 2 oracle oinstall 64 Apr 17 2019 samples
-rw-r--r-- 1 oracle oinstall 1536 Feb 14 2018 shrept.lst
-rw-r--r-- 1 oracle oinstall 135 Jul 25 11:37 sqlnet.ora
-rw-r--r-- 1 oracle oinstall 697 Jul 19 13:44 tnsnames.ora
[oracle@xxxx admin]$ mv sqlnet.ora sqlnet.ora_bak
[oracle@xxxx admin]$ sqlplus xxx/xxx
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Nov 28 11:55:42 2022
Version 19.15.0.0.0
Copyright (c) 1982, 2022, Oracle. All rights reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name:
ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name: ^C
[oracle@xxxx admin]$ mv sqlnet.ora_bak sqlnet.ora
[oracle@xxxx admin]$ sqlplus xxx/xxx
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Nov 28 11:56:01 2022
Version 19.15.0.0.0
Copyright (c) 1982, 2022, Oracle. All rights reserved.
Last Successful login time: Sat Oct 15 2022 10:20:03 +08:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.15.0.0.0
通过以上实验可以看到,当$ORACLE_HOME/network/admin下sqlnet.ora不存在,是无法正常通过conn 来连接备库。
查看了下sqlnet.ora文件里配置的具体内容,如下:
[oracle@xxxx admin]$ cat sqlnet.ora
SQLNET.ALLOWED_LOGON_VERSION_SERVER=10
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=10
sqlnet.expire_time=10
SQLNET.INBOUND_CONNECT_TIMEOUT=180
三、问题处理
于是参照该单机备库,在RAC 备库$ORACLE_HOME/network/admin目录下,创建了sqlnet.ora文件并设置了同样内容,此时在该RAC备库测试 conn 也能正常连接了。
在那中间库重新测试了连接,也可以正常连接RAC备库了。