Что произойдет если пользователь будет «убит»?
При подключении пользователя к OpenEdge базе данных в многопользовательском режиме, в таблицу контроля пользователей в разделяемой памяти добавляется соответствующая запись. Эта таблица контролируется процессом watchdog с целью обнаружения пользователей, у которых отсутствуют связанные с ними процессы в системе. Если процесс watchdog не запущен, то эту работу выполняет сервер базы данных.
Если будет обнаружено, что у пользователя из таблицы контроля пользователей нет активного процесса, то он будет отключен от базы данных и в журнал базы будет записано сообщение 2527: Disconnecting dead user . (2527)
Если работа пользовательского процесса будет завершена некорректно, удерживая какой-нибудь латч или блокировку в разделяемой памяти, то в журнал базы данных будет записано одно из следующих сообщений: User died holding shared memory locks. (2522) User died with buffers locked. (2523)
Если при этом разделяемая память или буферный латч останутся в противоречивом состоянии, то сервер выполнит аварийный останов базы данных, чтобы гарантировать её целостность. В лог базы данных запишется сообщение 2249, после чего начнется отключение всех пользователей, а затем и завершение работы самого сервера: Begin ABNORMAL shutdown code n (2249).
Номер кода в этом сообщении предназначен для будущего использования и в настоящее время не имеет никакого значения.
Подобный аварийный останов не говорит о том, что база данных повреждена, наоборот, он предотвращает возможные искажения данных в базе. После перезапуска базы данных отработает механизм Crash Recovery, после чего базу можно продолжать использовать в нормальном режиме.
Пока выполняется аварийное завершение, а пользователи выходят из системы, в лог базы данных в дополнение к вышеупомянутым сообщениям может быть записано следующее сообщение: System Error: redundant lwake user <n> latch <x>
Эта ошибка также не указывает на повреждения в базе данных.
События, которые могут привести к неправильному завершению работы процесса:
1. Процесс получил kill-сигнал, отличный от SIGHUP.
2. Был отключен терминал в то время, когда была активна OpenEdge-сессия.
3. Работа процесса была завершена из-за системной ошибки.
Если подобные ошибки происходят неоднократно, то важно определить, что заставляет пользовательский процесс «умирать». Если понять этого не получается, то для предотвращения аварийного останова базы данных необходимо сделать так, чтобы пользователи подключались как дистанционные клиенты. Дистанционный пользователь не обращается к разделяемой памяти напрямую, вместо этого он подключается к процессу сервера, который уже подключен к разделяемой памяти, и который будет выполнять все необходимые блокировки в памяти от его имени. Поэтому если пользовательский процесс завершит свою работу неправильно, то процесс сервера самостоятельно очистит любые латчи, оставшиеся после «мертвого» процесса. Тем самым будет предотвращен возможный аварийный останов базы данных.
Примеры.
Старт сервера базы данных с сетевыми параметрами: proserve db-name -S <port number> -H localhost
Старт пользовательской сессии в качестве локального «дистанционного» клиента на той же машине: mpro db-name -S <port number> -H localhost
Примечание: могут возникнуть различия в производительности между прямым подключением к разделяемой памяти и подключением по TCP. Прямое использование разделяемой памяти быстрее, т.к. потоки данных не идут через протокол TCP.
|