Кто-нибудь когда-нибудь пробовал rsync'ing sqlite database?
Можно ли получить доступ к данным во время их синхронизации?
Предполагая, что вы хотите сделать это с помощью команд оболочки, вы можете сделать что-то вроде:
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 также есть файлы журнала, которые необходимо сохранить.
если ты
Очень вероятно, что вы испытаете коррупцию.
Использовать SQLite Online Backup API вместо.
Как указал Ной, это опасно. Ваша база данных будет повреждена.
Вы можете использовать Litereplica библиотека вместо этого.
Он выполняет всю работу за кулисами, соблюдая нормальную транзакцию SQLite. И постепенно (переносятся только измененные страницы).
Или rqlite библиотека.
Последний требует установки языка Go.
Нет, базы данных sqlite по умолчанию не всегда согласованы. Однако поиск по «файлу копии sqlite» обнаружил страницу на резервное копирование онлайн с помощью SQLite, который, как я подозреваю, покроет все ваши проблемы.
Предыдущие ответы верны.
Но если вы на 100% уверены, что в вашей базе данных есть только операции чтения, вы можете безопасно взять любую копию файла базы данных. Я делал это в производственном приложении целую вечность без проблем (cp, tar, rsync, scp, sftp). Файл базы данных настроен только для чтения на уровне ОС (chmod a-w), и попытки записи в базу данных выдают ошибку
Error: attempt to write a readonly database
пока все выбирает нормально работает.
Тогда, конечно, этот подход может быть или не осуществим в отношении вашего приложения. Тот же подход можно использовать для предотвращения несанкционированной записи, такой как SQL-инъекция, в веб-приложении.
Пока транзакция не открыта, rsync базы данных будет в порядке.
Пока транзакция открыта, rsync базы данных приведет к повреждению. Причина: вы получите базу данных и сопровождающий ее файл журнала в немного другой момент времени, что нарушит согласованность, которая позволила бы SQLite согласовать журнал с базой данных. Если SQLite не может согласовать журнал с базой данных, база данных останется в несогласованном состоянии без возможности определить, что было частью частично примененной транзакции.
Чтобы иметь возможность rsync для базы данных SQLite, вам необходимо:
Используйте собственные команды интерфейса командной строки SQLite для создания резервной копии файла базы данных. Это будет ждать, чтобы получить блокировку записи, и скопировать файл, а затем снять блокировку записи, тем самым гарантируя частичное применение транзакций. Затем выполните синхронизацию копии.
.backup ?DB? file
Или завершите все процессы, использующие базу данных SQLite, пока выполняете rsync.