为什么以sys无法远程登录数据库

今天通过pl/sql连接一个数据库,普通用户能连接上,但是sys就连接不上,告诉我用户名密码错误。之前其实遇到过这个问题,然后就开始查找原因。整个过程记录如下,结果是扎心的,过程也不是完全都懂。记下来权当备忘吧。

1、查看服务器监听器状态。

 $ lsnrctl status

 LSNRCTL for Linux: Version 11.2.0.1. - Production on -9月 - ::

 Copyright (c) , , Oracle.  All rights reserved.

 正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oa-db-)(PORT=)))
LISTENER 的 STATUS
------------------------
别名 LISTENER
版本 TNSLSNR for Linux: Version 11.2.0.1. - Production
启动日期 -9月 - ::
正常运行时间 天 小时 分 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序参数文件 /oracle/app/oracle/product/11.2./dbhome_1/network/admin/listener.ora
监听程序日志文件 /oracle/app/diag/tnslsnr/oa-db-/listener/alert/log.xml
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oa-db-)(PORT=)))
服务摘要..
服务 "PLSExtProc" 包含 个实例。
实例 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 个处理程序...
服务 "orcl" 包含 个实例。
实例 "orcl", 状态 READY, 包含此服务的 个处理程序...
服务 "orclXDB" 包含 个实例。
实例 "orcl", 状态 READY, 包含此服务的 个处理程序...
命令执行成功

可以看到监听器没有问题。

2、通过tnsping查看是否能够连通。

在服务器上做

 $ tnsping orcl

 TNS Ping Utility for Linux: Version 11.2.0.1. - Production on -9月 - ::

 Copyright (c) , , Oracle.  All rights reserved.

 已使用的参数文件:
/oracle/app/oracle/product/11.2./dbhome_1/network/admin/sqlnet.ora TNS-: 无法解析名称

这是因为服务器上没有tnsname.ora这个配置文件,无法解析名称。

在客户端上做

 tnsping oaproddb

 TNS Ping Utility for -bit Windows: Version 11.2.0.4. - Production on -9月 - ::

 Copyright (c) , , Oracle.  All rights reserved.

 已使用的参数文件:
D:\app\JIAKAI\product\11.2.\client_1\network\admin\sqlnet.ora 已使用 TNSNAMES 适配器来解析别名
尝试连接 (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = **.**.**.**)(PORT = )) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl)))
OK ( 毫秒) C:\Users\JIAKAI>

没有问题。

3、查看数据库参数文件

登录到服务器,然后以sys用户登录到数据库

 $ sqlplus / as sysdba

 SQL*Plus: Release 11.2.0.1. Production on 星期三 9月  :: 

 Copyright (c) , , Oracle.  All rights reserved.

 连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1. - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> show user
USER 为 "SYS"
SQL>

4、查看spfile是否存在

 SQL> show parameter spfile

 NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile string /oracle/app/oracle/product/11.2.0/dbhome_1/dbs/spfileorcl.ora

没有问题。

5、然后查看remote_login_pass参数

 SQL> show parameter remote_login_pass

 NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
remote_login_passwordfile string EXCLUSIVE

也没有问题。

一直也没有怀疑过sys密码不正确,因为通过以下语句可以登录

 $ sqlplus sys/1234 as sysdba

 SQL*Plus: Release 11.2.0.1.0 Production on 星期三 9月 13 17:44:46 2017

 Copyright (c) 1982, 2009, Oracle.  All rights reserved.

 连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

但还是试着抱一抱的态度,我更改了sys密码。然后居然登录成功了。(心里一万只*奔过)

那么问题来了,为什么sqlplus sys/1234 as sysdba能够登录呢?我之后又试了其他的sqlplus sys/*** as sysdba都可以登录。(WTF)

在网上查阅了资料和oracle的官方文档(Database Administrator‘s Guide)得知,Linux系统下,在sqlnet.ora中没有进行任何关于认证方法的配置时,是同时支持数据库密码文件验证和操作系统验证的,并且操作系统验证要优先于数据库验证。所以,当我们采用sqlplus sys/*** as sysdba这种登录方式时,是采用的操作系统方式验证,数据库会自动忽略“/”两边的用户名和密码,其效果就如同sqlplus / as sysdba一样。

所以这次的问题就是sys密码没有写对,所以pl/sql登录不上去。

参考:

想了解sqlnet.ora,tnsname.ora,listener.ora作用的,请戳这里

想参考其他遇到该问题的情况,请戳这里

想了解oracle验证方式的,请戳这里

关于oracle官方文档,请戳这里

上一篇:【leetcode】Rotate Image


下一篇:Eclipse用Tomcat插件部署Java Web项目