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

 

Зупиняємо базу даних.

$. 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