解决以sysdba使用OS验证的 ORA-1031错误。 
 
1.检查是佛偶OS用户是OSDBA组
 
在UNIX上
A.看用户的组是什么:
[oracle@seclin4 ~]$ id
uid=500(oracle) gid=500(oinstall) groups=500(oinstall),501(dba) context=user_u:system_r:unconfined_t
B.看$ORACLE_HOME/rdbms/lib/config.[cs]文件里的OSDBA组定义的是什么
 
在Linux上的例子:
 
[oracle@seclin4 ~]$ cat $ORACLE_HOME/rdbms/lib/config.c
 
/* SS_DBA_GRP defines the UNIX group ID for sqldba adminstrative access. */
/* Refer to the Installation and User's Guide for further information. */
 
/* IMPORTANT: this file needs to be in sync with
rdbms/src/server/osds/config.c, specifically regarding the
number of elements in the ss_dba_grp array.
*/
 
#define SS_DBA_GRP "dba"
#define SS_OPER_GRP "dba"
#define SS_ASM_GRP ""
 
char *ss_dba_grp[] = {SS_DBA_GRP, SS_OPER_GRP, SS_ASM_GRP};
 
在AIX上的例子: 
[celcaix3]/grdbms/64bit/app/oracle/product/1120/rdbms/lib> cat config.s
# SS_DBA_GRP defines the UNIX group ID for sqldba adminstrative access.
# Refer to the Installation and User's Guide for further information.
 
.rename H.10.NO_SYMBOL{TC},""
.rename H.11.NO_SYMBOL{TC},""
.rename H.12.NO_SYMBOL{TC},""
.rename H.13.NO_SYMBOL{RO},""
.rename H.14.NO_SYMBOL{RO},""
.rename H.15.NO_SYMBOL{RO},""
.rename H.16.ss_dba_grp{TC},"ss_dba_grp"
 
.lglobl H.13.NO_SYMBOL{RO}
.lglobl H.14.NO_SYMBOL{RO}
.lglobl H.15.NO_SYMBOL{RO}
.globl ss_dba_grp{RW}
 
# .text section
 
# .data section
 
.toc
T.16.ss_dba_grp:
.tc H.16.ss_dba_grp{TC},ss_dba_grp{RW}
T.10.NO_SYMBOL:
.tc H.10.NO_SYMBOL{TC},H.13.NO_SYMBOL{RO}
T.11.NO_SYMBOL:
.tc H.11.NO_SYMBOL{TC},H.14.NO_SYMBOL{RO}
T.12.NO_SYMBOL:
.tc H.12.NO_SYMBOL{TC},H.15.NO_SYMBOL{RO}
 
.csect ss_dba_grp{RW}, 3
.llong H.13.NO_SYMBOL{RO}
.llong H.14.NO_SYMBOL{RO}
.llong H.15.NO_SYMBOL{RO}
# End csect ss_dba_grp{RW}
 
.csect H.13.NO_SYMBOL{RO}, 3
.string "dba"
# End csect H.13.NO_SYMBOL{RO}
 
.csect H.14.NO_SYMBOL{RO}, 3
.string "dba"
# End csect H.14.NO_SYMBOL{RO}
 
.csect H.15.NO_SYMBOL{RO}, 3
.string ""
# End csect H.15.NO_SYMBOL{RO}
.llong 0x00000000
 
# .bss section
 
在Solaris上的例子:
 
        .section        ".text",#alloc,#execinstr
/* 0x0000          7 */         .file   "x.c"
 
        .section        ".data",#alloc,#write
/* 0x0000          9 */         .global ss_dba_grp
/* 0x0000         10 */         .align  8
 
                        .global ss_dba_grp
                       ss_dba_grp:
/* 0x0000         17 */         .align  8
/* 0x0000         18 */         .xword  (.L12+0)
/* 0x0004         24 */         .align  8
/* 0x0004         25 */         .xword  (.L13+0)
/* 0x0008         26 */         .type   ss_dba_grp,#object
/* 0x0008         27 */         .size   ss_dba_grp,16
 
        .section        ".rodata1",#alloc
/* 0x0008         13 */         .align  8
 
 
                       .L12:
/* 0x0008         15 */         .ascii  "dba\0"
/* 0x0014         20 */         .align  8
 
 
                       .L13:
