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-инъекция в веб-приложение.

Другие вопросы по тегам