Резервная копия базы данных — SQLite, MySQL, PostgreSQL
| СУБД | Копия | Восстановление |
|---|---|---|
| SQLite | sqlite3 shop.db ".backup shop-copy.db" | вернуть файл на место |
| MySQL, MariaDB | mysqldump -u root -p shop > shop.sql | mysql -u root -p shop < shop.sql |
| PostgreSQL | pg_dump -U postgres shop > shop.sql | psql -U postgres -d shop -f shop.sql |
Команды набирают в терминале (в Windows — в командной строке), а не внутри sqlite3, mysql или psql.
Подробнее для каждой СУБД
Выберите свою СУБД:
SQLite.backup или VACUUM INTO
База SQLite — один файл, но копировать его обычным копированием можно, только когда с базой никто не работает. Если программа в этот момент пишет в базу, копия может оказаться испорченной. Надёжнее команда .backup — она делает целую копию даже во время работы:
sqlite3 shop.db ".backup shop-copy.db"То же умеет запрос SQL (SQLite 3.27 и новее) — удобно в DB Browser for SQLite или из программы:
VACUUM INTO 'shop-copy.db';Файл копии не должен существовать заранее, иначе ошибка output file already exists. Восстановить — закрыть все программы, которые работают с базой, и заменить файл копией.
Копия в виде текста с командами SQL (удобно хранить и смотреть глазами):
sqlite3 shop.db .dump > shop.sql
sqlite3 restored.db < shop.sqlРядом с базой могут лежать файлы shop.db-wal и shop.db-shm — это часть базы в режиме WAL. Копируя файлы вручную, копируйте их вместе с основным, а лучше пользуйтесь .backup.
MySQL и MariaDBmysqldump
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.
Восстановление — в существующую базу:
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
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.
Сжатый формат с выборочным восстановлением:
pg_dump -U postgres -Fc shop > shop.dump
pg_restore -U postgres -d shop_restored shop.dumppg_dump копирует одну базу без пользователей и их паролей. Их сохраняет pg_dumpall -U postgres --globals-only.
Чтобы копия действительно спасла
- Проверяйте восстановление. Копия, которую ни разу не разворачивали, может оказаться пустой или неполной. Восстановите её в отдельную базу и посмотрите, что таблицы и строки на месте.
- Храните копии на другом диске или компьютере. Копия на том же диске пропадёт вместе с ним.
- Делайте копии по расписанию — например, через cron в Linux (см. тему Bash) — и удаляйте самые старые, чтобы не кончилось место.
- Восстанавливайте в новую базу, а не поверх рабочей: так ошибка в копии не испортит то, что есть.