PostgreSQL: Как включить контрольные суммы данных - pg_checksums
- Последнее обновление: 3 Ноября 2023 г.
- Просмотры: 510
- Автор: Админ

Коллеги всем привет.
Сегодня мы поговорим о такой функции в PostgreSQL как проверка контрольных сумм данных - checksum. Проверка контрольных сумм данных это отличная функция в PostgreSQL, которая поможет вам обнаружить любые повреждения данных, которые СУБД PostgreSQL хранит на диске. Сбой диска это одна из важнейших вещей, о которых должен знать администратор базы данных. Сбой диска это физическая проблема чтения или записи файлов на диске. Обычным примером отказа диска может являться сбой головки диска, который приведет к потере всех файлов на диске связанных с базой данных, уязвимы для сбоя диска, включая файлы данных, wal журналы и управляющие файлы.
В сегодняшнем примере мы разберем случай когда вы уже создали базу данных без контрольных сумм, и теперь хотите добавить проверку контрольных сумм. Для достижения данной цели мы будем использовать утилиту pg_checksums, она появилась в PostgreSQL начиная с версии 12.
Содержимое статьи:
- Проверка включена ли проверка контрольных сумм данных в базе данных.
- Остановка базы данных.
- Включаем проверку контрольных сумм на базе данных.
- Включаем базу данных.
- Проверка.
- Проверка на ошибки.
- Имитация сбоя файла базы данных.
1. Проверка включена ли проверка контрольных сумм данных в базе данных.
Прежде чем нам что-нибудь делать с базой данных, то нам сначала необходимо убедиться в том что действительно проверка контрольных сумм отключена.
sql> show data_checksums;
sql> SELECT name, setting, category FROM pg_settings WHERE name = 'data_checksums';
Во всех вариантах значения параметра data_checksums равно off, а это значит что проверка контрольных сумм в базе данных PostgreSQL - checksum выключена.
Еще одним вариантом проверки может послужить нам утилита pg_controldata.
$. pg_controldata |grep checksum
Возвращать утилита pg_controldata по параметру checksum может два значения, 0 или 1. Значения 0 значит проверка контрольных сумм выключена, а 1 включена.
2. Остановка базы данных.
Перед тем как включить проверку контрольных сумм на базе данных то нам необходимо сначала её остановить. Если мы базу данных не остановим и запустим утилиту pg_checksums, то ничего не произойдет и сама СУБД PostgreSQL нам покажет сообщения, что её нужно остановить.
$. pg_checksums -D /app/postgresql/15/pg_dbcluster_1/data --enable --progress --verbose
В результате мы получим сообщения об ошибке - pg_checksums: error: cluster must be shut down
Останавливаем базу данных.
$. pg_ctl stop
3. Включаем проверку контрольных сумм на базе данных.
После того как мы остановили базу данных, то теперь мы можем запустить утилиту pg_checksums которая включить проверку контрольных на базе данных.
$. pg_checksums -D /app/postgresql/15/pg_dbcluster_1/data --enable --progress --verbose
Описания параметров:
- -D - Директория где у вас лежат все файлы базы данных.
- --enable - Включить проверку контрольных сумм.
- --progress - Показывать прогресс выполнения в процентах.
- --verbose - Показывать подробное выполнения утилиты.
В результате мы должны увидеть сообщения - Checksums enabled in cluster
4. Включаем базу данных.
Когда утилита pg_checksums выполнила все свои действия, то теперь мы можем запустить базу данных обратно.
$. pg_ctl start
5. Проверка.
Теперь давайте выполним обратно все проверки которые мы делали в первом пункте чтобы убедится что у нас действительно включилась проверка контрольных сумм в базе данных.
sql> show data_checksums;
sql> SELECT name, setting, category FROM pg_settings WHERE name = 'data_checksums';
$. pg_controldata |grep checksum
Как видим в результате все значения параметра checksum равно on и 1, а это значит что проверка контрольных сумм успешно включена.
6. Проверка на ошибки.
Мы теперь можем периодически проверять если ли у нас ошибки связанные с данными, для этого мы выполняем запрос:
sql> SELECT datname, checksum_failures, checksum_last_failure FROM pg_stat_database WHERE datname IS NOT NULL;
Если в результате по всем базам данных вы получаете значения 0, то на текущий момент у вас нет проблем с данными.
7. Имитация сбоя файла базы данных.
Теперь я вам покажу как поведет себя база данных в случаи когда будет запорчена файловая система, для этого я вручную испорчу один из файлов базы данных в которой будет храниться таблица и посмотрим на результат.
ВЫ ТАКИХ ДЕЙСТВИЙ В СВОЕЙ ПРОДУКТИВНОЙ БАЗЕ ДАННЫХ НЕ ДЕЛАЙТЕ!
Я испортил один из файлов базы данных testdb и выполняю обычный запрос на выборку.
WARNING: page verification failed, calculated checksum 57417 but expected 44979
WARNING: invalid page in block 0 of relation base/16388/24620_vm; zeroing out page
В результате мы видим что у нас контрольные суммы не совпадают и база данных нам сообщает об ошибке.
Всем спасибо, я надеюсь что вам моя статья хоть чем-то помогла.