Skip to content

1 Резервное копирование

Лабораторная работа №10: Резервное копирование и восстановление в PostgreSQL


Теоретические сведения

1. Важность резервного копирования

Резервное копирование — процесс создания копии данных для восстановления в случае сбоев, ошибок пользователей или аварий. В PostgreSQL используются два основных типа резервных копий: - Логические бэкапы (создаются утилитами pg_dump, pg_dumpall): - Экспортируют данные в виде SQL-скриптов. - Подходят для небольших баз. - Позволяют восстанавливать отдельные таблицы. - Физические бэкапы (используют pg_basebackup и WAL-архивы): - Копируют бинарные файлы базы данных. - Требуются для Point-in-Time Recovery (PITR). - Позволяют восстановить базу до конкретного момента времени.

2. Write-Ahead Logging (WAL)
  • WAL — механизм, записывающий все изменения в журнал транзакций перед применением к данным.
  • Позволяет:
  • Обеспечить целостность данных.
  • Восстанавливать базу до произвольного момента времени (PITR).
  • Для PITR необходимо:
  • Полный физический бэкап.
  • Архив WAL-файлов, созданных после бэкапа.
3. Инструменты резервного копирования
  • pg_dump: bash pg_dump -U postgres -d mydb -f mydb_backup.sql Экспортирует базу mydb в файл mydb_backup.sql.
  • pg_dumpall: bash pg_dumpall -U postgres -f full_backup.sql Экспортирует все базы и глобальные объекты (роли, настройки).
  • pg_basebackup: bash pg_basebackup -U postgres -D /backup/postgres -Ft -Xs -P Создает физический бэкап в директорию /backup/postgres.

Примеры выполнения

1. Создание логического бэкапа и восстановление
  • Резервное копирование: bash pg_dump -U postgres -d sales -Fc -f sales_backup.dump Флаг -Fc создает бинарный формат, удобный для больших баз.
  • Восстановление: bash pg_restore -U postgres -d sales_new sales_backup.dump
2. Настройка PITR
  1. Включите архивацию WAL в postgresql.conf: ini wal_level = replica archive_mode = on archive_command = 'test ! -f /backup/wal/%f && cp %p /backup/wal/%f'
  2. Создайте полный бэкап: bash pg_basebackup -U postgres -D /backup/full -Ft -Xs -P
  3. Имитация аварии:
  4. Удалите данные в таблице: sql DELETE FROM orders;
  5. Восстановление до момента до удаления:
  6. Остановите PostgreSQL.
  7. Восстановите полный бэкап: bash rm -rf /var/lib/postgresql/data/* tar -xvf /backup/full/base.tar -C /var/lib/postgresql/data/
  8. Создайте файл recovery.conf (или укажите в postgresql.conf): ini restore_command = 'cp /backup/wal/%f %p' recovery_target_time = '2024-01-01 12:00:00'
  9. Запустите PostgreSQL. База восстановится до указанного времени.

Практические задания

Задание 1: Логическое резервное копирование
  1. Создайте базу данных test_db и таблицу users: sql CREATE DATABASE test_db; \c test_db CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT); INSERT INTO users (name) VALUES ('Alice'), ('Bob');
  2. Экспортируйте базу в SQL-файл: bash pg_dump -U postgres -d test_db -f test_db.sql
  3. Удалите таблицу users и восстановите её из бэкапа: bash psql -U postgres -d test_db -f test_db.sql
  4. Проверьте наличие данных в таблице users.
Задание 2: Настройка PITR
  1. Настройте архивацию WAL, как в примере выше.
  2. Создайте таблицу logs и добавьте запись: sql CREATE TABLE logs (message TEXT, created_at TIMESTAMP DEFAULT NOW()); INSERT INTO logs (message) VALUES ('Важное событие!');
  3. Выполните полный бэкап через pg_basebackup.
  4. Удалите таблицу logs.
  5. Восстановите базу до момента до удаления, используя PITR.
Задание 3: Сравнение методов бэкапа
  1. Заполните таблицу users 10 000 тестовых записей.
  2. Создайте логический бэкап через pg_dump и замерьте время.
  3. Создайте физический бэкап через pg_basebackup и замерьте время.
  4. Сравните размеры бэкапов и время восстановления.

Контрольные вопросы

  1. Чем отличается логический бэкап от физического?
  2. Зачем нужны WAL-файлы при восстановлении?
  3. Как восстановить данные, удаленные по ошибке, без остановки сервера?

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