PostgreSQL Error XX001 data_corrupted: Восстановление Повреждений
- Фатальная ошибка повреждения страниц данных:
ERROR: XX001: invalid page in block XX of relation base/XX/XX. - Ошибка контрольной суммы:
ERROR: XX001: page verification failed, calculated checksum XXXX but expected YYYY. - Отказ выполнения
SELECT,pg_dumpили резервного копирования на конкретных строках таблицы. - В 1С:Предприятие аварийно завершается расчет итогов или проведение документов с сообщением «Ошибка формата потока» / «Повреждена таблица СУБД».
1. Проверка масштаба повреждений с помощью расширения amcheck
Активируйте модуль проверки целостности B-Tree индексов:
CREATE EXTENSION IF NOT EXISTS amcheck;
-- Проверка целостности всех индексов схемы public:
SELECT c.relname, bt_index_check(c.oid, true)
FROM pg_index i
JOIN pg_class c ON c.oid = i.indexrelid
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'public' AND c.relam = 403 -- btree
AND c.relpersistence <> 't';
2. Сценарий: Поврежден только индекс (B-Tree corruption)
Если повреждение локализовано в индексе, данные физической таблицы не пострадали. Выполните перестроение:
REINDEX TABLE CONCURRENTLY my_corrupted_table;3. Сценарий: Повреждены блоки таблицы (Heap Corruption)
Если поврежден блок самой таблицы (Heap), чтение будет падать. Для аварийного спасения уцелевших данных активируйте обнуление битых страниц в рамках аварийной сессии:
-- ВНИМАНИЕ: Позволяет пропустить битый блок ценой потери находящихся в нем строк!
SET zero_damaged_pages = on;
-- Выгрузка всех читаемых данных в новую копию таблицы:
CREATE TABLE my_table_salvaged AS SELECT * FROM my_corrupted_table;
-- Сброс опасного параметра:
SET zero_damaged_pages = off;
4. Включение и мониторинг Data Checksums
Убедитесь, что в кластере включена проверка контрольных сумм страниц данных для раннего обнаружения сбоев дисков:
SHOW data_checksums;
-- Если выключено, включите в оффлайн-режиме утилитой pg_checksums:
-- 1. systemctl stop postgresql
-- 2. su - postgres -c "/usr/lib/postgresql/16/bin/pg_checksums -e -D /var/lib/postgresql/data"
-- 3. systemctl start postgresql
Частые вопросы (FAQ)
Что делает параметр zero_damaged_pages = on?
При обнаружении поврежденного заголовка или невалидной контрольной суммы страницы PostgreSQL не прерывает запрос ошибкой XX001, а забивает поврежденную страницу нулями и логирует предупреждение. Это приводит к потере строк в данном блоке (до 8KB данных), но спасает остальную таблицу.
Почему возникают ошибки XX001 data_corrupted?
Основные причины: аппаратные сбои RAM (bit-rot), сбои контроллеров дисков и SSD без ECC-защиты, внезапное отключение питания сервера при включенном небезопасном кэше записи диска (Write-Caching without BBU), а также баги файловой системы.
Как восстановить потерянные строки после zero_damaged_pages в 1С?
После спасения таблицы выполните 'Тестирование и исправление' в 1С:Конфигураторе с установленным флагом 'Создавать объекты при наличии ссылок на несуществующие', либо восстановите конкретный документ/справочник из резервной копии.
Можно ли восстановить поврежденную страницу без потери строк?
Да, если у вас настроена непрерывная архивация WAL (PITR) и включены data_checksums: восстановите базовую копию до момента аварии и накатите WAL-логи до точки сбоя.