/* 0x0014         22 */         .ascii  "dba\0"
 
 
 
在这个个例子里,可以看到用户成员组dba值匹配在config.c文件的SS_DBA_GRP。如果组正确配置,但是连接依然失败,
可以使用Note 67984.1脚本看看Oracle是否有正确的组成员。
 
对于sysdbaOS验证产生ora-1031是因为nscd服务会使用/etc/passwd 和 /etc/group 来配置 /etc/nscd.conf文件,如果这个服务停止了,
就会产生这个问题。
在Windows上
 
 
当使用OS验证,OS用户必须是下面的两组成员之一:
ORA_DBA
ORA_<%ORACLE_SID%>_DBA
 
当使用%ORACLE_SID%来连接这个实例,第二组成员允许OS用户使用OS验证。
 
检查OS用户是否是这个连个本地成员之一:
 
获得OS用户名称:
 
D:\oracle\product\10.2.0\db_1\NETWORK\ADMIN>echo %username%
dbadmin
 
获得本地组成员列表:
 
D:\oracle\product\10.2.0\db_1\NETWORK\ADMIN>NET LOCALGROUP ORA_DBA
Alias name ORA_DBA
Comment Members can connect to the Oracle database as a DBA without a password
Members
 
-------------------------------------------------------------------------------
dbadmin
NT AUTHORITY\SYSTEM
The command completed successfully.
 
 
D:\oracle\product\10.2.0\db_1\NETWORK\ADMIN>set oracle_sid=d1v10204
 
D:\oracle\product\10.2.0\db_1\NETWORK\ADMIN>NET LOCALGROUP ORA_%ORACLE_SID%_DBA
Alias name ORA_d1v10204_DBA
Comment Members can connect to instance d1v10204 as a DBA without a password
 
Members
-------------------------------------------------------------------------------
dbadmin
The command completed successfully.
 
2.检查在$ORACLE_HOME/network/admin/SQLNET.ORA文件SQLNET.AUTHENTICATION_SERVICES的值
在Unix下 
 
 
如果没有有效地验证方法,这个参数最好不要设置。
如果如果要设置一种方法,可以使用下面的值:
 
SQLNET.AUTHENTICATION_SERVICES = (ALL)
or
SQLNET.AUTHENTICATION_SERVICES = (BEQ,<the strong auth method>)
 
<the strong auth method> 在这几个参数可以任意组合: TCPS, KERBEROS5, RADIUS
 
在Windows下
 
这个参数可以设置成NTS:
 
SQLNET.AUTHENTICATION_SERVICES = (NTS)
 
除此之外还可以天剑其他有效的验证方法:
 
SQLNET.AUTHENTICATION_SERVICES = (NTS,TCPS)
 
注意:如果这个参数设为NONE,这个OS验证将被关闭,这个用户将不得不提供一个有效的密码来登录数据库。
 
 
 
3.第1、2步做完还是不能连接数据库可以看下面:
Note 69642.1   - UNIX: Checklist for Resolving Connect AS SYSDBA Issues
Note 114384.1 - WIN: Checklist for Resolving CONNECT AS SYSDBA (INTERNAL) Issues 
 
4.如果还是依然不能解决,可以向Oracle请求支持,需要提供下面信息:
对于Unix
 
A) $ORACLE_HOME/network/admin/sqlnet.ora文件
B) $ORACLE_HOME/rdbms/lib/config.c(or config.s)文件
C) 执行 "id" 命令
D) 通过下面的命令生成一个跟踪文件: 
 
 
Linux: 
strace -o /tmp/strace_sysdba.output -cfT sqlplus / as sysdba
 
 
 
AIX, Solaris: 
truss -fea -o /tmp/truss_sysdba.output sqlplus / as sysdba
 
 
 
HP-UX: 
tusc -afpo /tmp/tusc_sysdba.output -aef sqlplus / as sysdba
 
 
 
对于 Windows
 
 
A) %ORACLE_HOME%/network/admin/sqlnet.ora文件
B) 执行 "echo %username% 和  "NET LOCALGROUP ORA_DBA"这个两个命令
 
 
 使用密码文件解决RA-1031问题
 
 
1.检查remote_login_passwordfile这个参数值。把它设置成EXCLUSIVE or SHARED:
SQL> show parameter remote_login_passwordfile
 
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
remote_login_passwordfile string EXCLUSIVE
 
