在安装oracle时,oracle会提示输入sysdba用户组名,凡是以操作系统认证方式的连接,如果连接的用户在这个指定的用户组中,就可以用sysdba用户登陆。一般情况下,也是建议的sysdba用户组为dba。

有的时候,也存在这样一种情况,安装oracle软件的时候,输入了错误的sysdba用户组名(主要是由于创建oracle用户时指定到了错误的其他用户组中,现实中这种情况曾经出现过)。这样一来,就会导致不规范的安装,或者oracle后来修改回正确的用户组(dba),将导致oracle用户不能以sysdba权限连接数据库,甚至不能启动数据库)。不规范的安装,如果将安装的oracle软件tar到其他机器,会导致那个机器的oracle也出现oracle不能以sysdba连接的问题(有的人安装oracle时,如果有现成的,他就喜欢用tar的方式)。

如果指定了错误的sysdba用户组名,怎么样快捷修改而又不用重新安装oracle软件呢?既然在安装时可以指定,那么一定会有一个地方,存储了这个配置,这个存储的文件就是$ORACLE_HOME/rdbms/lib/config.c。

我们看看config.c这个文件的内容:
[oracle@xty lib]$ cat 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. */

#define SS_DBA_GRP "dba"
#define SS_OPER_GRP "dba"

char *ss_dba_grp[] = {SS_DBA_GRP, SS_OPER_GRP};

从这个文件中,可以看到SYSDBA的用户组为"dba",而SYSOPER的用户组也为"dba"。如果我们把#define SS_DBA_GRP "dba"这一行改为#define SS_DBA_GRP "adm",然后执行下面的命令:relink all,再用oracle用户连接数据库时:

[oracle@xty ~]$ sqlplus /nolog

SQL*Plus: Release 10.2.0.3.0 - Production on Sat Jan 10 15:30:17 2009

Copyright (c) 1982, 2006, Oracle. All Rights Reserved.

SQL> connect / as sysdba
ERROR:
ORA-01031: insufficient privileges

SQL> connect / as sysoper
Connected to an idle instance

可以看到,oracle用户已经不能够用sysdba权限连接到数据库,也就更谈不上启动数据库了。但是由于sysoper的用户组没有改变,所以oracle仍然是可以用sysoper权限连接数据库并启动数据库的。(不过如果我们不使用操作系统认证,比如通过网络连接的方式用SID连接,并提供sys用户的密码,使用密码文件认证,也一样能够使用sysdba权限连接)

如果修改用户oracle的用户组为adm,则可以使用sysdba用户连接了。
[root@xty ~]# usermod -G adm oracle
oracle用户重新登陆到服务器上

[root@xty ~]# su - oracle
[oracle@xty ~]$ sqlplus "/ as sysdba"

SQL*Plus: Release 10.2.0.3.0 - Production on Sat Jan 10 15:42:47 2009

Copyright (c) 1982, 2006, Oracle. All Rights Reserved.

Connected to an idle instance.

最后,我们把config.c修改回原来的值("dba"),再relink all,再把oracle的用户组修改回dba,oracle也就恢复了原状。

在数据库服务器上,如果采用操作系统认证,而oracle用户又不能以sysdba权限连接(ORA-01031错误),在其他可能都排除后,有必要检查一下config.c,以确认sysdba用户组是正确的。

Trackback

7 comments untill now

  1. 楼主研究还挺深,不过对于生产库,这种情况真是很难遇到啊,除非是一个不是dba的dba安装数据库,呵呵。。。

    [回复]

  2. 这种情况的确很少有,但实际情况中,在生产库中也发生中。有一个库,AIX上的,创建用户时,Oracle指定的主用户组为staff,导致安装时sysdba的用户组就为staff(安装的时候,很多人习惯性的一路Next下去)。后来,不知道谁又把oracle用户的组中去掉了staff,结果就出问题了。

    其实现实中,不是DBA的安装数据库的情况,很多。

    [回复]

  3. brucewoo @ 2009-05-05 15:28

    在AIX/Solaris下都没有看到config.c,
    Linux下就有,难道和操作系统平台有关.

    [回复]

    老熊 回复:

    如果没有config.c,那么就应该有config.s这个文件。修改这个文件也是一样。

    [回复]

  4. brucewoo @ 2009-05-06 10:27

    谢谢,在AIX下看到了config.s这个文件.

    [回复]

  5. wangning @ 2012-03-16 12:41

    今天在客户那边遇到这个问题。
    也发现了config.s这个文件存在问题。
    暂时还没有进行改动。
    这是个生产库,现在业务都跑着呢。
    我如果像你这样修改后再relink all,对库会有会有影响呢。
    不太清楚有没有其他的隐患。

    [回复]

    老熊 回复:

    relink操作需要在业务停止数据库关闭之后才能进行。
    在relink之前,稳妥的方式是将$ORACLE_HOME做一个备份。从目前来看没有其他什么隐患。

    [回复]

Add your comment now