在数据库所在服务器上登录的操作,使用的是操作系统认证方式登录数据库实例。在出现“ORA-01031 “ 的错误错误时,首先去检查sqlnet.ora 文件中SQLNET.AUTHENTICATION_SERVICES 项的配置信息。这种分析是被很多人推荐,在互联网上也有很多帖子都提及到。
大致得到的结论是:
1 、在windows 下,SQLNET.AUTHENTICATION_SERVICES 必须设置为NTS 或者ALL 才能使用OS 认证;不设置或者设置为其他任何值都不能使用OS 认证。
sqlnet.ora在WINDOWS下位于%ORACLE_HOME%NETWORKADMIN目录。
2 、在linux 下,在SQLNET.AUTHENTICATION_SERVICES 的值设置为ALL ,或者不设置的情况下,OS 验证才能成功;设置为其他任何值都不能使用OS 认证。
首先肯定一点,这种分析方法是没有错的。我在碰到这种问题时,首先去分析的也是这个文件的配置。
但在本案例中,sqlnet.ora 文件的内容如下:
[oracle@mikitradedb1 ~]$ more /u01/app/oracle/product/10.0.2/db_1/network/admin/sqlnet.ora
# sqlnet.ora Network Configuration File: /u01/app/oracle/product/10.0.2/db_1/network/admin/sqlnet.ora
# Generated by Oracle configuration tools.
NAMES.DIRECTORY_PATH= (TNSNAMES)
你会不会认为,还要坚持实例的初始化参数remote_login_passwordfile ,还有密码文件。而这两点是在异地服务器上使用sysdba 身份登录数据库实例时才会用到,现在情况是在本地数据库服务器上登录数据库实例。
再分析一下操作系统用户登录操作系统后再访问数据库实例的行为。
操作系统用户使用sysdba 身份连接数据库实例(任何用户使用sysdba 身份连接数据库实例后,在show user时都是为SYS用户,如sqlplus system/123 as sysdba),使用的认证方式是操作系统认证,而这一认证操作过程是操作系统根据它管理的信息去校验该用户是否可以连接数据库的过程。
因此,需要进一步分析的是,操作系统如果判断oracle 用户符合认证条件。很显然,我们这里的oracle 用户的权限被操作系统或者oracle 系统拒绝了(应该说是,oracle 系统根据该操作系统用户是否属于操作系统的“本地用户和组”(win7下)这一模块里的OSDBA 组的用户来判断该用户是否可以连接数据库)。
Oracle 认为,需要满足下列条件的用户才能使用系统认证方式连接数据库实例。
1 、系统用户oracle 必须属于一个特定的组
(如,检查登陆windows的用户是不是在包含在ORA_DBA组中,域用户没有连上域服务器时就可能出现这种现象。)
该用户必须属于OSDBA 组才能以sysdba 身份登录。这里的OSDBA 组在不同类型的操作系统上,名称会不一样。在unix 系统上名称为“dba ” ,而在windows 系统上名称则为“ORA_DBA ” 。
2 、 sqlnet.authentication_services 的参数必须设置正确
解决方法:
1、在unix 系统上
在unix 系统上,该参数值必须设置为ALL ,或者不设置;在windows 上,它必须设置为NTS 。
我们回到环境中去检查系统用户oracle 的所属组的情况。
[oracle@mikitradedb1 ~]$ id oracle
uid=501(oracle) gid=501(oinstall) groups=501(oinstall)
发现该用户只属于oinstall ,而没有dba 。
因此,我们在root 环境下使用usermod 对该用户进行调整。如下所示:
[root@mikitradedb1 ~]# usermod -G oinstall,dba -g oinstall oracle
[root@mikitradedb1 ~]# id oracle
uid=501(oracle) gid=501(oinstall) groups=501(oinstall),503(dba)
再次验证sysdba 身份登录操作,如下所示:
[root@mikitradedb1 ~]# su - oracle
[oracle@mikitradedb1 ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on Wed Jul 11 09:47:50 2012
Copyrigmiki (c) 1982, 2007, Oracle. All Rigmikis Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
结果显示已经是登录成功,问题就在oracle 用户没有在dba 组中。
另一种方法(在linux下):
OS:2.4.21-20.19AXsmp #1 SMP Wed Jan 5 05:02:09 EST 2005 i686 i686 i386 GNU/Linux
Oracle:Oracle 10.2.0.1
安装完数据库 并且dbca建完库后,数据库起来了
sqlplus / as sysdba总是报权限不足,ORA-01031: insufficient privileges
[oracle@wz_oracle2 dbs]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Tue Sep 21 16:41:01 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ERROR:
ORA-01031: insufficient privileges
Enter user-name:
[oracle@wz_oracle2 dbs]$ sqlplus sys/oracle
SQL*Plus: Release 10.2.0.1.0 - Production on Tue Sep 21 16:41:05 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options
SQL>
(1)、创建用户组
[root@lc /]# groupadd dbagroup
[root@lc /]# groupadd oinstall
(2)、添加oracle用户
[root@lc /]# useradd -g oinstall -G dbagroup oracle
[root@lc /]# passwd oracle
当时用的是 dbagroup组,但应该是Oracle标准是用dba组的,将$ORACLE_HOME/rdbms/lib/config.c文件里面的dba修改成我数据库的dbagroup组,最后再relink all一下。
[关于relink命令
relink一般是oracle的可执行文件出现问题后,重新生成一下sqlplus等程序;或操作系统打完影响Oracle执行相关的补丁重新生成部分oracle的lib;还有比如说如果你做备份项目用legato结合rman去备份oracle,也需要重新link libobk.a这个库文件。
这个问题,应该首先从 c 程序 从 文本程序到可执行文件来阐述
一段文本代码,首先第一部做的是 编译,将文本文件编译成 obj 文件(*.o),为了特定的需求有的还打包
然后是link ,link的时候生成可执行文件。
对于编译生成目标文件这一部,是需要编译器的。对于oracle开说,发布的安装程序一般都是已经编译好的 目标文件或者归档文件,在安装的时候拷贝这些文件到相应目录下之后,通过make 程序进行 link 再生成可执行程序。 在生成可执行程序的时候,除了oracle自身的目标文件外,还要倚赖一些os 的文件 以及自身的环境变量(有些可执行程序中直接引用环境变量,有些是hardcode了)。
所以当os 或者数据库打补动使得一些相关文件发生变化,则需要重新link相关文件,环境变量的变化也可能导致可执行文件运行发生问题(我认为这是oracle做的不好)。
cd $ORACLE_HOME/bin
more relink
看看这个shell脚本,一步一步理下去就知道了
]
重新试试登录:
[oracle@bakserver oracle]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Fri Dec 23 15:35:59 2011
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> select status from v$instance;
STATUS
------------
OPEN
SQL> exit
2、在window下
当前登录用户有没有加入到ORA_DBA,
坏了,我当前以administrator用户登陆,但是没有将其加入到ORA_DBA组里,原因找到
将administrator用户加入到ORA_DBA组里
再登陆数据库:sqlplus / as sysdba
ok,问题解决!
附加:在win7下的将用户帐户添加到组操作。
通过将用户帐户添加到组中,可以避免必须向多个不同的用户逐个授予相同的访问权限和权限。 组成员可以对设置进行相同类型的更改,并且对文件夹、打印机及其他网络服务具有相同的访问权限。
Windows 7 简易版、Windows 7 家庭普通版和 Windows 7 家庭高级版中,无法完成以上步骤。
通过单击「开始」按钮 ,在搜索框中键入 mmc,然后按 Enter,打开“Microsoft 管理控制台”。 如果系统提示您输入管理员密码或进行确认,请键入该密码或提供确认。
在“Microsoft 管理控制台”的左窗格中,单击“本地用户和组”。
双击“组”文件夹。
右键单击要将用户帐户添加到的组,然后单击“添加到组”。
单击“添加”,然后键入用户帐户的名称。
依次单击“检查名称”、“确定”,然后再次单击“确定”。
总而言之,在本地以sysdba 身份登录数据库实例时,碰到ORA-01031 权限不足的错误,需要系统用户所在的组是否有dba 和sqlnet.ora 文件中sqlnet.authentication_services 是否配置正确。
如果还有问题,还有一种方法可以继续分析。使用操作系统分析工具对sqlplus 应用进行分析。
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
分析工具使用方法可以参考mikitp://mikixiyou.iteye.com/admin/blogs/1489090
根据分析内容,可以进一步判断问题所在。
本文主要参考资料为Oracle 的“Troubleshooting ORA-1031: Insufficient Privileges While Connecting As SYSDBA [ID 730067.1] ” 一文。
二、远程以sysdba 身份登录数据库实例时,碰到ORA-01031 权限不足的错误
检查原因,有两点如下:
1. 要保证 remote_login_passwordfile 参数 = EXCLUSIVE .
2. 看看是否需要使用orapassw生成口令文件 .
一种解决方法案例:
1、检查系统参数:
SQL> show parameter password
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
remote_login_passwordfile string EXCLUSIVE
2、
select * from v$pwfile_users;
SQL>
为空
3、
SQL> grant sysdba to sys;
grant sysdba to sys
*
ERROR at line 1:
ORA-01994: GRANT failed: password file missing or disabled
4、建立password文件
D:/>orapwd file="D:/oracle/product/10g/db_1/database/PWDoratest.ora" password=gp
oswong entries=10
5、
SQL> select * from v$pwfile_users;
USERNAME SYSDB SYSOP
------------------------------ ----- -----
SYS TRUE TRUE
SYS正常显示出来。
6、重新在远程以SYSDBA登录,可正常使用。
如果口令文件创建的有问题,也是会报如下的错误:
ora-01031:insufficient privileges
口令文件的命名格式应为orapwsid,并且sid是区分大小写的。由于Target Database连接Auxiliary Database时需要验证口令,
如果违反了以上规则,将会提示ORA-01031: insufficient privileges。
我在用linux创建duplicate数据库的时候 就是因为口令文件创建的路径和名称不对才遇到这个错误
附加:
sqlnet.ora属于客户端的文件,即它作用于客户端的,如在客户端里的sqlnet.ora文件里的NAMES.DIRECTORY_PATH=(tnsnames, onames,ezconnect)中的EZconnect去掉,则客户端以sqlplus 用户/密码@IP地址:1521/服务名 形式登陆服务端就不行的(IP地址:1521/服务名 就是所谓的EZconnect方法)。而在服务端里的sqlnet.ora文件里的EZconnect去掉,则客户端以sqlplus 用户/密码@IP地址:1521/服务名 形式登陆服务端不受影响。
更正附加所说的“sqlnet.ora属于客户端的文件”,应该说sqlnet.ora里的某些参数是作用于客户端的,如NAMES.DIRECTORY_PATH,某些参数是作用于服务端的,如SQLNET.EXPIRE_TIME,SQLNET.AUTHENTICATION_SERVICES= (NTS)。