В процессе эксплуатации 1С в клиент-серверном варианте на базе PostgreSQL нередко возникают критические сбои, сопровождающиеся аварийным завершением серверных процессов. Если вы наблюдаете ошибки вида 0xC0000005 или invalid memory alloc request size, это сигнализирует о физическом повреждении данных в одной из таблиц базы. Рассмотрим, как провести диагностику и восстановить работоспособность системы.
Первым делом проанализируем логи PostgreSQL. В них вы обнаружите записи о завершении серверного процесса по исключению 0xC0000005 (ошибка доступа к памяти). Это происходит, когда Postgres пытается считать поврежденную запись, и из-за нарушения структуры данных серверный процесс аварийно завершается, что приводит к разрыву соединений со всеми активными клиентами 1С.
Чтобы понять, какая именно таблица повреждена, изучите логи на предмет запросов, которые исполнялись в момент сбоя. Чаще всего это обращения к регистрам сведений, например, к таблице _InfoRg15978. Идентификация имени таблицы — критически важный этап, так как именно она содержит «битую» запись.
Никогда не выполняйте удаление данных в «боевой» базе!
PostgreSQL.data (каталог данных кластера) в отдельное место на диске.PostgreSQL, указав в конфигурации скопированный каталог data.После идентификации таблицы (в нашем случае это _InfoRg15978) необходимо избавиться от поврежденных данных, которые препятствуют выполнению pg_dump и работе 1С. Поскольку стандартные инструменты вроде ТИИ (Тестирование и исправление) завершаются ошибкой, мы воспользуемся SQL-инструментарием.
Попробуйте выгрузить таблицу частями, чтобы локализовать проблемный фрагмент. Если выгрузка всей таблицы с помощью pg_dump выдает ошибку памяти, используйте прямые запросы к базе данных:
-- Пример запроса для поиска поврежденных данных в таблице
SELECT ctid, *
FROM public._inforg15978
ORDER BY ctid
LIMIT 1000 OFFSET 0;
Меняя значение OFFSET, вы можете «пролистать» таблицу и найти блок записей, на котором сервер выдает ошибку. Когда вы найдете конкретный идентификатор строки ctid, вызывающий сбой, его можно удалить:
-- Удаление конкретной битой записи
DELETE FROM public._inforg15978
WHERE ctid = '(номер_страницы, номер_строки)';
После удаления поврежденной записи рекомендуется выполнить следующие действия:
REINDEX TABLE _inforg15978, чтобы привести структуру индексов в порядок.VACUUM ANALYZE для очистки таблицы от «мертвых» строк.PostgreSQL 11-й ветки. Версия 11.5 давно устарела и содержит известные баги, которые могут приводить к подобным ситуациям.chkdsk.Ситуация, когда база «падает» из-за поврежденной записи в регистре сведений, неприятна, но решаема. Главный принцип — не пытаться «лечить» основную базу, а работать на физической копии, последовательно выявляя битые страницы таблицы и удаляя их через SQL. После успешного восстановления работоспособности базы обязательно настройте регулярное создание бэкапов через pg_dump и мониторинг логов сервера.