Databases

Дамп базы данных

Дамп базы данных — файл со снимком её содержимого, обычно набор SQL-команд, из которого базу можно воссоздать с нуля.

Что такое дамп базы данных

Дамп (dump) — файл, содержащий полный снимок базы данных на момент выгрузки: структуру таблиц, данные, индексы, права. Чаще всего это обычный текстовый файл с SQL-командами: CREATE TABLE, затем INSERT со всеми строками. Выполнив его на чистом сервере, вы получите базу в том же состоянии.

Зачем нужен: резервное копирование, перенос базы между серверами и версиями СУБД, поднятие копии прода на машине разработчика, архив перед рискованной миграцией.

Логический и физический бэкап

Логический (дамп) Физический
Что копирует SQL-команды или данные Файлы БД с диска
Инструменты pg_dump, mysqldump pg_basebackup, снапшот ФС
Размер Меньше (особенно сжатый) Как база на диске
Скорость снятия Медленнее Быстрее
Восстановление Медленное (выполняются INSERT) Быстрое (копирование файлов)
Между версиями СУБД Да Нет
Часть базы Да, любые таблицы Только целиком
Восстановление на момент Нет Да, с журналом транзакций

Практика: логический дамп — для переноса, разработки и небольших баз; физический плюс архив WAL — для боевых баз в сотни гигабайт, где pg_dump слишком долог, а восстановление на точку во времени обязательно.

PostgreSQL: pg_dump

# Обычный SQL-дамп со сжатием
pg_dump -U app -d shop | gzip > shop_$(date +%F).sql.gz

# Custom-формат — предпочтительный вариант
pg_dump -U app -d shop -Fc -f shop.dump

# Только схема / только данные
pg_dump -U app -d shop --schema-only -f schema.sql
pg_dump -U app -d shop --data-only -t orders -f orders.sql

# Все базы кластера вместе с ролями
pg_dumpall -U postgres > cluster.sql

Восстановление:

gunzip -c shop_2026-07-17.sql.gz | psql -U app -d shop_new

# Custom-формат: параллельно, в 4 потока
pg_restore -U app -d shop_new -j 4 shop.dump

Формат -Fc (custom) стоит предпочитать обычному SQL: он сжат, позволяет восстанавливать выборочные таблицы и распараллеливать pg_restore через -j. На большой базе разница во времени восстановления — часы.

pg_dump снимает согласованный снимок: дамп соответствует состоянию базы на момент старта команды, даже если она шла час и данные всё это время менялись. Работу приложения он не блокирует, но долгая транзакция мешает VACUUM и удерживает старые версии строк.

MySQL: mysqldump

mysqldump -u root -p --single-transaction --routines --triggers \
  shop | gzip > shop_$(date +%F).sql.gz

# Все базы
mysqldump -u root -p --all-databases --single-transaction > all.sql

# Одна таблица
mysqldump -u root -p shop orders > orders.sql

Восстановление:

mysql -u root -p -e "CREATE DATABASE shop_new CHARACTER SET utf8mb4"
gunzip -c shop_2026-07-17.sql.gz | mysql -u root -p shop_new

--single-transaction обязателен для InnoDB: без него mysqldump блокирует таблицы на запись, останавливая работу приложения на всё время выгрузки. С ним дамп снимается в одной транзакции, консистентно и без блокировок. Оговорка: на MyISAM-таблицах это не работает — они не транзакционные (подробнее про движки).

--routines и --triggers не включены по умолчанию — забыть их значит получить дамп без хранимых процедур и триггеров и узнать об этом при восстановлении.

Другие СУБД

# MongoDB
mongodump --uri="mongodb://localhost:27017" --db=shop --out=/backup/
mongorestore --uri="mongodb://localhost:27017" /backup/

# SQLite — база и так один файл, но дамп в SQL тоже есть
sqlite3 app.db .dump > app.sql

# ClickHouse
clickhouse-client -q "SELECT * FROM events FORMAT Native" > events.native

В MS SQL Server роль дампа играет BACKUP DATABASE с файлом .bak — это ближе к физическому бэкапу.

Автоматизация и правила

#!/bin/bash
# /usr/local/bin/pg_backup.sh — в cron: 0 3 * * *
set -euo pipefail

BACKUP_DIR=/var/backups/pg
DATE=$(date +%F)

pg_dump -U app -d shop -Fc -f "$BACKUP_DIR/shop_$DATE.dump"
find "$BACKUP_DIR" -name '*.dump' -mtime +14 -delete
mc cp "$BACKUP_DIR/shop_$DATE.dump" s3/backups/pg/    # копия вне сервера

Что действительно важно на практике:

  • Бэкап, который не восстанавливали, — не бэкап. Регулярно поднимайте дамп на тестовом сервере. Битые или пустые дампы обнаруживаются именно так, а не в момент аварии.
  • Копия должна лежать не на том же сервере. Дамп рядом с базой не переживёт отказ диска или компрометацию машины.
  • Дамп — это все ваши данные одним файлом. Персональные данные из него утекают целиком, поэтому шифрование и ограничение доступа — не формальность (152-ФЗ).
  • Репликация не заменяет дамп. Ошибочный DELETE доедет до реплики мгновенно; откатиться можно только из бэкапа.
  • set -euo pipefail в скрипте — чтобы упавший pg_dump не привёл к тихому удалению старых копий следующей строкой.

Связанные термины

Готовы запустить GPU-задачу?

Запустить GPU-сервер