Oracle XEデータベースを起動すると、suはセッション・エラーを開くことができません。

Oracle XEデータベースを起動すると、suはセッション・エラーを開くことができません。

Oracle 11g Express Edition(11.2.0)がインストールされているRHEL 7.2サーバーがあります。 Oracleをインストールすると、/etc/init.dに「oracle-xe」というファイルが作成されます。これは、リスナーとデータベースを手動で開始および停止するために使用できるbashスクリプトです。サーバーにログインすると、次のコマンドを実行できます。

dzdo /etc/init.d/oracle-xe start

そして、Oracleリスナー+データベースは問題なく起動します。 sqlplusを使用してログインし、コマンドを実行できます。サーバーが再起動されるたびにリスナーとデータベースを手動で起動する必要がないように、chkconfigを使用してシステム起動時にoracle-xeが自動的に実行されるようにします。 oracle-xeスクリプト自体はかなり長いですが、その要旨は次のとおりです。

#!/bin/bash
# chkconfig: 2345 80 05

# Source fuction library
if [ -f /lib/lsb/init-functions ]
then
    . /lib/lsb/init-functions
elif [ -f /etc/init.d/functions ]
then
    . /etc/init.d/functions
fi

SU=/bin/su
ORACLE_OWNER=oracle
$ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
LSNR=$ORACLE_HOME/bin/lsnrctl
SQLPLUS=$ORACLE_HOME/bin/sqlplus
$STARTUP_LOG=/home/tsm/log/oracle-xe.log

echo $(date) >> $STARTUP_LOG    
$SU -s /bin/bash $ORACLE_OWNER -c "$LSNR start" >> $STARTUP_LOG 2>&1
$SU -s /bin/bash $ORACLE_OWNER -c "$SQLPLUS -s /nolog @$ORACLE_HOME/config/scripts/startdb.sql" >> $STARTUP_LOG 2>&1

何が起こっているのかを知るために、$STARTUP_LOGコードと>>出力リダイレクトを追加しました。次の内容でchckconfigにスクリプトを追加しました。

cd /etc/init.d
dzdo chmod 750 oracle-xe
dzdo chkconfig --add oracle-xe
dzdo chkconfig oracle-xe on

次のコマンドは、与えられた(短縮された)出力を生成します。

dzdo chkconfig --list

oracle-xe       0:off    1:off   2:on   3:on   4:on   5:on  6:off

サーバーを再起動し、/home/tsm/log/oracle-xe.logに次の出力を持つログファイルを生成しました。

Fri Jan 13 15:03:58 CST 2017
su: cannot open session: Permission denied
su: cannot open session: Permission denied

推測できるように、このsuの失敗により、リスナーもデータベースエンジンも開始されませんでした。ログファイルに再起動日時が表示されるので、起動時にスクリプトが実行されていると確信しています。これは権限の問題のようです。起動時に init スクリプトを実行するために使用されるアカウントは、何らかの理由で $ORACLE_OWNER で su できません。しかし、私は低レベルの管理者としてコマンドプロンプトでこれを行うことができます。私が理解したように、初期化コードはrootとして実行されるので、このsuコマンドは問題なく実行する必要があります。私は一日のほとんどをこの問題を解決するためにさまざまな方法を検索して試みるのに費やしました。

サーバー自体はDirectAuthorizeを使用してアクセスを許可するため、sudoの代わりにdzdoを使用するようになりました。これはこれに関連していますか?

答え1

だから私は何が起こっているのか理解しています。システムがDirectAuthorizeを使用しているときにsu他のユーザーとして機能するすべてのアカウント〜しなければならない代わりに使用してくださいdzdo。これには、システム起動中にchkconfigを介してサービスを開始するために使用されるルートアカウントも含まれます。そのため、oracle-xeスクリプトファイルで次の行を変更しました。

$SU -s /bin/bash $ORACLE_OWNER -c "$LSNR start" >> $STARTUP_LOG 2>&1
$SU -s /bin/bash $ORACLE_OWNER -c "$SQLPLUS -s /nolog @$ORACLE_HOME/config/scripts/startdb.sql" >> $STARTUP_LOG 2>&1

に変更:

dzdo -s -u $ORACLE_OWNER $LSNR start >> $STARTUP_LOG 2>&1
dzdo -s -u $ORACLE_OWNER $SQLPLUS -s /nolog @ORACLE_HOME/config/scripts/startdb.sql >> @STARTUP_LOG 2>&1

dzdosuオプションが異なり、単に所定の位置に配置することはできないため、直接交換ではありません。特に、-c特定のコマンドを実行するオプションはありませんdzdo。代わりに実行されるコマンドは、ステートメントの最後に表示されるすべてのものです。この-sスイッチは、シェルをターゲットユーザーとして実行するように指示します。これらの変更を実行して再起動した後、リスナーとデータベースインスタンスは何の問題もなくユーザー "oracle"で始まりました。

関連情報