Аварийное отключение электроэнергии — один из самых опасных сценариев для серверов баз данных. В такой ситуации файловая система может не успеть зафиксировать изменения, что приводит к повреждению журналов транзакций и системных файлов PostgreSQL. В результате при попытке запуска службы администратор видит бесконечный статус "the database system is starting up", а в логах красуется фатальная ошибка доступа к транзакциям.
В этой статье мы подробно проанализируем ситуацию, когда СУБД PostgreSQL (версии 9.4–10) отказывается стартовать, разберем типичные ошибки «спасения» данных и определим правильный алгоритм действий для восстановления работоспособности баз 1С:Предприятие.
Рассмотрим типичную картину лог-файла в такой ситуации. Если база не поднимается, первым делом заглянем в папку pg_log. Мы можем увидеть следующие записи:
FATAL: could not access status of transaction 3
DETAIL: Could not open file "pg_xact/0000": No such file or directory.
Проанализируем это сообщение. Ошибка означает, что СУБД при старте пытается провести процедуру crash recovery (восстановление после сбоя), но не находит критически важного файла, в котором хранится информация о статусах завершенности транзакций. В версиях PostgreSQL до 10.0 эта директория называлась pg_clog, в более новых — pg_xact. Отсутствие файла 0000 блокирует запуск всей системы.
Прежде чем перейти к правильным решениям, разберем действия, которые категорически нельзя совершать (на основе реального опыта коллег):
/base содержит только «сырые» данные таблиц. Вся информация о том, какая папка к какой базе относится, список пользователей, прав и связей хранится в папке /global. Без нее папка /base — это просто набор бесполезных файлов.initdb в ту же директорию, где лежат поврежденные базы, может окончательно перезаписать системные каталоги, сделав восстановление невозможным.Если PostgreSQL жалуется на отсутствие файла в pg_xact (или pg_clog), мы можем попробовать обмануть систему, чтобы она смогла запуститься хотя бы в режиме «только для чтения» для выгрузки дампов.
Выполним следующие шаги:
pg_xact (или pg_clog для старых версий).0000).fsutil в командной строке:
fsutil file createnew C:\PostgreSQL\data\pg_xact\0000 262144
После этого попробуем запустить службу. Если база стартует, немедленно сделаем pg_dump всех критически важных баз 1С. Помните: целостность данных после такого метода не гарантирована, поэтому переиндексация и проверка средствами 1С обязательны!
Если создание пустых файлов не помогло, проанализируем состояние журналов предзаписи (WAL). Для этого существуют специальные утилиты, входящие в состав PostgreSQL.
Внимание: Использование этих команд — это крайняя мера, которая удаляет все незавершенные транзакции и может привести к логическим ошибкам в учете 1С.
Рассмотрим порядок действий для PostgreSQL 10 и выше:
bin установленной СУБД.postgres):
pg_resetwal.exe -f "C:\Path\To\Your\Data\Folder"
Для версии 9.4 команда будет называться иначе:
pg_resetxlog.exe -f "C:\Path\To\Your\Data\Folder"
После успешного выполнения утилита сбросит контрольный файл и очистит логи транзакций. База должна запуститься, но после этого крайне важно выполнить консолидацию данных в 1С (Тестирование и исправление).
Иногда причина того, что «служба не встает», банальна — при сбое или переустановке системы «слетели» права доступа на папку с данными, особенно если она вынесена на отдельный диск.
Проанализируем права доступа:
postgres (обычно это локальный пользователь postgres), имеет права «Полный контроль» на эту папку, все подпапки и файлы.postmaster.pid в корне папки данных. Если служба НЕ запущена, а файл существует — удалим его. Он блокирует запуск, сообщая системе, что экземпляр СУБД якобы уже работает.Нужно учитывать, что сборки PostgreSQL, предлагаемые компанией 1С, содержат специфические патчи для работы с блокировками и кодировками. Если вы решили переустановить СУБД, убедитесь, что:
Подведем итог. Если вы столкнулись с упавшим PostgreSQL, выполним следующие действия по шагам:
Data на другой носитель.pg_xact или pg_wal.postmaster.pid.pg_resetwal..dt или через pg_dump.Помним, что единственный надежный способ избежать ночных дежурств после отключения света — это наличие исправного ИБП (UPS), который корректно завершает работу сервера, и настроенное ежедневное резервное копирование.