问题描述:异机迁移后sys用户无法用SQL客户端登陆,但是system和其他用户可以登录
源数据库:Oracle11.2.0.1 目标数据库:Oracle11.2.0.4
问题现象:由于数据库是用RMAN全库备份恢复到异机上的,造成无法用sys用户无法用SQL客户端登陆,一直提示ORA-01017:ivalid username/password:login denied但是system和其他用户可以登录如下图:
分析问题原因:由于数据库是用RMAN全库备份恢复到异机上的,这个大家应该能想到,因为RMAN不能备份静态的参数文件、口令文件,虽然异机迁移成功但是sys用户无法用SQL客户端登录,system和其它用户可以,经查看sys和system 的状态是一样并无差异,用户状态也都是解锁状态如下图:
SQL>select * from dba_users where username like 'SYS%';
然后查这两个参数问题就要明显:
SQL> show parameter password;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
remote_login_passwordfile string EXCLUSIVE
SQL>
remote_login_passwordfile参数是EXCLUSIVE状态说明允许远程访问的,(VALUE= NONE)时是禁止关闭远程访问。
查看v$pwfile_users返回为空
SQL> select * from v$pwfile_users;
no rows selected
SQL>
正常情况下查询v$pwfile_users返回应该是这样的
SQL> select * from v$pwfile_users;
USERNAME SYSDB SYSOP SYSAS
------------------------------ ----- ----- -----
SYS TRUE TRUE FALSE
SQL>
这里大家已经猜到了用为没有数据库没有口令文件或是口令文件与数据库没有同步造成的,然后通过给sys用户授予sysdba权限,此问题就更明显了。
SQL> grant sysdba to sys;
grant sysdba to sys
*
ERROR at line 1:
ORA-01994: GRANT failed: password file missing or disabled
SQL>
看到到这里想必大家已经找到了问题的所在,就是没有口令文件或是没有将数据库的口令与本地口令文件同步的原因下面我们创建口令文件并重新授权即可解决问题步骤如下:
创建新的口令文件,口令文件默认路径在$ORACLE_HOME/dbs目录下,格式为 ora+pwd+sid
$orapwd file='$ORACLE_HOME/dbs/orapworcl' password='oracle' entries=10 force=y
$ ls -lh
total 2302992
-rw-r--r--. 1 oracle oinstall 2851 May 15 2009 init.ora
-rw-r-----. 1 oracle oinstall 24 Jul 29 07:20 lkORCL
-rw-r-----. 1 oracle oinstall 2048 Aug 4 07:29 orapwdorcl
-rw-r-----. 1 oracle oinstall 2560 Aug 4 07:34 orapworcl
-rw-r-----. 1 oracle oinstall 10043392 Jul 29 15:33 snapcf_orcl.f
-rw-r-----. 1 oracle oinstall 2560 Aug 4 06:27 spfileorcl.ora
创建完口令文件后给sys用户授予sysdba权限
SQL> alter user sys identified by oracle;
User altered.
SQL>
然后在查看一下视图v$pwfile_users,可以看到已经同步,切记口令文件和数据库设置的密码要一致。
SQL> select * from v$pwfile_users;
USERNAME
--------------------------------------------------------------------------------
SYSDBA SYSOPER SYSASM
--------------- --------------- ---------------
SYS
TRUE TRUE FALSE
SQL>
然后用SQL客户端用sys用户登录以显示成功如图:
问题感言:这个问题花了我几个小时在网上查资料去解决,网上的均是各抒己见,说什么的都有,但都是大同小异,反倒迷惑了自己的思路,其实问题的根本还是要从问题发生的根源去分析才是解决问题的最有效的方法,不能说网上没有好文章,而是相比大海捞针式的去网上搜索答案,不如自己先想想问题的根源再去解决问题或是参考网的建议效率上会跟高查资料也更有针对性。