由于种种原因,好久没有来这里发表自己的文章了。前段时间遇到一个有趣的问题,为难了我整整一个下午,这里写出来与各位分享。

 

使用sqlplus工具以sysdba身份本机登陆oracle数据库时,突然遇到了没有权限的问题。当时感觉很蹊跷,本机登陆命令:sqlplus / as sysdba 据我了解是最保险的一种登陆方法咯。怎么会报告没有权限呢。头上有点冒汗。经过了半个下午的摆弄依然无果,现在想起来当时简直是胡来!根本没有从原理入手去推断问题,只是一通胡乱测试,没有结果也是情理之中。冷静下来思考后,终于理清了思路,这种登陆方式是走的操作系统认证,即可排除监听故障影响。验证一下,通过sqlplus sys/xxx as sysdba 命令登陆正常,排除了密码文件异常的可能。那么操作系统认证的必要条件是uid和gid以及用户名组名的正确性,我来用id命令查一下看看,果然oracle用户id和用户名对应正常,可gid和组名却没有对应起来,只显示了gid并未显示组名。这是为什么呢?好奇怪!想想unix系统的gid与组名对应关系从何而来,答案摆在面前/etc/group文件,对!就是他!查看他的权限发现,除了root用户和root组有读权限,other用户上面却没有,这怎么可以呢?证明oracle用户根本读不到该文件的内容!难怪oracle用户下执行id命令不能看到gid对应的组名。将该文件权限修改正确,chmod a+r /etc/group 。再进入oracle用户查看,id命令显示正常。通过sqlplus / as sysdba即可正常登陆,而不再提示没有权限。

 

至此大功告成!任何事情不从原理推断妄下结论势必不能解决,反而可能把事情搞得更糟糕!