Oracle的口令文件的作用是存放所有以sysdba或者sysoper权限连接数据库的用户的口令,如果想以sysdba权限远程连接数据库,必须使用口令文件,否则不能连上,由于sys用户在连接数据库时必须以sysdba or sysoper方式,也就是说sys用户要想连接数据库必须使用口令文件,因此我认为在数据库中存放sys用户的口令其实没有任何意义!使用口令文件的好处是即使数据库不处于open状态,依然可以通过口令文件验证来连接数据库。开始安装完oracle,没有给普通用户授予sysdba权限,口令文件中只存放了sys的口令,如果之后把sysdba权限授予了普通用户,那么此时会把普通用户的口令从数据库中读到口令文件中保存下来,当然这时必须要求数据库处于open状态。
如果数据库的sysdba是通过数据库认证的,那么密码的信息就保存在这个文件中,如果不小心把sys的密码忘记了该怎么办呢?
第一步,将oracle的sysdba登录修改为os认证:改sqlnet.ora(windows的在:oracleproduct10.2.0db_1networkadmin下)的sqlnet.authentication_services= (nts)
这时候只要是属于ORA_DBA组的用户就可以不用密码而以sysdba登录数据库了,如sqlplus sys as sysdba,甚至是指定了一个错误的密码也可以登录sqlplus sys/aaaaa@orcl as sysdba;,因为这时候不检查密码,其实连是不是sys也不检查,只要指定了as sysdba就会以sys用户登录。
第二步,重新建立口令文件:orapwd file=D:oracleproduct10.2.0db_1databasePWDorcl.ora password=test entries=5
注意file=后面不能空格。
第三步,将数据库登录改为数据库认证:改sqlnet.ora(Windows的在:oracleproduct10.2.0db_1NETWORKADMIN下)的
SQLNET.AUTHENTICATION_SERVICES= (NONE)
这时候再以不正确的密码登录就会得到错误:ORA-01017: invalid username/password; logon denied
以第二步指定的密码则可以正确登录:sqlplus sys/test@orcl as sysdba;
登录后通过select * from v$pwfile_users;可以看到和口令文件相关的用户的信息。
上面第二步指定的文件是Oracle默认路径的默认文件名,如果想以别的文件名,这可以通过在注册表中添加信息来完成,如sid是orcl,可以通过添加一个字符串ora_orcl_pwfile将值设为文件的全路径值。在unix中则通过环境变量来设置。