Oracle中的口令文件存放着系统的特权用户(sysdba, sysoper)用户的用户名及口令,允许用户通过口令文件验证,在数据库未启动之前登陆从而启动数据库。如果没有口令文件,在数据库未启动之前就只能通过操作系统认证.
口令文件存放路径一般为:
WINDOWS下:%ORACLE_HOME%\DATABASE\PWD<oracle_sid>.ora
UNIX/LINUX 下:$ORACLE_HOME/dbsdbs/orapw<oracle_sid>
如果访问本地的数据库的话,只需要当前用户是被加到操作系统的相应group即可。
Operating System Group | UNIX User Group | Windows User Group |
---|---|---|
OSDBA | dba |
ORA_DBA |
OSOPER | oper |
ORA_OPER |
Oracle验证过程:
一、设置由操作系统验证的用户
WINDOWS下改变%ORACLE_HOME%\NETWORK\ADMIN\sqlnet.ora内容:SQLNET.AUTHENTICATION_SERVICES= (NTS)
UNIX下$ORACLE_HOME/network/admin/sqlnet.ora内容:SQLNET.AUTHENTICATION_SERVICES = (ALL) 就使用了操作系统级别认证,就可以不用输入密码,甚至用户名都不用(sqlplus “/ as sysdba”)就可以以sysdba的身份登陆系统(此时不通过口令文件认证).
如果Oracle数据库不允许远程SYSDBA/SYSOPER身份登录远程要使用操作系统的认证。则必须用安全的连接,这个是在管理工具NET8中设。很多普遍的协议,如:tcp/ip,decnet都是不安全的。将oracle启动参数REMOTE_LOGIN_PASSWORDFILE 设置为NONE,对于8.1.x或更高版本此参数的缺省值是EXCLUSIVE,在较早的Oracle 版本中缺省值是NONE
二、设置使用口令文件验证
把sqlnet.ora内修改:SQLNET.AUTHENTICATION_SERVICES= (NONE)
这个时候就需要用到pwd file了,如果这个时候还是任意输入密码,或者用”/” 来登陆就会出现错误
ORA-01031: insufficient privileges
ORA-01017: invalid username/password; logon denied
对于远程用户来说,将REMOTE_LOGIN_PASSWORDFILE 设置为EXCLUSIVE 或SHARED
EXCLUSIVE:表明只有一个例程可以使用口令文件,并且该口令文件包含除SYS 和INTERNAL以外的名称
SHARED: 表明可以有多个例程可以使用口令文件口令文件可以识别的用户只有SYS 和INTERNAL
三、重建修改口令文件
由于口令文件是二进制文件,而且密码都是加密的,所以从pwd file是很难看到sys的密码的。这个时候我们可以先重命名备份原pwd file再用orapwd命令来重新创建pwd file,也可以加参数force=y直接覆盖原来的密码(否则如果已经存在密码时会报OPW-00005: File with same name exists – please delete or rename) entries表示允许以SYSDBA/SYSOPER权限登录数据库的最大用户数,如果用户数超过这个值只能重建口令文件,增大entries。
widows下输入
host orapwd file=<fileName> passwod=<password> entries=<users>
Oracle提供了一个视图v$pwfile_users 来方便查看pwd file里面有哪些特权用户:
select * from v$pwfile_users;
也可以通过grant sysdba to 和revoke sysdba from 把一个用户加入或移出口令文件