PostgreSQL: Как включить контрольные суммы данных - pg_checksums

PostgreSQL: Как включить контрольные суммы данных - pg_checksums

Коллеги всем привет.

Сегодня мы поговорим о такой функции в PostgreSQL как проверка контрольных сумм данных - checksum. Проверка контрольных сумм данных это отличная функция в PostgreSQL, которая поможет вам обнаружить любые повреждения данных, которые СУБД PostgreSQL хранит на диске. Сбой диска это одна из важнейших вещей, о которых должен знать администратор базы данных. Сбой диска это физическая проблема чтения или записи файлов на диске. Обычным примером отказа диска может являться сбой головки диска, который приведет к потере всех файлов на диске связанных с базой данных, уязвимы для сбоя диска, включая файлы данных, wal журналы и управляющие файлы.

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

 

Содержимое статьи:

  1. Проверка включена ли проверка контрольных сумм данных в базе данных.
  2. Остановка базы данных.
  3. Включаем проверку контрольных сумм на базе данных.
  4. Включаем базу данных.
  5. Проверка.
  6. Проверка на ошибки.
  7. Имитация сбоя файла базы данных.

 

1. Проверка включена ли проверка контрольных сумм данных в базе данных.

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

Подключаемся к базе данных с помощью утилиты psql и выполняем запросы.

sql> show data_checksums;

postgresql_checksum

 

sql> SELECT name, setting, category FROM pg_settings WHERE name = 'data_checksums';

postgresql_checksum

 

Во всех вариантах значения параметра data_checksums равно off, а это значит что проверка контрольных сумм в базе данных PostgreSQL - checksum выключена.

 

Еще одним вариантом проверки может послужить нам утилита pg_controldata.

$. pg_controldata |grep checksum

postgresql_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

postgresql_checksum

В результате мы получим сообщения об ошибке - 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 - Показывать подробное выполнения утилиты.

 

postgresql_checksum

В результате мы должны увидеть сообщения - 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

postgresql_checksum

Как видим в результате все значения параметра checksum равно on и 1, а это значит что проверка контрольных сумм успешно включена. 


 

6. Проверка на ошибки.

Мы теперь можем периодически проверять если ли у нас ошибки связанные с данными, для этого мы выполняем запрос:

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

postgresql_checksum

Если в результате по всем базам данных вы получаете значения 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

postgresql_checksum

postgresql_checksum

В результате мы видим что у нас контрольные суммы не совпадают и база данных нам сообщает об ошибке.


 

Всем спасибо, я надеюсь что вам моя статья хоть чем-то помогла.

 

ПОХОЖИЕ СТАТЬИ

PostgreSQL Ошибка: requested wal segment has already been removed
PostgreSQL Ошибка: requested wal segment has already been removed
POSTGRESQL
Postgresql - Список пользователей
Postgresql - Список пользователей
POSTGRESQL
PostgreSQL - ERROR out of shared memory HINT
PostgreSQL - ERROR out of shared memory HINT
POSTGRESQL