Рассмотрим весьма распространенную и на первый взгляд парадоксальную ситуацию, с которой сталкиваются системные администраторы при администрировании связки 1С:Предприятие + PostgreSQL на операционной системе Windows. После внезапного отключения электроэнергии сервер перезагружается, но СУБД PostgreSQL отказывается запускаться привычным образом. При попытке вручную запустить службу в консоли services.msc операционная система мгновенно или с небольшой задержкой выдает стандартное, но малоинформативное сообщение: "Служба была запущена и сразу остановлена".
Однако самое удивительное происходит позже: несмотря на то, что в оснастке Windows служба PostgreSQL по-прежнему имеет статус "Остановлена", пользователи успешно заходят в 1С, проводят документы и база данных полноценно функционирует. Давайте подробно разберем этот феномен, выясним физические причины происходящего, проанализируем логи СУБД и определим, как правильно действовать в таких ситуациях.
Для того чтобы понять природу этого явления, проанализируем взаимодействие диспетчера служб Windows (Service Control Manager, SCM) и процесса СУБД postgres.exe. Когда операционная система пытается запустить службу PostgreSQL, происходит следующее:
SERVICE_RUNNING.postgres.exe (а точнее, его фоновый дочерний процесс startup) не завершается. Он продолжает работать в фоновом режиме, используя ресурсы процессора и диска.Чтобы операционная система не "теряла" службу во время длительного старта СУБД, мы можем принудительно увеличить время ожидания запуска служб в реестре Windows. Разберем, как это сделать по шагам:
regedit.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control.ServicesPipeTimeout. Если такого параметра нет, создайте его (тип DWORD (32-bit)).900000.При изучении технологического журнала PostgreSQL или системного журнала событий Windows администраторы часто замечают бесконечно повторяющиеся записи следующего вида:
LOG: autovacuum: found orphan temp table "pg_temp_21"."tt5" in database "rzp2"
Давайте проанализируем, почему возникают эти записи и связаны ли они напрямую с аварийным отключением. Платформа 1С:Предприятие при построении сложных запросов (особенно при формировании отчетов, расчете себестоимости или проведении партионного учета) активно задействует механизм временных таблиц. В СУБД PostgreSQL эти таблицы создаются в специальных изолированных схемах, имена которых начинаются с префикса pg_temp_, а сами таблицы получают технические имена вида tt1, tt2, tt5 и так далее.
При нормальном завершении работы сеанса 1С или завершении транзакции эти временные таблицы автоматически уничтожаются СУБД. Но в момент аварийного отключения питания сессии пользователей оборвались некорректно. Временные таблицы физически остались на диске, превратившись в так называемые "сиротские" таблицы (orphan temp tables).
При последующем запуске PostgreSQL фоновый процесс автоочистки autovacuum сканирует системные каталоги, обнаруживает эти устаревшие временные схемы, понимает, что породившие их сессии давно мертвы, и пытается их вычистить. Появление этих сообщений в логах — абсолютно нормальный процесс самоочистки СУБД, свидетельствующий о том, что PostgreSQL успешно справляется с последствиями аварии. Если таких записей слишком много и они забивают лог-файлы, их можно удалить принудительно, выполнив под учетной записью суперпользователя СУБД команду:
DROP SCHEMA pg_temp_21 CASCADE;
Важное предупреждение: выполнять ручное удаление временных схем можно строго в монопольном режиме, когда к базе данных 1С не подключен ни один пользователь, иначе вы рискуете удалить временные таблицы активных транзакций работающих пользователей, что приведет к аварийному завершению их работы.
Ни в коем случае не стоит пытаться наугад переустанавливать СУБД или применять агрессивные утилиты восстановления без предварительного анализа логов. Давайте разберем, где именно искать информацию о состоянии PostgreSQL.
В зависимости от версии PostgreSQL и сборки (например, от Postgres Pro или стандартной), файлы логов по умолчанию располагаются в подкаталоге базы данных. Перейдите в каталог установки вашей СУБД, найдите папку с данными (обычно это папка data) и обратите внимание на следующие каталоги:
pg_log внутри каталога data.log.Откройте последний по дате текстовый файл лога. При восстановлении после сбоя вы должны увидеть примерно следующую картину:
2018-12-10 11:30:02 MSK ВАЖНО: система баз данных запускается
2018-12-10 11:31:06 MSK СООБЩЕНИЕ: система БД была остановлена нештатно; производится автоматическое восстановление
2018-12-10 11:31:06 MSK СООБЩЕНИЕ: запись REDO начинается со смещения C1/3C3B7548
2018-12-10 11:31:06 MSK СООБЩЕНИЕ: запись нулевой длины по смещению C1/3C3C69E0
2018-12-10 11:31:06 MSK СООБЩЕНИЕ: записи REDO обработаны до смещения C1/3C3C69B0
2018-12-10 11:31:06 MSK СООБЩЕНИЕ: последняя завершённая транзакция была выполнена в 2018-12-10 11:27:51
2018-12-10 11:31:06 MSK СООБЩЕНИЕ: система БД готова принимать подключения
Если в логах вы видите непрерывный процесс обработки записей REDO — не мешайте СУБД работать. Наберитесь терпения и подождите завершения процесса восстановления. Любое принудительное завершение процесса postgres.exe в этот момент может безвозвратно разрушить структуру таблиц.
Иногда в процессе аварийного отключения повреждается сам журнал транзакций (WAL), и PostgreSQL физически не может выполнить автоматическое восстановление, циклически падая с критической ошибкой. В интернете часто встречается радикальный совет: воспользоваться системной утилитой pg_resetxlog (в новых версиях СУБД она называется pg_resetwal).
Давайте детально разберем, что делает эта утилита и почему ее использование для баз данных 1С крайне нежелательно. Утилита pg_resetwal принудительно очищает журналы предзаписи и перезаписывает управляющий файл pg_control, фактически очищая всю историю транзакций, которая не успела записаться на жесткий диск. СУБД после этого успешно запустится, однако цена такого запуска огромна:
Если вам все же пришлось прибегнуть к использованию утилиты pg_resetwal из-за отсутствия актуальной резервной копии, обязательно выполните следующие шаги по реанимации информационной базы 1С:
.dt..dt туда. Этот шаг крайне важен, так как он позволяет физически пересоздать структуру таблиц на уровне СУБД и избавиться от возможных скрытых дефектов дисковой разметки таблиц, которые не смогло выявить тестирование конфигуратора.Для того чтобы навсегда обезопасить себя от подобных аварийных ситуаций, необходимо внедрить несколько обязательных стандартов администрирования серверного оборудования:
postgresql.conf параметр fsync установлен в значение on. Некоторые администраторы отключают его ради кратковременного прироста производительности 1С, однако отключение fsync гарантирует превращение базы данных в невосстановимый набор файлов при первом же жестком перезапуске сервера.
net stop postgresql-x64-14
(заменив имя службы на актуальное для вашей версии СУБД) и только после этого отправляла сервер в режим завершения работы.