PostgreSQL: Як включити контрольні суми даних - pg_checksums
- Останнє оновлення: 3 Листопада 2023 р.
- Перегляди: 108
- Автор: Адмін

Колеги всім привіт.
Сьогодні ми поговоримо про таку функцію в 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
Зупиняємо базу даних.
$. 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
В результаті ми бачимо, що у нас контрольні суми не збігаються і база даних нам повідомляє про помилку.
Дякую всім, я сподіваюся що вам моя стаття хоч чимось допомогла.