Включение ведения контрольных сумм в кластере PostgreSQL 12

Аппаратура пока несовершенна и данные могут быть повреждены на носителе, при передаче данных по интерфейсным кабелям и т.п.
Часть таких ошибок обрабатывается на аппаратном уровне, но часть — увы нет.
Чтобы вовремя обнаружить возникшую проблему, в PostgreSQL журнальные записи всегда снабжаются контрольными суммами.
Страницы данных также можно защитить контрольными суммами.

Как это сделать? Читаем ниже.

Исходные данные: Кластер PostgreSQL 12
Задача: Включить защиту страниц данных контрольными суммами.

Включить защиту страниц данных контрольными суммами можно сделать только при инициализации кластера, но в версии PostgreSQL 12 ее можно включать и выключать с помощью утилиты pg_checksums (правда, пока не «на лету», а только при остановленном кластер).

В производственной среде контрольные суммы обязательно должны быть включены, несмотря на накладные расходы на их вычисление и контроль. Это уменьшает вероятность того, что сбой не будет вовремя обнаружен.

ВАЖНО! Включение контрольных сумм на большом кластере может занять до нескольких часов, помните про это и планируйте простой в связи с этим.

Вначале убедимся, что ведение контрольных сумм выключено:

su - postgres -c 'psql -c "SHOW data_checksums;"'

Если выведет off, то ведение контрольных сумм выключено:

 data_checksums
----------------
 off
(1 row)

Теперь останавливаем кластер для включения контрольных сумм:

pg_ctlcluster 12 main stop

Проверяем:

su - postgres -c '/usr/lib/postgresql/12/bin/pg_controldata -D "/var/lib/postgresql/12/main"' | grep state

Если выведет:

Database cluster state:               shut down

, то можно включать контрольные суммы:

su - postgres -c '/usr/lib/postgresql/12/bin/pg_checksums --enable -D "/var/lib/postgresql/12/main"'

Утилиты pg_checksums выведет такое сообщение:

Checksum operation completed
Files scanned:  961
Blocks scanned: 2996
pg_checksums: syncing data directory
pg_checksums: updating control file
Checksums enabled in cluster

Это означает, что защита страниц данных контрольными суммами включена.

Запускаем кластер:

pg_ctlcluster 12 main start

Проверяем включение контрольных сумм:

su - postgres -c 'psql -c "SHOW data_checksums;"'

Должно вывести:

 data_checksums
----------------
 on
(1 row)

Так же можно проверить включение контрольных сумм с помощью утилиты pg_controldata:

su - postgres -c '/usr/lib/postgresql/12/bin/pg_controldata -D "/var/lib/postgresql/12/main" | grep checksum'

Должно вывести:

Data page checksum version:           1

В дальнейшем очень важно контролировать количество ошибок контрольных сумм в страницах данных с помощью какой-то системы мониторинга, иначе Вы не сможете во время узнать о появлении ошибок и произвести исправление данных. Для контроля нужно использовать представление pg_stat_database и проверять значение столбцов datname (Имя базы данных), checksum_failures (Количество ошибок контрольных сумм в страницах данных этой базы (или общего объекта) либо NULL, если контрольные суммы не проверяются) и checksum_last_failure (Время выявления последней ошибки контрольной суммы в страницах данных этой базы (или общего объекта) либо NULL, если контрольные суммы не проверяются)

Пример запроса для проверки наличия ошибок:

SELECT datname, checksum_failures, checksum_last_failure FROM pg_stat_database WHERE datname IS NOT NULL;

На этом все, до скорых встреч. Если у Вас возникли вопросы или Вы хотите чтобы я помог Вам, то Вы всегда можете связаться со мной разными доступными способами.


8
Оставить комментарий

avatar
1000
2 Цепочка комментария
6 Ответы по цепочке
1 Последователи
 
Популярнейший комментарий
Цепочка актуального комментария
3 Авторы комментариев
PaulМихаилdante Авторы недавних комментариев

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

  Подписаться  
Уведомление о
dante
Гость
dante

а если checksum включены, но не пишутся? В pg_stat_database не появилась колонка checksum_failures.
как такое лечится?

Paul
Гость
Paul

Спасибо за интересную статью.
Подскажите, пожалуйста, при старте кластера проверка отличается от проверки утилитой pg_checksums -c ?
Я руками изменил один файл при выключенном кластере.
pg_checksums -с выдаёт ошибку, а кластер стартует без ошибок.