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할 수 없습니다. 그러나 저는 낮은 수준의 관리자로서 명령 프롬프트에서 이 작업을 수행할 수 있습니다. 내가 이해한 바에 따르면 초기화 코드는 루트로 실행되므로 이 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"로 시작되었습니다.

관련 정보