現象
リスナー経由で Oracle Database に接続しようとすると、TNS-12518 が発生する。
$ sqlplus scott/tiger@192.168.45.102:1521/orcl TNS-12518: TNS:listener could not hand off client connection TNS-12547: TNS:lost contact TNS-12560: TNS:protocol adapter error TNS-00517: Lost contact Linux Error: 32: Broken pipe
原因
$ORACLE_HOME/bin/oracle に SUID と SGID が設定されていなかったため。
$ ls -l $ORACLE_HOME/bin/oracle -r-xr---x 1 oracle oinstall 173515905 Aug 25 17:53 oracle
対処
$ORACLE_HOME/bin/oracle に SUID と SGID を設定する。
$ su - # chmod 6751 $ORACLE_HOME/bin/oracle # ls -l $ORACLE_HOME/bin/oracle -rwsr-s--x 1 oracle oinstall 173515905 Aug 25 17:53 oracle
妄想
11gR2 で Grid Infrastructure のリスナーを使用していて、リスナープロセスの実効ユーザーは grid で、$ORACLE_HOME/bin/oracle の所有者は oracle みたいな感じだとする。sqlplus などのクライアントから接続要求があるとリスナーはサーバープロセスを fork() しようとするが、サーバープロセスの実効ユーザーと実効グループは $ORACLE_HOME/bin/oracle の所有者と所有グループである必要がある。これを実現するためには SUID と SGID が設定されている必要がある。そうしないと共有メモリやセマフォなどの Oracle インスタンスのリソースに対してアクセスできない。
なんか、oracle ユーザ以外で sqlplus でローカル接続しようとすると ORA-27123 エラー - ablog を見ると今年の1月にも似たようなことしてますね。懐かしい。