패키지와 서비스 관리
Oracle Linux 7.9의 yum과 preinstall 패키지, 폐쇄망 설치 및 systemd 기반 DB 자동 기동 점검
#핵심 요약
Oracle 설치는 컴파일러, 라이브러리, 비동기 I/O, 셸 같은 OS 패키지 수십 개가 먼저 갖춰져야 하며, yum은 이것을 저장소에서 찾아 의존 패키지와 함께 설치함
실습 서버인 Oracle Linux 7.9는 yum을 쓰고 dnf는 없음(OL 8부터 제공)
oracle-database-preinstall-19c 하나가 필수 패키지, oracle 계정과 그룹, 커널 파라미터, limits를 준비하지만, 무엇을 바꿨는지 직접 확인함
systemctl start는 지금 켜기, enable은 부팅 때 자동 시작 등록이며, DB 자동 기동은 /etc/oratab의 Y, dbstart, dbshut, unit 파일, enable, 재부팅 검증까지 해야 완성됨
#개념과 동작 원리
| 구분 | 내용 |
|---|---|
| yum 저장소 | Oracle Linux OS 패키지 저장소(ol7_latest, ol7_UEKR6 등), 설정은 /etc/yum.repos.d/*.repo |
| DB 설치 파일 | yum 저장소가 아니라 Oracle Software Delivery Cloud 등에서 따로 받음 |
el7 |
패키지 Release 끝의 OS 표시, OL 7에는 el7만 설치함 |
| preinstall | 의존 패키지, 계정, 그룹, /etc/sysctl.d/97-oracle-database-sysctl.conf, /etc/security/limits.d/oracle-database-preinstall-19c.conf |
| OL 7 전용 | compat-libcap1, compat-libstdc++-33은 OL 7에서만 요구됨 |
systemctl status, is-active, is-enabled |
상태, 지금 실행 중인지, 부팅 자동 시작 등록인지 |
/etc/oratab |
SID:ORACLE_HOME:Y/N, 마지막이 Y인 DB만 dbstart가 올림 |
#필수 명령어 또는 SQL
#yum과 저장소 확인
cat /etc/oracle-release
which yum
which dnf
yum --version | head -1
yum repolist
yum repolist all | head
ls -l /etc/yum.repos.d/yum install -y yum-utils
yum-config-manager --enable ol7_optional_latest
yum-config-manager --enable ol7_addons결과 해석:
실습 기록: OS release 7.9, yum 3.4.3, which dnf는 no dnf in ...
인터넷 문서의 dnf 명령을 그대로 치면 command not found가 남
ol7_latest가 enabled인지 먼저 보며, OL 7에서 Oracle 설치에 필요한 패키지 대부분이 여기에 있음
repo id 앞의 !는 저장소는 켜져 있지만 최근 메타데이터를 새로 받지 못해 캐시가 오래됐을 수 있다는 표시이고, status 숫자는 패키지 수임
yum-config-manager --enable은 .repo 파일의 그 저장소 섹션을 enabled=1로 바꿈ol7_optional_latest는 기본 저장소에 없는 부가 패키지, ol7_addons는 Oracle이 따로 제공하는 도구 모음임
#preinstall 검색, 설치, 결과 확인
yum search oracle-database-preinstall
yum info oracle-database-preinstall-19c
yum install -y oracle-database-preinstall-19c
rpm -qa | grep oracle-database-preinstall
yum list installed oracle-database-preinstall-19c
id oracle
getent group oinstall
grep -R "oracle" /etc/security/limits.d /etc/security/limits.conf 2>/dev/null
ls -l /etc/sysctl.d/
sysctl -a | egrep 'kernel.shmmax|kernel.sem|fs.file-max|fs.aio-max-nr'결과 해석:
info로 Release가 el7인지, 다른 버전(18c, 21c) 패키지가 아닌지 확인하고 설치함
실습 기록: preinstall 1개와 의존 패키지 22개가 설치되며 의존 목록에 compat-libcap1, compat-libstdc++-33, gcc, ksh, libaio-devel, sysstat 등이 보임
실습 기록: limits 파일에 oracle의 nofile 1024/65536, nproc 16384/16384, stack 10240/32768, sysctl에 fs.aio-max-nr = 1048576, fs.file-max = 6815744, kernel.sem = 250 32000 100 128
-y는 확인 질문에 자동으로 yes를 답하므로 운영 서버에서는 설치될 목록을 먼저 봄
손으로 만든 99-oracle-*.conf와 preinstall 파일이 함께 있으면 같은 항목은 나중에 읽힌 파일의 값이 최종값이 되므로 sysctl과 새 로그인 세션의 ulimit으로 확인함
값의 뜻과 직접 설정하는 방법은 커널 파라미터와 자원 제한에서 다룸
#개별 필수 패키지 점검과 기록
rpm -q binutils compat-libcap1 compat-libstdc++-33 gcc gcc-c++ \
ksh libaio libaio-devel make sysstat unixODBC unixODBC-devel
yum install -y unixODBC unixODBC-devel
mkdir -p /root/install_check
rpm -qa | sort > /root/install_check/rpm_list_$(date +%Y%m%d_%H%M).txt
yum history | head
yum history info <ID>결과 해석:
| 구분 | 패키지 |
|---|---|
| 컴파일, 링커 | binutils, gcc, gcc-c++, make, glibc-devel |
| OL 7 전용 호환 | compat-libcap1, compat-libstdc++-33 |
| 비동기 I/O | libaio, libaio-devel |
| 셸, 모니터링 | ksh, sysstat, smartmontools |
| ODBC | unixODBC, unixODBC-devel |
| X 라이브러리 | libX11, libXau, libXi, libXtst, libxcb, libXrender |
| 네트워크, 기타 | net-tools, nfs-utils, elfutils-libelf-devel |
실습 기록: preinstall 뒤에도 unixODBC, unixODBC-devel은 is not installed로 나와 따로 설치함
패키지 목록은 Oracle, OS 버전에 따라 달라지므로 설치 문서의 목록을 rpm -q로 점검하고 빠진 것만 설치함
수업은 패키지 배열을 돌며 [OK], [MISSING]을 찍고 누락 수를 종료 코드로 돌려주는 check_oracle_packages.sh를 만들어, 결과를 tee로 날짜별 파일에 남김
설치 전후 rpm -qa 목록과 yum history는 변경 이력과 작업 보고서의 근거가 됨
#폐쇄망 대비 (RPM 묶음 설치)
yum install -y yum-utils
mkdir -p /repo/rpms
yumdownloader --resolve --destdir=/repo/rpms oracle-database-preinstall-19c
ls /repo/rpmscd /repo/rpms
yum localinstall -y *.rpm
grep -R "gpgcheck" /etc/yum.repos.d/*.repo
rpm -qa gpg-pubkey*결과 해석:
--resolve가 의존 패키지까지 함께 받아, 하나만 옮겨 의존성 부족으로 실패하는 일을 막음
rpm -ivh로 하나씩 넣는 것보다 yum localinstall이 의존성을 함께 처리해 편함
GPG 키 오류가 나면 gpgcheck=0으로 우회하지 않고 저장소 설정과 키 파일을 확인함
#설치가 실패할 때
ping -c 2 yum.oracle.com
cat /etc/resolv.conf
yum repolist all | egrep 'ol7_latest|ol7_addons'
ps -ef | grep [y]um
ls -l /var/run/yum.pid
yum check-updateyum clean all
yum makecache결과 해석:
확인 순서: 네트워크 → DNS → 저장소 활성화 → 메타데이터(캐시) → 패키지 이름 → 다른 yum 프로세스의 잠금
실습에서는 yum이 계속 실패할 때 /etc/resolv.conf에 DNS 서버를 더해 yum.oracle.com 이름 해석부터 되게 했음
NetworkManager가 관리하는 환경에서는 nmcli로 DNS를 정해야 재시작 뒤에도 유지됨
Another app is currently holding the yum lock이면 /var/run/yum.pid와 ps 결과로 실행 중인 yum을 확인함
yum check-update는 새 버전이 있는지만 보여 주며, 이미지가 오래됐으면 보안 패치가 많이 나오는 것이 정상임
운영 서버에서 yum update, yum remove를 가볍게 실행하면 커널, glibc, openssl 같은 패키지가 함께 바뀌거나 지워질 수 있음
#DB 자동 기동 (oratab, dbstart, systemd)
ps -ef | grep pmon | grep -v grep
systemctl list-unit-files | grep -i oracle
systemctl status sshd
systemctl is-enabled sshd
systemctl is-active sshd
systemctl is-enabled oracle-rdbmsgrep -v "^#" /etc/oratab
dbstart $ORACLE_HOME
ps -ef | grep pmon | grep -v grep
dbshut $ORACLE_HOME[Unit]
Description=Oracle Database Service
After=network.target
[Service]
Type=forking
User=oracle
Group=oinstall
ExecStart=/u01/app/oracle/product/19.3.0/dbhome_1/bin/dbstart /u01/app/oracle/product/19.3.0/dbhome_1
ExecStop=/u01/app/oracle/product/19.3.0/dbhome_1/bin/dbshut /u01/app/oracle/product/19.3.0/dbhome_1
RemainAfterExit=yes
[Install]
WantedBy=multi-user.targetsystemctl daemon-reload
systemctl status oracle-rdbms
systemctl start oracle-rdbms
systemctl stop oracle-rdbms
systemctl enable oracle-rdbms
systemctl is-enabled oracle-rdbms
reboot
systemctl is-active oracle-rdbms
journalctl -u oracle-rdbms --no-pager | tail -10결과 해석:
처음에는 systemctl is-enabled oracle-rdbms가 No such file or directory로, systemd가 그런 서비스를 모른다는 뜻임
sshd는 /usr/lib/systemd/system/sshd.service가 있어 enabled로 답함
/etc/oratab 마지막 필드가 N이면 unit 파일을 잘 만들어도 dbstart가 그 DB를 건너뜀
unit 파일을 systemd에 맡기기 전에 dbstart, dbshut로 수동 기동, 정지가 되는지 보고, 실패하면 startup.log부터 해결함
User=oracle이 없으면 root로 dbstart가 실행돼 환경, 권한 문제로 실패함RemainAfterExit=yes는 dbstart가 프로세스를 남기고 끝난 뒤에도 서비스를 active로 둠
unit 파일을 만들거나 고친 뒤에는 daemon-reload를 해야 Loaded: loaded로 보임
enable은 multi-user.target.wants에 심볼릭 링크를 만들며, 그 뒤 실제로 재부팅해 is-active, ora_pmon_<SID>, lsnrctl status, ss -tnl로 인스턴스와 리스너가 모두 올라왔는지 확인해야 설정을 믿을 수 있음
journalctl -u oracle-rdbms에서 Starting, Started 사이에 오류가 있으면 Oracle의 startup.log와 함께 봄
#사용 조건과 주의사항
preinstall 설치는 DB 소프트웨어 설치가 아니며, 계정, 커널, limits가 미리 손으로 만든 설정과 겹치는지 확인함
systemd의 active나 Started 로그만으로 DB가 OPEN이고 리스너가 서비스를 등록했다고 판단하지 않음
dbshut가 끝나기 전에 OS가 내려가면 다음 기동 때 인스턴스 복구가 필요할 수 있으므로, 서버 종료 전에는 DB 정지를 먼저 확인함