【Oracle点滴积累】Error ORA-01031 Insufficient Privileges

现象:

      sqlplus  / as sysdba

ora-01031:insufficient privileges

1.     检查sqlnet.ora 文件

sqlnet.ora 文件损坏或格式不对可以导致出现该问题。 
sqlnet.ora 文件可能存放路径为

 $ORACLE_HOME/network/admin/sqlnet.ora   
 $HOME/sqlnet.ora       
(1).   可以从别的机器拷贝一个文件过来,注意备份原来的sqlnet.ora。 
---检查sqlnet.ora 文件内容 
(2).   检查SQLNET.AUTHENTICATION_SERVICES   
如果没有使用dblink.检查该行并设置 
Windows Server:SQLNET.AUTHENTICATION_SERVICES = (NTS) 

Linux Server: SQLNET.AUTHENTICATION_SERVICES = (ALL)
(3).    SQLNET.CRYPTO_SEED   
在unix 下不需要该参数。如果存在该行,注释掉或删掉 
(4).AUTOMATIC_IPC   
如果该参数为 ON,将强制使用"TWO_TASK" 连接 
最好设置为OFF 

AUTOMATIC_IPC = OFF 

2.     检查相关文件的权限配置找到$ORACLE_HOME/network/admin/* 
$ cd $ORACLE_HOME/network/admin/     
$ chmod 644 sqlnet.ora tnsnames.ora listener.ora     
$ ls -l sqlnet.ora tnsnames.ora listener.ora     
-rw-r--r--    1 oracle dba         1628 Jul 12 15:25 listener.ora    
-rw-r--r--    1 oracle dba          586 Jun   1 12:07 sqlnet.ora     
-rw-r--r--    1 oracle dba        82274 Jul 12 15:23 tnsnames.ora 

3.     检查oracle用户是否在dba组中

$ id oracle

uid=501(oracle) gid=501(oinstall) groups=501(oinstall),0(root)

$ vi /etc/group

dba:x:502:oracle

(找到dba组,然后把oracle添加到后面)

4.     检查remote_login_passwordfile是否为EXCLUSIVE

可以先采用密码认证的方式登录

SQL> conn sys/PWD as sysdba

Connected.

SQL> show parameter password;
NAME                            TYPE        VALUE
----------------------------------------------
remote_login_passwordfile    string   EXCLUSIVE

5.     检查操作系统相关设置
(1).   $ORACLE_HOME环境变量是否设置正确 
% cd $ORACLE_HOME      
% pwd   
如果错误,请重新设置: 
sh or ksh:     ----------      
$ ORACLE_HOME=<path_to_ORACLE_HOME>      
$ export ORACLE_HOME       
Example:      
$ ORACLE_HOME=/u01/app/oracle/product/7.3.3      
$ export ORACLE_HOME        
csh:      ----     
% setenv ORACLE_HOME <path_to_ORACLE_HOME>        Example:      
% setenv ORACLE_HOME /u01/app/oracle/product/7.3.3    
另外$ORACLE_HOME路径应为实际路径,不应是目录连接(ln -s) 
(2)   $ORACLE_SID是否设置正确; 
% echo $ORACLE_SID                            
(3).确信没有设置$TWO_TASK 
检查 "TWO_TASK" 是否设置: 
sh, ksh or on HP/UX only csh:     
----------------------------------- 
env |grep -i two     
- or -     
echo $TWO_TASK      
csh:      
---- 
setenv |grep -i two        
如果有返回行比如: 
TWO_TASK=     
- or -   
TWO_TASK=PROD    
就需要取消着这些环境变量设置 : 
sh or ksh:    
----------     
unset TWO_TASK         
csh: 
----     
unsetenv TWO_TASK    
(4) 检查oracle 文件的权限: 
% cd $ORACLE_HOME/bin      
% ls -l oracle 
权限应为:rwsr-s--x, or 6751. 
如果不是: 
% chmod 6751 oracle   
(5). 检查当前所连接的操作系统用户是否是"osdba" 并且已经定义在: 
"$ORACLE_HOME/rdbms/lib/config.s"   
or 
"$ORACLE_HOME/rdbms/lib/config.c". 
通常应为dba 
% id      uid=1030(oracle) gid=1030(dba)     
可以如果"gid" 是 "dba" , "config.s" or "config.c" 
里面应该有:            /* 0x0008          15 */          .ascii   "dba\0"     
如果没有添加目前的操作系统用户到dba 组,或则手工编辑更改config.c并且:%relink oracle 
(6).所需要的文件系统是否正确mount 
%mount 
(7) 目前身份是否是"root" 并且操作系统环境变量 "USER", "USERNAME", and "LOGNAME" 没有设置成"root". 
root用户是特例,除非当前组是dba 组,否则不能connect internal. 
把root用户当前组改为dba组: 
# newgrp dba 
-----最好不要以root管理数据库; 
(8).检查"/etc/group" : 
是否存在重复行 
% grep dba /etc/group        
dba::1010: 
dba::1100:   
如果有,删掉没有用的。 
(9).确信停掉的instance没有占用内存资源 
比如:ipcs -b             
T          ID        KEY         MODE     OWNER       GROUP    SEGSZ         
Shared Memory:            
m           0    0x50000ffe --rw-r--r-- root        root          68            
m        1601    0x0eedcdb8 --rw-r----- oracle       dba     4530176         
可以看到1601 被oracle 使用,删掉. 
-------注意是否启动了多个instance 
% ipcrm -m 1601 
(10).如果同时还有ora-12705 错误检查一下环境变量: 
"ORA_NLS", "ORA_NLS32", "ORA_NLS33" ,"NLS_LANG".      
(11).检查 "ORACLE_HOME" and "LD_LIBRARY_PATH 环境变量: 
$ LD_LIBRARY_PATH=$ORACLE_HOME/lib      
$ export LD_LIBRARY_PATH       
$ ORACLE_HOME=/u01/app/oracle/product/8.0.4      
$ export ORACLE_HOME 
(12).当前的instance 所再的磁盘是否有足够的磁盘空间 
df -k 
(13).用户对/etc/passwd 是否有读权限。 
(14).如果使用mts 方式,确信你的连接使用dedicade server 方式。 
(15).安装ORACLE所需操作系统补丁是否打全。ORACLE 是否已经补丁到最新