При аварийном завершении работы сервера или некорректной перезагрузке операционной системы Windows системные администраторы часто сталкиваются с ситуацией, когда служба СУБД PostgreSQL отказывается запускаться. В системном журнале Windows фиксируется сообщение Timed out waiting for server startup, а в журнале самой СУБД появляется запись FATAL: the database system is starting up. Если службу все же удается поднять, пользователи платформы 1С:Предприятие могут получать критические ошибки вида XX000: ERROR: tuple concurrently updated при попытке войти в информационные базы.
Разберем детально физику возникновения этих сбоев, пошаговые методы безопасного восстановления работы кластера баз данных и способы предотвращения подобных аварий в будущем.
Проанализируем, что происходит с базой данных в момент внезапной перезагрузки:
the database system is starting up. Диспетчер служб Windows (Service Control Manager) по умолчанию ожидает ответ от службы всего 30 секунд. Если объем журналов велик или дисковая подсистема перегружена, Windows принудительно прерывает процесс СУБД по таймауту, не давая ему завершить восстановление.VASSN, функций преобразования типов и сортировки). Если служба сервера 1С стартует одновременно с PostgreSQL или пытается выполнить эти действия в несколько рабочих потоков (rphost), параллельные команды CREATE OR REPLACE FUNCTION обращаются к одной строке в системном каталоге pg_proc. Это приводит к блокировке и ошибке параллельного обновления кортежа.Чтобы операционная система не убивала процесс СУБД раньше времени, выполним процедуру наката журналов вручную через утилиту управления pg_ctl под системным пользователем postgres.
Откроем командную строку от имени администратора и перейдем к каталогу утилит PostgreSQL:
cd "C:\Program Files\PostgreSQL\9.4.2-1.1C\bin"
pg_ctl.exe -D "C:\PostgreSQL\data" start
После запуска необходимо непрерывно отслеживать текстовые логи в каталоге data\pg_log. Мы должны дождаться строки:
LOG: database system was not properly shut down; automatic recovery in progress
LOG: redo starts at ...
LOG: redo done at ...
LOG: database system is ready to accept connections
Как только сервер перейдет в рабочий режим, корректно остановим его командой:
pg_ctl.exe -D "C:\PostgreSQL\data" stop
Теперь процедура REDO завершена, и штатная служба Windows сможет стартовать без превышения стандартного времени ожидания.
Чтобы в дальнейшем при непредвиденных сбоях служба не падала по таймауту, увеличим допустимое время отклика для диспетчера служб Windows через системный реестр:
regedit).HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control.ServicesPipeTimeout.120000 (что соответствует 120 секундам / 2 минутам) или 180000 (3 минуты).Если после старта СУБД в базах 1С возникает ошибка XX000: ERROR: tuple concurrently updated на функциях вроде public.VASSN, выполним следующие действия:
1C:Enterprise 8.3 Server Agent), чтобы исключить множественные одновременные попытки инициализации служебных структур.psql монопольно.
-- Перестроение системных индексов базы
REINDEX SYSTEM имя_базы_данных;
-- Очистка и дефрагментация системного каталога процедур и функций
VACUUM FULL pg_catalog.pg_proc;
-- Полное регламентное обслуживание базы данных
VACUUM FULL ANALYZE;
После завершения обслуживания системных каталогов запустим службу сервера 1С:Предприятия. Первый вход в каждую информационную базу желательно выполнить через конфигуратор или в режиме «1С:Предприятие» в один пользовательский сеанс, чтобы служебные функции успешно обновились без конкуренции потоков.
Если файлы WAL-журналов были физически повреждены при сбое и сервер категорически отказывается подниматься даже вручную, выдавая ошибки контрольных сумм в логах, применяется утилита сброса транзакционного лога. Внимание: перед этой операцией обязательно создадим полную копию каталога data.
В зависимости от версии PostgreSQL выполним команду в консоли:
-- Для версий PostgreSQL 9.6 и старее:
pg_resetxlog.exe -f "C:\PostgreSQL\data"
-- Для версий PostgreSQL 10 и новее:
pg_resetwal.exe -f "C:\PostgreSQL\data"
После принудительного сброса логов сервер запустится, однако возможны логические нарушения ссылочной целостности. Поэтому сразу после старта необходимо выгрузить информационную базу в файл выгрузки (.dt) средствами конфигуратора 1С и загрузить ее в заново созданную чистую базу данных.
Чтобы минимизировать время восстановления после сбоев питания и исключить повреждение структуры страниц данных, проверим файл конфигурации postgresql.conf:
fsync = on и full_page_writes = on должны быть обязательно включены. Отключение full_page_writes ради мнимого прироста скорости приводит к фатальному повреждению страниц данных при внезапной перезагрузке.
checkpoint_timeout = 15min
checkpoint_completion_target = 0.9
max_wal_size = 4GB
min_wal_size = 1GB
rphost к непрогретой СУБД.