GUI 없는 서버에 Oracle Database 19c 를 응답 파일 방식으로 올린다. 소프트웨어 설치 · 리스너 생성 · 데이터베이스 생성을 모두 무인으로 진행한다. 순서대로 따라 하면 접속 가능한 상태까지 간다.
| 항목 | 기준 |
|---|---|
| OS | RHEL 8 (Rocky · Oracle Linux 8 동일) |
| 메모리 | 최소 2GB, 실사용 8GB 이상 |
| 스왑 | RAM 16GB 이하면 RAM 과 같거나 1.5배 |
| 디스크 | /u01 에 소프트웨어 약 10GB, 데이터 별도 |
| 시간 동기화 | chronyd 활성화 |
RHEL 8 에서 19c 를 쓰려면 릴리스 업데이트 수준이 중요하다. 기반 배포본(19.3) 은 RHEL 8 사전 점검을 통과하지 못해 -ignorePrereq 로 넘기고 설치 후 RU 를 적용하는 절차가 필요하다. (확인 필요 — 쓰는 버전이 RHEL 8 에 인증됐는지 Oracle 지원 문서에서 확인한다.)
hostnamectl
cat /etc/redhat-release
free -h
df -h /u01
systemctl enable --now chronyd
Oracle 이 제공하는 preinstall 패키지를 쓰면 패키지 · 커널 파라미터 · 리미트 · 계정 생성을 한 번에 처리한다. Oracle Linux 8 이면 기본 저장소에 있고, RHEL 이나 Rocky 라면 Oracle 공개 저장소를 등록해 받을 수 있다.
dnf -y install oracle-database-preinstall-19c
쓸 수 없는 환경이면 직접 설치한다.
dnf -y install bc binutils compat-openssl10 gcc gcc-c++ glibc glibc-devel \
ksh libaio libaio-devel libX11 libXau libXi libXtst libXrender libXrender-devel \
libXext make sysstat smartmontools net-tools unzip xz libnsl libnsl2 \
elfutils-libelf elfutils-libelf-devel unixODBC unixODBC-devel
compat-openssl10 과 libnsl2 는 RHEL 8 에서 19c 가 요구하는 항목이고, 저장소에 따라 이름이나 제공 여부가 다르다.
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 1073741824
kernel.shmmax = 4398046511104
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
/etc/sysctl.d/99-oracle.conf 에 두고 적용한다. shmall 과 shmmax 는 실제 메모리에 맞춰 조정한다.
sysctl --system
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft stack 10240
oracle hard stack 32768
oracle soft memlock 134217728
oracle hard memlock 134217728
/etc/security/limits.d/oracle.conf 에 둔다.
groupadd -g 54321 oinstall
groupadd -g 54322 dba
groupadd -g 54323 oper
useradd -u 54321 -g oinstall -G dba,oper oracle
mkdir -p /u01/app/oracle/product/19c/dbhome_1
mkdir -p /u01/app/oraInventory
mkdir -p /u01/software
chown -R oracle:oinstall /u01/app /u01/software
chmod -R 775 /u01/app
grubby --update-kernel ALL --args="transparent_hugepage=never"
reboot
cat /sys/kernel/mm/transparent_hugepage/enabled
설치 중에는 SELinux 를 permissive 로 두고 끝난 뒤 정책을 보강해 enforcing 으로 되돌리는 방식이 무난하다.
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
firewall-cmd --permanent --add-port=1521/tcp
firewall-cmd --permanent --add-port=5500/tcp
firewall-cmd --reload
1521 은 리스너, 5500 은 EM Express 다. 외부에서 EM 을 쓰지 않으면 5500 은 열지 않는다.
19c 부터 배포 zip 을 ORACLE_HOME 에 풀고 그 안의 runInstaller 를 실행한다. 예전처럼 별도 설치 디렉터리에서 돌리지 않는다.
su - oracle
unzip -q /u01/software/LINUX.X64_193000_db_home.zip -d /u01/app/oracle/product/19c/dbhome_1
환경변수를 설정한다.
cat >> ~/.bash_profile <<'PROFILE'
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1
export ORACLE_SID=ORCL
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
umask 022
PROFILE
source ~/.bash_profile
응답 파일을 만든다.
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v19.0.0
oracle.install.option=INSTALL_DB_SWONLY
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/u01/app/oraInventory
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1
oracle.install.db.InstallEdition=EE
oracle.install.db.OSDBA_GROUP=dba
oracle.install.db.OSOPER_GROUP=oper
oracle.install.db.OSBACKUPDBA_GROUP=dba
oracle.install.db.OSDGDBA_GROUP=dba
oracle.install.db.OSKMDBA_GROUP=dba
oracle.install.db.OSRACDBA_GROUP=dba
DECLINE_SECURITY_UPDATES=true
설치를 실행한다.
$ORACLE_HOME/runInstaller -silent -responseFile /u01/software/db_install.rsp -ignorePrereq
끝나면 root 로 두 스크립트를 실행하라는 안내가 나온다.
/u01/app/oraInventory/orainstRoot.sh
/u01/app/oracle/product/19c/dbhome_1/root.sh
netca -silent -responseFile $ORACLE_HOME/assistants/netca/netca.rsp
lsnrctl status
비밀번호는 명령줄에 직접 적지 말고 변수로 넘긴다. 명령줄에 적으면 셸 히스토리와 프로세스 목록에 남는다.
read -s -p "SYS password: " SYSPW; echo
read -s -p "SYSTEM password: " SYSTEMPW; echo
read -s -p "PDB admin password: " PDBPW; echo
dbca -silent -createDatabase \
-templateName General_Purpose.dbc \
-gdbName ORCL -sid ORCL \
-createAsContainerDatabase true \
-numberOfPDBs 1 -pdbName PDB1 \
-sysPassword "${SYSPW}" \
-systemPassword "${SYSTEMPW}" \
-pdbAdminPassword "${PDBPW}" \
-datafileDestination /u01/app/oracle/oradata \
-storageType FS \
-characterSet AL32UTF8 \
-nationalCharacterSet AL16UTF16 \
-totalMemory 4096 \
-databaseType MULTIPURPOSE \
-emConfiguration NONE
문자셋은 나중에 바꾸기 어렵다. 한글을 다룬다면 AL32UTF8 로 시작한다.
기본 설치는 부팅 시 자동 기동되지 않는다. /etc/oratab 의 마지막 항목을 Y 로 바꾸고 systemd 유닛을 만든다.
sed -i 's/^ORCL:\(.*\):N$/ORCL:\1:Y/' /etc/oratab
[Unit]
Description=Oracle Database
After=network.target
[Service]
Type=forking
User=oracle
Group=oinstall
Environment=ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1
ExecStart=/u01/app/oracle/product/19c/dbhome_1/bin/dbstart /u01/app/oracle/product/19c/dbhome_1
ExecStop=/u01/app/oracle/product/19c/dbhome_1/bin/dbshut /u01/app/oracle/product/19c/dbhome_1
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now oracle-db
sqlplus / as sysdba <<'SQL'
set pages 100 lines 200
select instance_name, status, database_status from v$instance;
show pdbs
select name, open_mode from v$pdbs;
SQL
lsnrctl status
sqlplus system@//localhost:1521/PDB1
PDB 는 기본적으로 마운트 상태로 남는다. 재기동 후에도 열려 있게 하려면 저장한다.
ALTER PLUGGABLE DATABASE PDB1 OPEN;
ALTER PLUGGABLE DATABASE PDB1 SAVE STATE;
-ignorePrereq 로 넘긴 항목은 나중에 문제로 돌아온다. 무엇을 건너뛰었는지 설치 로그에서 확인하고 필요한 것은 채운다.