В процессе работы с 1С на СУБД PostgreSQL, особенно после сбоев, таких как внезапное прерывание сеанса при обновлении конфигурации, можно столкнуться с критической ошибкой: Ошибка СУБД: error: invalid page in block NNN of relation base/NNNNN. Эта ошибка говорит о физическом повреждении данных в файлах базы на диске. Стандартные средства 1С, например, "Тестирование и исправление" (ТиИ), в таких случаях часто оказываются бессильны, так как они работают на логическом уровне, а проблема лежит глубже — на уровне самой СУБД.
Давайте разберем по шагам, как диагностировать и устранить эту проблему, начав с самых безопасных методов и переходя к более сложным.
Прежде чем что-то "лечить", нужно точно понять, что именно сломалось — таблица с данными или ее индекс. От этого зависит стратегия восстановления. Самый надежный инструмент для этого — технологический журнал (ТЖ) 1С. Для быстрого сопоставления физических таблиц СУБД с объектами метаданных 1С можно использовать отчет о структуре хранения базы данных.
DBPOSTGRS. В логах мы увидим полный текст SQL-запроса, который вызывает сбой._inforg12345._inforg20355: Это, скорее всего, сама таблица данных. Ситуация более сложная._inforg20355_2: Наличие суффикса (_1, _2, и т.д.) с высокой вероятностью указывает на то, что поврежден индекс, а не сама таблица с данными. Это хорошая новость, так как исправить это гораздо проще.После того как мы определили характер повреждения, можно выбирать метод восстановления.
Рассмотрим несколько способов, от простого и безопасного к более сложному и рискованному.
Этот метод не требует глубоких знаний PostgreSQL и является самым надежным для специалиста 1С. Его суть в том, чтобы заставить платформу 1С логически прочитать все данные и заново создать физическую структуру базы.
Разберем по шагам:
.dt. Если этот процесс завершается успешно, без ошибок, — отлично, можно продолжать. Если выгрузка обрывается с ошибкой, этот метод не подходит, и нужно переходить к способам прямого восстановления СУБД..dt файл. После загрузки заходим в конфигуратор и в пользовательский режим, чтобы убедиться, что база работает корректно..dt файл. Этот файл можно считать "очищенным" от физических ошибок структуры..dt файл из шага 4.Почему это работает? При выгрузке в .dt платформа 1С читает данные логически, таблица за таблицей, не обращая внимания на физическую структуру хранения. При загрузке она создает все таблицы, индексы и связи с нуля, тем самым исправляя любые физические повреждения структуры.
Если на этапе диагностики мы выяснили, что проблема в индексе (например, в таблице _inforg20355_2), то самое правильное решение — перестроить его средствами PostgreSQL. Это быстро и не затрагивает сами данные.
Важно: перед выполнением команд необходимо завершить все активные сеансы работы с базой данных 1С, кроме вашего собственного подключения для администрирования. Для автоматизации завершения сеансов и резервного копирования можно применить обработку для администрирования ИБ и управления сеансами.
Подключитесь к базе данных с помощью утилиты psql или через графический интерфейс (например, pgAdmin) и выполните одну из команд:
REINDEX INDEX имя_поврежденного_индекса;
REINDEX TABLE имя_таблицы;
REINDEX DATABASE имя_базы_данных;
После выполнения команды индексы будут созданы заново на основе существующих данных, и ошибка должна исчезнуть.
Этот способ следует применять в крайнем случае, когда повреждена сама таблица данных, а выгрузка в .dt невозможна. Метод заключается в том, чтобы разрешить PostgreSQL проигнорировать ошибку чтения, заполнив поврежденный блок данных нулями.
ВНИМАНИЕ: ЭТОТ МЕТОД ПРИВОДИТ К НЕИЗБЕЖНОЙ ПОТЕРЕ ЧАСТИ ДАННЫХ! Все строки, которые находились в поврежденном блоке, будут утеряны навсегда.
Разберем по шагам:
postgresql.conf.zero_damaged_pages = on..dt или выполнить SQL-запрос вида SELECT count(*) FROM имя_проблемной_таблицы;..dt или через pg_dump).zero_damaged_pages = off. Оставлять его включенным опасно, так как это будет маскировать будущие проблемы.Восстановить базу — это полдела. Важно понять, почему произошел сбой, чтобы избежать его в будущем. Для контроля корректности учетных данных после восстановления и завершения технических работ может применяться автоматическая сверка бухгалтерских и налоговых проводок между базами 1С.
postgresql.conf установлены безопасные параметры:
fsync = on — гарантирует, что данные физически записываются на диск, а не остаются в кэше ОС. Снижает производительность, но значительно повышает надежность.full_page_writes = on — защитный механизм от частичной записи страниц на диск при сбоях. Должен быть включен..dt средствами 1С, и нативные средства PostgreSQL (pg_dump).Следуя этим рекомендациям, вы сможете не только восстановить работоспособность базы данных после серьезного сбоя, но и значительно снизить риски его повторения в будущем.