在安装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用户组是正确的。

虽然说计划没有变化快,但我还是愿意列一个2009年的计划,或者说是2009年的目标。
人活着,总是离不开生活,工作和学习。学习是为了更好地工作,工作是为了生活得更好。所以我老熊的2009年计划(目标),对于工作、生活和学习都会有所涉及。

首先是关于学习了,主要是Oracle,《Cost Based Oracle Fundamentals》这本书,需要反复研究。《Troubleshooting Oracle Perforamnce》和《Oracle Database 10g Performance Tuning Tips and Techniques》这两本书,至少要看一遍,希望有所收获。Oracle的官方文档《Oracle10g Database Performance Tuning Guide And Reference》和《Oracle10g Database Administrator's Guide》也要经常翻翻。对于RAC、Partition、Dataguard等内容,需要进一步深入。

花一点时间,更深入地研究一下Oracle内部的东西,虽然由于资料的匮乏,这个有些难度。不过,研究一个东西,是相当有意思的一件事情,不是吗?

如果有时间,涉足一下Oracle 11g的新功能。

除了Oracle,在操作系统及存储上,能够掌握更多的知识,当然主要是性能方面。

每周在这个网站上发表一篇原创的技术文章。虽然有时很忙,但个人认为,忙不是理由。写这些文章,我收获良多,并且把我所知道的东西共享出去,也是一件乐趣。所以,这是一件非常值得坚持做下去的事情。

在2008年初的时候,为了更好地研究oracle的块格式,也曾打算写一个类似于DUL的工具(我自己取名叫ODU),并最终付诸实施,只不过,个人对这个兴趣不是特别大,必竟已经有那么多同类型的工具了。不过,通过ODU这个程序的编写,掌握了Oracle的各种表,字段类型和索引的存储格式,收获还是很大的,我打算在2009年全部写完。这个话题,我会另外撰文详述。

2009年,希望能够站在更高的层面上,思考Oracle、操作系统、存储,甚至是IT系统上的整体架构。不再仅限于具体的技术细节。

谈完学习,再谈工作。根据目前的工作性质,能够保持工作热情,更有效率和更有质量地完成工作,是2009年的目标。

至于生活,我个人其实欲望并不高。只希望一家人,开开心心在一起生活,就足够了。天天陪着儿子玩一会儿,就已经感到非常满足。

一年的时间很快就会过去,2009年底的时候,我们再回头看看,上面的计划和目标到底有没有实现。计划先列在这里,也算是对我的一种鞭策,让我找到目标。