Rsync / Sqlite база данных
Кто-нибудь когда-нибудь пробовал rsync'ing базу данных sqlite?
Можно ли получить доступ к данным, пока они синхронизированы?
7 ответов
Предполагая, что вы хотите сделать это с помощью команд оболочки, вы можете сделать что-то вроде:
ssh user@host 'sqlite3 "/path/to/db.sqlite" ".backup /path/to/dbbackup.sqlite"'
rsync user@host:"/path/to/dbbackup.sqlite" "db.sqlite"
Который сначала безопасно создает резервную копию существующей базы данных, а затем копирует ее в "db.sqlite" на вашем собственном компьютере.
Я бы посчитал это опасным.
В базе данных SQLite также есть файлы журналов, которые необходимо сохранить.
если ты
- rsync базы данных без файлов журнала в середине транзакции
- скопировать файл базы данных
- получить доступ к копии
Весьма вероятно, что вы столкнетесь с коррупцией.
Вместо этого используйте API резервного копирования SQLite.
Как указывал Ной, это опасно. Ваша база данных будет повреждена.
Вместо этого вы можете использовать библиотеку http://litereplica.io/.
Он выполняет всю работу за кулисами, соблюдая обычную транзакцию SQLite. И постепенно (передаются только измененные страницы).
Или библиотека rqlite.
Последний требует установки языка Go.
Пока транзакция не открыта, rsync базы данных будет в порядке.
Пока транзакция открыта, rsync базы данных приведет к повреждению. Причина: вы получите базу данных и сопровождающий ее файл журнала в несколько иной момент времени, нарушив согласованность, которая позволила бы SQLite согласовать журнал с базой данных. Если SQLite не может согласовать журнал с базой данных, тогда база данных останется в несогласованном состоянии без возможности определить, что было частью частично примененной транзакции.
Чтобы иметь возможность rsync базы данных SQLite, вам необходимо:
Используйте собственные команды консоли SQLite для создания резервной копии файла базы данных. Это подождет, чтобы получить блокировку записи и скопировать файл, затем снять блокировку записи, таким образом гарантируя, что никакие транзакции не будут применены частично. Затем повторно скопируйте копию.
.backup ?DB? file
Или завершите все процессы, использующие базу данных SQLite, пока вы выполняете rsync.
Для тех, кто ищет более безопасное решение для репликации и резервного копирования SQLite в режиме реального времени, не прерывая его работу, обратите внимание на Litestream . Litestream — это инструмент, который запускается в отдельном процессе и непрерывно реплицирует базу данных SQLite на Amazon S3.
Нет, базы данных sqlite не всегда согласованы по умолчанию. Тем не менее, поиск по "sqlite copy file" обнаружил страницу о создании онлайн-резервных копий с помощью SQLite, которая, как я подозреваю, покроет все проблемы, которые могут у вас возникнуть.
Предыдущие ответы верны.
Но если вы на 100% уверены, что в вашей базе данных есть только операции чтения, вы можете спокойно взять любую копию файла базы данных. Я делал это в производственном приложении целую вечность без проблем (cp, tar, rsync, scp, sftp). Файл базы данных установлен только для чтения на уровне операционной системы (chmod aw), и попытки записи в базу данных дают ошибку
Error: attempt to write a readonly database
пока все выбирает работают нормально.
Тогда, конечно, этот подход может или не может быть осуществимым в отношении вашего заявления. Тот же подход можно использовать для предотвращения несанкционированных записей, таких как SQL-инъекция в веб-приложение.