Ошибка PostgreSQL XX002: index_corrupted — диагностика и устранение
- Аварийное прерывание транзакций с сообщением
ERROR: index "." contains corrupted page at block ... (SQLSTATE XX002) - В платформе 1С:Предприятие возникают ошибки вида «Ошибка СУБД: Таблица или индекс повреждены» при проведении документов или формировании отчетов.
- Планировщик запросов (Query Planner) падает или возвращает неконсистентные строки (отличающиеся от вывода при отключении
enable_indexscan). - В системном журнале PostgreSQL фиксируются сбои верификации контрольных сумм страниц B-Tree.
1. Экспресс-проверка через модуль amcheck
Установите расширение для глубокой проверки B-деревьев без блокировок:
CREATE EXTENSION IF NOT EXISTS amcheck;
-- Проверка целостности конкретного индекса
SELECT bt_index_check('"_accumrgtn12345_1"', true);
-- Проверка всех индексов текущей схемы
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
ORDER BY c.relname;2. Фоновое перестроение поврежденного индекса
В рабочей базе 1С переиндексацию следует выполнять без длительных блокировок записи:
REINDEX INDEX CONCURRENTLY "_accumrgtn12345_1";3. Комплексная переиндексация таблицы
REINDEX TABLE CONCURRENTLY "_accumrgtn12345";4. Временный обход повреждения до проведения регламентных работ
Если блокируется проведение критически важных операций, отключите использование поврежденных индексов на уровне сессии:
SET enable_indexscan = off;
SET enable_bitmapscan = off;5. Проверка дисковой подсистемы и контрольных сумм
# Проверка SMART накопителя
smartctl -a /dev/nvme0n1
# Проверка dmesg на ошибки I/O контроллера
dmesg -T | grep -Ei "blk_update_request|i/o error|xfs_corrupt" Частые вопросы (FAQ)
Что вызывает появление ошибки XX002 в PostgreSQL?
Основные причины: сбои дисковой подсистемы (I/O error, «тихое» повреждение данных без ECC), сбои питания в момент сброса буферов dirty pages, некорректная работа кэша RAID-контроллера с севшей батареей (BBU), а также редкие баги glibc при изменении правил сортировки (LC_COLLATE).
Чем отличается REINDEX от REINDEX CONCURRENTLY?
Обычный REINDEX накладывает блокировку AccessExclusiveLock, полностью запрещающую чтение и запись в таблицу. Режим CONCURRENTLY создает новый индекс параллельно, требуя лишь ShareUpdateExclusiveLock, что позволяет 1С продолжать работу без простоя.
Поможет ли тестирование и исправление (ТиИ) в 1С при ошибке XX002?
Да, процедура «Реиндексация таблиц информационной базы» в режиме «Тестирование и исправление» пересоздает все индексы штатными средствами платформы, однако требует монопольного захвата базы данных.
Как включить постоянную защиту от скрытой порчи страниц в PostgreSQL?
Инициализируйте кластер с флагом контрольных сумм (initdb -k / --data-checksums) или активируйте их в оффлайн-режиме через pg_checksums -e -D /var/lib/postgresql/data.