一、引言
昨日我写了一篇关于项目组同事反馈一单机多实例Oracle 19C库因sqlnet.ora设置导致sqlplus无法登陆数据库的问题,前文最后提到一生产RAC库也遇到类似问题,本文作为上文的接续,请听我娓娓道来。
二、问题描述
事情是这样的,我们一套Oracle RAC 19C 三节点生产主库,由于应用程序访问量较大,导致主库数据库负载每日都比较高,为减轻该主库负载压力,另搭建了一套三节点19C RAC备库,备库的硬件配置虽不及主库,但整体配置也相对比较高。备库实时同步主库数据,当前未有应用接入进来。
为减轻主库压力,在和项目组沟通后,梳理了相关业务,对于BI等对实时性要求不是特别高的应用计划调整连接到备库。其中有部分应用不是直连19C数据库,而是通过一个中间库使用dblink连接19C主库的,现在需调节该DBLINK的目标端IP,将其IP修改为Oracle 19C RAC备库所对应的VIP。但在修改了dblink中的IP后,应用测试发现无法正常连接备库,报了如下错误。
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
复制
使用该测试用户是可以正常登陆19C RAC主库的,那问题出现在哪呢?
三、问题分析
通过测试用户可以正常通过conn 来登陆19C RAC 主库,但在备库上却无法正常登陆,究竟是哪地方出现问题呢,是我当时部署RAC DG的时候有什么误操作和遗漏的操作吗,回想下,和之前的部署没什么区别啊,用的都是我之前写的部署方案。
在这套RAC 备库上无法通过conn 登陆主库,那是否也同样无法在主库的其它单机备库上登陆呢,于是,使用该测试账号登陆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 DG 备库$ORACLE_HOME/network/admin目录下,创建了sqlnet.ora文件并设置了同样内容,此时使用测试账号和密码使用conn也能正常连接该RAC备库。
在BI连接RAC 备库的中间件重新测试dblink也可以正常连接19C RAC备库了。
五、后记
对于Oracle 的监听配置,看似简单,其实却隐藏着很多知识,这部分知识还是需要好好摸索学习的。