Глиф Учебники

Резервная копия базы данных — SQLite, MySQL, PostgreSQL

Справочник · SQL · 2 минуты чтения

СУБДКопияВосстановление
SQLitesqlite3 shop.db ".backup shop-copy.db"вернуть файл на место
MySQL, MariaDBmysqldump -u root -p shop > shop.sqlmysql -u root -p shop < shop.sql
PostgreSQLpg_dump -U postgres shop > shop.sqlpsql -U postgres -d shop -f shop.sql

Команды набирают в терминале (в Windows — в командной строке), а не внутри sqlite3, mysql или psql.

Подробнее для каждой СУБД

Выберите свою СУБД:

SQLite.backup или VACUUM INTO

База SQLite — один файл, но копировать его обычным копированием можно, только когда с базой никто не работает. Если программа в этот момент пишет в базу, копия может оказаться испорченной. Надёжнее команда .backup — она делает целую копию даже во время работы:

Bash
sqlite3 shop.db ".backup shop-copy.db"

То же умеет запрос SQL (SQLite 3.27 и новее) — удобно в DB Browser for SQLite или из программы:

SQL
VACUUM INTO 'shop-copy.db';

Файл копии не должен существовать заранее, иначе ошибка output file already exists. Восстановить — закрыть все программы, которые работают с базой, и заменить файл копией.

Копия в виде текста с командами SQL (удобно хранить и смотреть глазами):

Bash
sqlite3 shop.db .dump > shop.sql
sqlite3 restored.db < shop.sql

Рядом с базой могут лежать файлы shop.db-wal и shop.db-shm — это часть базы в режиме WAL. Копируя файлы вручную, копируйте их вместе с основным, а лучше пользуйтесь .backup.

Дальше: «Чтобы копия действительно спасла»

MySQL и MariaDBmysqldump

Bash
mysqldump -u root -p --single-transaction shop > shop-$(date +%F).sql

-p без значения — программа спросит пароль. --single-transaction делает согласованную копию таблиц InnoDB, не останавливая работу с базой. Все базы сразу — --all-databases вместо имени базы. В новых версиях MariaDB та же программа называется mariadb-dump. В Ubuntu, где root входит в MySQL без пароля, — sudo mysqldump shop > shop.sql.

Восстановление — в существующую базу:

Bash
mysql -u root -p -e "CREATE DATABASE shop_restored"
mysql -u root -p shop_restored < shop.sql

Не пишите пароль прямо в команде (-pсекрет): он попадёт в историю команд и будет виден другим пользователям сервера в списке процессов. Для скриптов храните его в файле настроек ~/.my.cnf с правами 600.

Дальше: «Чтобы копия действительно спасла»

PostgreSQLpg_dump и pg_restore

Bash
pg_dump -U postgres shop > shop.sql
psql -U postgres -d shop_restored -f shop.sql

База shop_restored должна существовать: createdb -U postgres shop_restored. В Ubuntu команды обычно выполняют от системного пользователя postgres: sudo -u postgres pg_dump shop > shop.sql.

Сжатый формат с выборочным восстановлением:

Bash
pg_dump -U postgres -Fc shop > shop.dump
pg_restore -U postgres -d shop_restored shop.dump

pg_dump копирует одну базу без пользователей и их паролей. Их сохраняет pg_dumpall -U postgres --globals-only.

Чтобы копия действительно спасла