Сбой восстановления резервной копии из-за ошибки многопользовательского режима

У меня есть скрипт для автоматического восстановления базы данных из резервной копии. Мой сценарий сначала останавливает все экземпляры сервера приложений, останавливает все базы данных, а затем восстанавливает их из резервной копии. Ниже приведен псевдокод:

foreach appserver:
    asbman -name (appserver) -stop

foreach database:
    dbman -name (database) -stop

proutil database.db -C enablelargefiles
echo y | prorest database.db backup.bak -verbose

Как только мой скрипт достигает команды prorest, он выводит следующую ошибку:

** The database D:\Directory\Wrk\db\database is in use in multi-user mode. (276)

После ожидания ~60 секунд команда prorest снова выполняется, как и ожидалось, и база данных восстанавливается правильно. Я предполагаю, что есть процессы, связанные с базой данных, которые все еще работают после остановки базы данных. Я хотел бы найти решение этой проблемы без использования таких методов, как повторная попытка сна, чтобы определить, когда базу данных можно восстановить. Есть ли решение этой проблемы или есть более эффективные методы восстановления базы данных таким образом?


person Preston Martin    schedule 06.02.2017    source источник
comment
Вы вообще делаете паузу после остановки серверов приложений и базы данных? Они не отключаются мгновенно. Возможно, вам придется использовать метод повторной попытки сна.   -  person TheDrooper    schedule 06.02.2017
comment
@TheDrooper В настоящее время я не останавливаюсь после остановки серверов приложений / баз данных. Вы знаете, почему они не отключаются мгновенно? Или хотя бы почему dbman выводит, что он остановился?   -  person Preston Martin    schedule 06.02.2017
comment
Команды *man просто ставят в очередь запрос на выполнение действия и сообщают, что сервер администратора получил запрос. Я знаю, что вы говорите, что не хотите, но вам нужно добавить цикл и проверку состояния, чтобы убедиться, что все в порядке.   -  person Tom Bascom    schedule 06.02.2017
comment
Спасибо, Том. Да, я быстро понимаю, что мне придется добавить цикл состояния по времени, чтобы проверить, правильно ли закрыта база данных.   -  person Preston Martin    schedule 06.02.2017


Ответы (1)


Есть некоторые тайм-ауты, которые могут вступить в игру:

Когда запускается безусловное пакетное отключение (PROSHUT -by), происходит следующая последовательность событий:

Если остались запущенные процессы после:

  • 30 секунд - разбудить клиентов, ожидающих блокировки.
  • 60 секунд - разбудить клиентов, ожидающих блокировки.
  • 90 секунд — разбудить клиентов, ожидающих ввода с экрана.
  • 5 минут — повторная отправка сигнала отключения оставшимся клиентам.
  • 10 минут — отправить оставшимся клиентам сигнал завершения (SIGTERM).

Дополнительная информация здесь: http://knowledgebase.progress.com/articles/Article/P3222

Вы можете просмотреть файл database.lg и найти сообщения о том, что база данных закрыта:

[2017/02/06@20:20:56.353+0100] P-14292      T-13420 I SHUT    5: (542)   Server shutdown started by Jens on CON:.
[2017/02/06@20:20:56.499+0100] P-10276      T-11404 I BROKER  0: (15193) The normal shutdown of the database will continue for 10 Min 0 Sec if required.
[2017/02/06@20:20:56.499+0100] P-10276      T-11404 I BROKER  0: (2248)  Begin normal shutdown
[2017/02/06@20:20:57.499+0100] P-10276      T-11404 I BROKER  0: (2263)  Resending shutdown request to 0 user(s).
[2017/02/06@20:21:01.692+0100] P-10276      T-11404 I BROKER  0: (15109) At Database close the number of live transactions is 0.
[2017/02/06@20:21:01.692+0100] P-10276      T-11404 I BROKER  0: (15743) Before Image Log Completion at Block 1 Offset 5300.
[2017/02/06@20:21:01.693+0100] P-10276      T-11404 I BROKER  0: (453)   Logout by Jens on CON:.
[2017/02/06@20:21:01.694+0100] P-10276      T-11404 I BROKER   : (16869) Removed shared memory with segment_id: 50528256
[2017/02/06@20:21:01.694+0100] P-10276      T-11404 I BROKER   : (334)   Multi-user session end.
[2017/02/06@20:21:02.356+0100] P-14292      T-13420 I SHUT    5: (453)   Logout by Jens on CON:.

Сообщение (334) в основном сообщает вам, что база данных закрыта.

Другим вариантом может быть проверка файла блокировки базы данных (database.lk). Это только там, если база данных работает:

...
2017-02-06  20:21         2 228 224 mySportsDb.b1
2017-02-06  20:21         1 703 936 mySportsDb.d1
2017-02-06  20:21            32 768 mySportsDb.db
2017-02-06  20:21            89 643 mySportsDb.lg
2017-02-06  18:00               920 mySportsDb.lic
2017-02-06  20:26               265 mySportsDb.lk
...

Есть также несколько сценариев, которые вы можете запустить для проверки состояния базы данных. Подробнее здесь:

http://knowledgebase.progress.com/articles/Article/P136887

person Jensd    schedule 06.02.2017
comment
Спасибо @Jensd! Знаете ли вы, есть ли период ожидания для закрытия базы данных и как долго он длится? Например, если мой единственный вариант — отследить файл журнала или повторить поиск файла блокировки в режиме ожидания, какова должна быть максимальная продолжительность отслеживания/поиска? - person Preston Martin; 06.02.2017
comment
@PrestonM Присутствуют некоторые тайм-ауты по умолчанию. Я добавил ссылку на те, что в ответе. Если вы просто выбрасываете эти базы данных, возможно, вы можете просто принудительно завершить работу (proshut -F или proshut -byF), но это уничтожит их... - person Jensd; 06.02.2017
comment
это отличное предложение. Это тестовые серверы, так что на самом деле я буду выбрасывать эти базы данных. - person Preston Martin; 06.02.2017