ablog

不器用で落着きのない技術者のメモ

oracle ユーザ以外で sqlplus でローカル接続しようとすると ORA-27123 エラー

環境

$ cat /etc/issue
CentOS release 5.3 (Final)
Kernel \r on an \m
$ uname -r
2.6.18-128.el5
$ sqlplus -s / as sysdba <<EOF
> select * from v\$version;
> EOF

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod
PL/SQL Release 10.2.0.4.0 - Production
CORE    10.2.0.4.0      Production
TNS for Linux: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production

現象

  • Oracle のバイナリの所有者以外、つまり Oracle をインストールしたユーザ以外で SQL*Plus でローカル接続しようとすると ORA-01034 が発生する。
$ su - test
$ sqlplus test/test

SQL*Plus: Release 10.2.0.4.0 - Production on Thu Jan 28 20:53:46 2010

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

ERROR:
ORA-01034: ORACLE not available
ORA-27123: unable to attach to shared memory segment
Linux Error: 13: Permission denied

原因

$ ls -l /opt/app/oracle/product/10.2.0/db_1/bin/oracle
-rwxr-x--x 1 oracle oinstall 96789136 Jan 26 21:46 /opt/app/oracle/product/10.2.0/db_1/bin/oracle

対処

$ chmod 6751 /opt/app/oracle/product/10.2.0/db_1/bin/oracle
$ ls -l /opt/app/oracle/product/10.2.0/db_1/bin/oracle
-rwsr-s--x 1 oracle oinstall 96789136 Jan 26 21:46 /opt/app/oracle/product/10.2.0/db_1/bin/oracle

蛇足

ところで、$ORACLE_HOME/bin/oracleパーミッションっていつ設定されてるんだ?

$ grep -R oracle $ORACLE_HOME|perl -nle '/.*chmod.*oracle$/i and print'
...
/opt/app/oracle/product/10.2.0/db_1/cfgtoollogs/oui/installActions2010-01-26_09-44-17PM.log:INFO: chmod 6751 /opt/app/oracle/product/10.2.0/db_1/bin/oracle
/opt/app/oracle/product/10.2.0/db_1/cfgtoollogs/oui/installActions2010-01-26_09-33-52PM.log:INFO: chmod 6751 /opt/app/oracle/product/10.2.0/db_1/bin/oracle
...
/opt/app/oracle/product/10.2.0/db_1/install/make.log:chmod 6751 /opt/app/oracle/product/10.2.0/db_1/bin/oracle
/opt/app/oracle/product/10.2.0/db_1/install/make.log:chmod 6751 /opt/app/oracle/product/10.2.0/db_1/bin/oracle
/opt/app/oracle/product/10.2.0/db_1/rdbms/lib/ins_rdbms.mk:     -chmod 6751 $(ORACLE_HOME)/bin/oracle
...

root.sh 実行時かと思ったら、make の中でやってた。
ログ見る限りでは 6751 にパーミッション設定されてるんだけど。
だれかいじったのかな?

参考


追記(2010/01/30):
リスナー経由で接続した場合、oracle ユーザで実行されているリスナープロセスからサーバー・プロセスが fork される。ローカル接続の場合、sqlplus のプロセスから sqlplus の実行ユーザでサーバープロセスが fork される。したがって、上記のケースでは、リスナー経由では接続できるがローカル接続では接続できないという状態になる。それで、サーバー・プロセスは起動するが、共有メモリにアクセスできない。

ということは、共有メモリにアクセス権があれば、$ORACLE_HOME/bin/oracleパーミッションを修正しなくてもローカル接続できるってことか。共有メモリはどのプロセスが作成してるんだろ。共有メモリへのアクセス権は何を元に決めてるんだろ。などなど妄想が広がる。


追記(2011/07/19):
参考になる NOTE をメモ。

  • NOTE 1004543.6
  • NOTE 1011995.6


追記(2012/0/02):

  • KROWN#18861


追記(2013/02/01):

  • 検索キーワード: setuid, setgid