1 说明
当我们使用PL/SQL工具以SYS用户登录数据库时,发现提示密码不正确:
ORA-01017: invalid username/password; logon denied
怎么办?
2 直接修改登录密码
使用这个方法前,必须和数据库管理员确认,确实是不记得密码了,并且修改之后要告知其余使用人,密码被修改,防止挨骂~~
在数据库服务器,使用sqlplus / as sysdba,通过操作系统认证,直接登录数据库,这里不需要验证密码,然后修改SYS用户密码:
alter user sys identified by oracle;
这里是把SYS用户密码设置成了oracle。
3 修改认证方式
Oracle登录验证方式包括口令验证和操作系统认证。
操作系统认证,就是Oracle认为操作系统用户是安全的,在使用sqlplus登录时,不校验用户密码,直接登录。
口令认证,就是指Oracle认为操作系统用户是不安全的,需要通过口令文件进行账号密码验证。Oracle的口令文件一般存放在$ORACLE_HOME/dba/目录下,名字为orapw+sid。
Oracle通过初始化参数remote_login_passwordfile限制口令文件的使用,这里详细介绍下:
1)NONE
remote_login_passwordfile=none表示,登录时禁用口令文件验证,sysdba用户只能通过操作系统认证登录数据库,其他方式的登录,比如PL/SQL,就会报前面提到的ORA-01017错误。
操作系统认证方式涉及sqlnet.ora($ORACLE_HOME/network/admin目录下)中的参数SQLNET.AUTHENTICATION_SERVICES:
a) NONE:关闭操作系统认证,只能通过口令文件认证;----
b) ALL: linux/unix平台下,采用操作系统认证,但远程sysdba登录仍然需要口令文件认证。
c) NTS: windows平台下操作系统认证。
2) EXCLUSIVE
remote_login_passwordfile=exclusive表示,独占模式使用口令文件,这个是默认值,用在单数据库的单实例环境中。这种模式下,可以对sysdba用户进行增加、修改、删除,同时可以修改sysdba用户密码,记录到密码文件中。
查看被授予sysdba权限的用户:
SELECT USERNAME FROM V$PWFILE_USERS WHERE SYSDBA=\'TRUE\';
口令文件中添加/删除sysdba权限用户
REVOKE SYSDBA FROM non-SYS-user;
GRANT SYSDBA TO non-SYS-user;
3) SHARED
这种模式下,可以在多个数据库间共享使用口令文件,口令文件不可被修改,包括不能修改sys用户密码。Oracle建议首先将需要sysdba权限的用户在excusive模式下设置好,然后修改remote_login_passwordfile修改为shared共享口令文件。
修改方法:
alter system set remote_login_passwordfile=shared scope=spfile;
然后重启数据库。
通过上面分析,我们可以看到,如果PL/SQL登录时,明明密码是正确的,但是就是登录不进去,并且说密码不正确,我们就要在数据库服务器上使用sqlplus登录,然后查看系统参数remote_login_passwordfile是否启动了可口令文件验证,一般应该设置为exclusive。同时关注sqlnet.ora的参数SQLNET.AUTHENTICATION_SERVICES。
4 小结
SYS用户忘记密码,或者明明密码正确,但是登录时报密码错误,不用愁了。