ablog

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

リスナー経由で Oracle Database に接続しようとすると TNS-12518 が発生する

現象

リスナー経由で 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月にも似たようなことしてますね。懐かしい。