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
- Включите архивацию WAL в
postgresql.conf:ini wal_level = replica archive_mode = on archive_command = 'test ! -f /backup/wal/%f && cp %p /backup/wal/%f' - Создайте полный бэкап:
bash pg_basebackup -U postgres -D /backup/full -Ft -Xs -P - Имитация аварии:
- Удалите данные в таблице:
sql DELETE FROM orders; - Восстановление до момента до удаления:
- Остановите PostgreSQL.
- Восстановите полный бэкап:
bash rm -rf /var/lib/postgresql/data/* tar -xvf /backup/full/base.tar -C /var/lib/postgresql/data/ - Создайте файл
recovery.conf(или укажите вpostgresql.conf):ini restore_command = 'cp /backup/wal/%f %p' recovery_target_time = '2024-01-01 12:00:00' - Запустите PostgreSQL. База восстановится до указанного времени.
Практические задания
Задание 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'); - Экспортируйте базу в SQL-файл:
bash pg_dump -U postgres -d test_db -f test_db.sql - Удалите таблицу
usersи восстановите её из бэкапа:bash psql -U postgres -d test_db -f test_db.sql - Проверьте наличие данных в таблице
users.
Задание 2: Настройка PITR
- Настройте архивацию WAL, как в примере выше.
- Создайте таблицу
logsи добавьте запись:sql CREATE TABLE logs (message TEXT, created_at TIMESTAMP DEFAULT NOW()); INSERT INTO logs (message) VALUES ('Важное событие!'); - Выполните полный бэкап через
pg_basebackup. - Удалите таблицу
logs. - Восстановите базу до момента до удаления, используя PITR.
Задание 3: Сравнение методов бэкапа
- Заполните таблицу
users10 000 тестовых записей. - Создайте логический бэкап через
pg_dumpи замерьте время. - Создайте физический бэкап через
pg_basebackupи замерьте время. - Сравните размеры бэкапов и время восстановления.
Контрольные вопросы
- Чем отличается логический бэкап от физического?
- Зачем нужны WAL-файлы при восстановлении?
- Как восстановить данные, удаленные по ошибке, без остановки сервера?
Работа позволяет освоить ключевые методы обеспечения отказоустойчивости в PostgreSQL. Примеры и задания можно адаптировать под конкретные кейсы (например, восстановление после сбоя диска).