環境
$ 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
現象
$ 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