IBM Db2: Как автоматически активировать базы данных после (пере) загрузки? - PullRequest
0 голосов
/ 05 июля 2019

У меня есть несколько баз данных Db2, которые я хочу автоматически активировать после перезагрузки системы.Перезапуск службы Db2 после перезагрузки не является проблемой, но для активации баз данных требуется доступ к профилю экземпляра.

Запуск / остановка службы контролируется system / systemctl.Включение в эти сценарии некоторых пользовательских сценариев установки не очень хорошая идея.Я кратко изучил enable-linger для пользователя экземпляра Db2 или для использования EnvironmentFile для настройки профиля экземпляра.

Как активировать все или наборбазы данных после перезагрузки?Используете ли вы user / group / EnvironmentFile с systemd?Вы включаете задержку или у вас есть другой метод?

1 Ответ

1 голос
/ 05 июля 2019

Вот простой скрипт, который должен запускаться от владельца экземпляра Db2.
Предполагается, что экземпляр Db2 запускается автоматически.Если это не так, просто закомментируйте db2gcf -s и раскомментируйте db2gcf -u.
Сценарий ожидает запуска экземпляра заданное количество секунд и активирует все локальные базы данных, найденные в системном каталоге экземпляра Db2.
Запуск сценария может быть запланирован при запуске ОС через запись crontab владельца экземпляра Db2, как показано.
В домашнем каталоге владельца экземпляра Db2 создается файл журнала (см. Переменную $ {LOG}) с историей команд.

#!/bin/sh
#
# Function: Activates all local DB2 databases
# Crontab entry:
# @reboot /home/scripts/db2activate.sh >/dev/null 2>&1
#

TIMEOUT=300
VERBOSE=${1:-"noverbose"}
export LC_ALL=C
if [ ! -x ~/sqllib/db2profile ]; then
  echo "Must be run by a DB2 instance onwer" >&2
  exit 1
fi
[ -z ${DB2INSTANCE} ] && . ~/sqllib/db2profile
if [ "${VERBOSE}" != "verbose" ]; then
  LOG=~/.$(basename $0).log
  exec 1>>${LOG}
  exec 2>>${LOG}
fi
set -x

printf "\n*** %s ***\n" $(date +"%F-%H.%M.%S")
# Wait for the instance startup 
# (or even start it with 'db2gcf -u' instead of checking status: 'db2gcf -s')
TIME1=${SECONDS}
while [ $((SECONDS-TIME1)) -le ${TIMEOUT} ]; do
  db2gcf -s
  # db2gcf -u
  rc=$?
  [ ${rc} -eq 0 ] && break
  sleep 5
done

if [ ${rc} -ne 0 ]; then
  echo "Instance startup timeout of ${TIMEOUT} sec reached" >&2
  exit 2
fi

for dbname in $(db2 list db directory | awk -v RS='' '/= Indirect/' | grep '^ Database alias' | sort -u | cut -d'=' -f2); do
  db2 activate db ${dbname}
done
...