Опишем процесс создания и настройки unit`а и вспомогательных скриптов системы инициализации systemd (которая поставляется в дистрибутивах Oracle Linux 7-8 и схожих с ним CentOS и RHEL) для автозапуска служб Oracle Database 12 при старте системы.
Сразу напомню, что процесс настройки для Oracle Linux 6 (с init.d) описан в другой статье [ тут ]. Вообще для меня это загадка, почему Oracle, с их то бюджетами, не могут сделать чтобы все нормально работало из коробки с ИХ софтом в ИХ операционной системе… приходится изгаляться вот так вот вручную.
Ладно поехали, хрен с ними. Все команды выполняем под пользователем oracle.
- Создание глобального скрипта с описанием всех необходимых для Oracle переменных окружения
- Связываем setEnv.sh с профилем пользователя oracle
- Создаем технологические скрипты для systemd unit
- Создание и настройки systemd unit для Oracle Database
- Проверка
1) Создание глобального скрипта с описанием всех необходимых для Oracle переменных окружения
Но сначала создадим директорию для всех скриптов — scripts в home пользователя oracle:
mkdir /home/oracle/scripts
Далее создадим сам глобальный файл (скрипт) с переменными окружения setEnv.sh:
cat > /home/oracle/scripts/setEnv.sh <<EOF # Oracle Settings export TMP=/tmp export TMPDIR=\$TMP export ORACLE_HOSTNAME=dboracle export ORACLE_UNQNAME=DW export ORACLE_BASE=/home/oracle/app/oracle export ORACLE_HOME=\$ORACLE_BASE/product/12.2.0/dbhome_1 export ORACLE_SID=DW export PATH=/usr/sbin:/usr/local/bin:\$PATH export PATH=\$ORACLE_HOME/bin:\$PATH export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/lib export CLASSPATH=\$ORACLE_HOME/jlib:\$ORACLE_HOME/rdbms/jlib export NLS_LANG=AMERICAN_RUSSIA.AL32UTF8 EOF
txt: setEnv
Внимание! После создания скрипта, внесите в него свои переменные (ORACLE_UNQNAME, ORACLE_SID, ORACLE_HOSTNAME). В дальнейшем, просто редактируете этот файл, и переменные окружения с него будут подгружены как в профиль пользователя, так и в настройки systemd unit.
2) Связываем setEnv.sh с профилем пользователя oracle
echo ". /home/oracle/scripts/setEnv.sh" >> /home/oracle/.bash_profile
3) Создаем технологические скрипты для systemd unit
Скрипт на запуск:
cat > /home/oracle/scripts/start_all.sh <<EOF #!/bin/bash . /home/oracle/scripts/setEnv.sh export ORAENV_ASK=NO . oraenv export ORAENV_ASK=YES dbstart \$ORACLE_HOME EOF
txt: start_all
Скрипт на остановку:
cat > /home/oracle/scripts/stop_all.sh <<EOF #!/bin/bash . /home/oracle/scripts/setEnv.sh export ORAENV_ASK=NO . oraenv export ORAENV_ASK=YES dbshut \$ORACLE_HOME EOF
txt: stop_all
Ну и выравниваем права на директорию, делаем скрипты исполняемыми:
chown -R oracle:oracle /home/oracle/scripts chmod u+x /home/oracle/scripts/*.sh
4) Создание и настройки systemd unit для Oracle Database
Создаем файл и открываем его в текстовом редакторе:
sudo nano /etc/systemd/system/[email protected]
[Unit] Description=The Oracle Database Service After=syslog.target network.target [Service] # systemd ignores PAM limits, so set any necessary limits in the service. # Not really a bug, but a feature. # https://bugzilla.redhat.com/show_bug.cgi?id=754285 LimitMEMLOCK=infinity LimitNOFILE=65535 #Type=simple # idle: similar to simple, the actual execution of the service binary is delayed # until all jobs are finished, which avoids mixing the status output with shell output of services. RemainAfterExit=yes User=oracle Group=oracle Restart=no ExecStart=/bin/bash -c '/home/oracle/scripts/start_all.sh' ExecStop=/bin/bash -c '/home/oracle/scripts/stop_all.sh' [Install] WantedBy=multi-user.target
txt: unit
Далее, активируем unit через systemd:
sudo systemctl enable [email protected]
Теперь рекомендуется сделать полный reboot (так будет проще, чем останавливать уже запущенный Oracle вручную и делать systemd daemon-reload):
sudo reboot
5) Проверка
Проверяем отработал ли автозапуск, смотрим unit подробный статус (количество процессов, аптайм, объем потребленной оперативной памяти и т.д.):
sudo systemctl -l status [email protected]
Если все ОК, используем следующие команды в дальнейшем для запуска/остановки на работающей системе:
sudo systemctl start [email protected] sudo systemctl stop [email protected]
Итого: все настройки универсальны, но на каждом новом сервере, нужно лишь вносить изменения в файл переменными окружения setEnv.sh меняя там параметры на новые (см. п.1). Остальные конфиги и скрипты оставляем без изменений.