如果这个参数没有设置正确,去修改这个参数重启数据库:
SQL> ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE SCOPE=SPFILE;
 
2.检查这个密码文件是否有正确名字和正确的路径,是否有相应的权限。
 
 
在Unix上
 
这个密码文件orapw<ORACLE_SID>必须在$ORACLE_HOME/dbs里。如果不存在,使用orapwd命令重新创建。
 
 
$ > orapwd file=$ORACLE_HOME/dbs/orapw<sid> password=<password> force=y ignorecase=n
 
这个文件将有以下权限:
-rw-r----- 1 oracle oinstall 1536 Jul 21 13:50 orapwdv11201 
 
在 Windows上
 
这个默认的密码文件在Windows的%ORACLE_HOME%/database目录,密码文件的名字必须是pwd<%ORACLE_SID%>.ora。密码验证Oracle会搜索下面的文件。
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HomeXX\ORA_<%ORACLE_SID%>_PWFILE
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HomeXX\ORA_PWFILE
默认的本地路径 ( %ORACLE_HOME%/database)
 
 注意:确定密码文件存在注册键值所设置的路径下。
 
如果这个密码文件不存在,可以使用orapwd命令创建:
 
D:\> cd %ORACLE_HOME/database 
D:\> orapwd file=pwd<sid>.ora password=<password> force=y nosysdba=n
 
 
3.检查用户是否有SYSDBA权限
SQL> select * from v$pwfile_users;
 
USERNAME SYSDB SYSOP SYSAS
------------------------------ ----- ----- -----
SYS TRUE TRUE FALSE
 
 
如果用户没有这个权限,执行下面语句赋权:
grant SYSDBA to myadminuser;
 
4.检查监听配置是否有问题,监听连接是否正常。
 
这个ORACLE_HOME的值在监听里要设置正确:
 
 
SID_LIST_LISTENER =
  (SID_LIST =
   (SID_DESC =
    (GLOBAL_DBNAME = d1v11203)
     (ORACLE_HOME = /oracle/product/11203)
    (SID_NAME = d1v11203)
   )
  )
 
 
这个SID在监听里配置的和实例名指定的ORACLE_SID一致:
 
 
SID_LIST_LISTENER =
   (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = d1v11203)
      (ORACLE_HOME = /oracle/product/11203)
     (SID_NAME = d1v11203)
   )
  )
 
 
频繁的密码验证
1>TNS别名的TNS地址以SYSDBA远程连接,导致平衡连接失败,产生ORA-1031。
 
这个TNS别名在tnsnames.ora里定义:
CLIENT_load_balance= 
 (DESCRIPTION = 
  (LOAD_BALANCE = yes)
 (ADDRESS_LIST = 
   (ADDRESS = (PROTOCOL = TCP)(HOST = ro-rac1.ro.oracle.com)(PORT = 1521)) 
   (ADDRESS = (PROTOCOL = TCP)(HOST = ro-rac2.ro.oracle.com)(PORT = 1521)) 
  ) 
  (CONNECT_DATA = 
  (SERVICE_NAME = service.idc.oracle.com) 
  ) 
 )
 
如果最后一个节点的密码文件配置不正确,就会产生这个错误。要确定每个节点上的密码文件都是正确的配置。
 
2>RMAN连接失败也会报下面的错误:
RMAN-04006: error from auxiliary database: ORA-01031: insufficient privileges
 
在执行RMAN命令之前要的确保密码文件配置的正确性,以便远程连接数据库。
 
3>EM的配置运行是需要sysdba远程连接的可用的。举个例子,当安装EM时,在emca_repos_config_yyyy_mm_dd_hh_mm_ss.log文件发现下面的错误:
 
Caused by: oracle.sysman.emdrep.config.ConfigurationException:
Cannot Create Connection:(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=testemconfig.us.oracle.com)(PORT=1553)))(CONNECT_DATA=(SERVICE_NAME=TESTDB)))
SYS
sysdba
ORA-01031: insufficient privileges
 
这个可以在sqlplus里重现:
 
[oracle@test dbs]$ sqlplus sys/oracle@r01 as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Tue Jun 7 16:02:39 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ERROR:
ORA-01031: insufficient privileges