Инструмент удалённой копии базы данных для SQLite
Содержание
1. Обзор
Следующая команда делает REPLICA копией ORIGIN:
$ sqlite3_rsync ORIGIN REPLICA ?OPTIONS?
Используйте флаг --help или -? для просмотра полного списка опций. Флаги опций могут быть перед, после или между аргументами ORIGIN и REPLICA.
Добавьте опцию -v для получения большего вывода, в формате, аналогичном "rsync".
2. Функциональные возможности
- Один из ORIGIN или REPLICA может быть в формате "USER@HOST:PATH". Другой — просто PATH. Эта утилита делает REPLICA копией ORIGIN.
Если REPLICA еще не существует, он создается.
ssh используется для связи, поэтому "USER@HOST" может быть псевдонимом SSH.
Не обязательно, чтобы один из ORIGIN или REPLICA был удалённым. Утилита sqlite3_rsync работает правильно, если ORIGIN и REPLIA оба локальные.
-
Обе базы данных могут быть «активными» во время работы этой утилиты. Другие программы могут иметь активные подключения к базам данных на обоих концах во время работы этой утилиты. Другие программы могут записывать в ORIGIN и читать из REPLICA во время работы этой утилиты.
REPLICA становится копией моментального снимка ORIGIN, существовавшего в момент запуска команды sqlite3_rsync. Если другие процессы изменят содержимое ORIGIN во время работы этой команды, эти изменения будут применены к ORIGIN, но не переданы в REPLICA. Таким образом, REPLICA в конечном итоге становится полностью согласованным снимком ORIGIN в определенный момент времени.
Синхронизация использует протокол с эффективным использованием пропускной способности, аналогичный rsync (откуда и происходит его название).
3. Ограничения
Файлы базы данных должны оба быть в режиме WAL и иметь одинаковый размер страницы.
Во время работы sqlite3_rsync REPLICA является только для чтения. Запросы могут выполняться в REPLICA во время работы этой утилиты, но не транзакции записи.
Для каждой вызова этой утилиты синхронизируется только одна база данных. Пока что невозможно синхронизировать несколько разных баз данных с помощью подстановочных знаков, как в стандартном "rsync".
По крайней мере, одна из ORIGIN или REPLICA должна находиться на локальном компьютере. Они не могут быть обе базами данных на других компьютерах.
На удалённой системе эта утилита должна быть установлена в одном из каталогов по умолчанию в $PATH для SSH. Каталог
/usr/local/binчасто является хорошим выбором. В качестве альтернативы можно использовать флаг--exe NAME, чтобы указать удаленное расположение исполняемого файла, например--exe /opt/bin/sqlite3_rsync.-
Реплика будет очень похожей копией оригинала, но не точной копией. Всё содержимое таблиц (и индексов) в реплике будет полностью идентичным в байтовом представлении. Однако могут быть незначительные изменения в заголовке базы данных. В частности, у реплики будут следующие отличия от оригинала:
Счётчик изменений в байтах с 24 по 27 в заголовке базы данных может быть инкрементирован в реплике.
Число версий, для которых действует заголовок (valid-for number) в байтах с 96 по 99 заголовка базы данных, будет номером версии программы sqlite3_rsync, которая создала копию, а не номером версии последнего записывающего процесса в оригинальной базе данных.
В Windows однобуквенный HOST без префикса USER@ будет интерпретирован как буква диска Windows, а не как имя хоста.
4. Как установить
Установите sqlite3_rsync, просто поместив исполняемый файл куда-нибудь в ваш $PATH. Если вы синхронизируетесь с удалённой системой, исполняемый файл sqlite3_rsync должен быть установлен как на локальном, так и на удалённом компьютере. При установке исполняемого файла sqlite3_rsync на удалённой системе убедитесь, что он находится в $PATH, используемом SSH. Помещение файла sqlite3_rsync в каталог /usr/local/bin часто является хорошим выбором.
К сожалению, в MacOS по умолчанию PATH для ssh — это "/usr/bin:/bin:/usr/sbin:/sbin", и MacOS не позволяет добавлять новые программы в эти каталоги. Поэтому, если вы пытаетесь синхронизироваться с удалённым Mac, вам нужно добавить аргумент командной строки --exe к sqlite3_rsync, чтобы указать расположение, где вы установили sqlite3_rsync на удалённой стороне. Например:
sqlite3_rsync sample.db mac:sample.db --exe /Users/xyz/bin/sqlite3_rsync
Автор этого документа никогда не добивался успеха в запуске SSHD в Windows. Возможно, он разберётся с этим и предоставит инструкции по синхронизации базы данных с удалённой машины Windows в будущей версии.
5. Пропускная способность сети
Протокол предусматривает, что реплика отправляет криптографический хэш каждой своей страницы на сторону оригинала, а затем оригинал отправляет полное содержимое любой страницы, для которой хэш не совпадает.
Предположим, реплика содержит R страниц. Если реплика и оригинал уже идентичны, то примерно R*20 байт хэшей отправляются от реплики к оригиналу, и, помимо некоторой незначительной накладных расходов и служебного трафика, ничего больше не передаётся по сети. Таким образом, для баз данных с размером страницы 4096 байт минимальная пропускная способность, необходимая для работы этой утилиты, эквивалентна примерно 0,5% размера базы данных. Наихудшая синхронизация происходит, если реплика и оригинал полностью разные и не имеют общих страниц. В этом случае общий сетевой трафик составляет около 100,5% от размера базы данных.
Вычисления в предыдущем абзаце не учитывают сжатие, реализованное SSH. Большинство баз данных SQLite сжимаемы, поэтому затраты на пропускную способность при полной синхронизации, вероятно, будут меньше 100,5% от размера базы данных. Однако криптографические хэши страниц не сжимаются, поэтому наилучший случай никогда не будет лучше приблизительно 0,5% от размера базы данных при размере страницы 4096 байт. Минимальная необходимая пропускная способность уменьшается с увеличением размера страницы. В наилучшем случае она составляет около 0,03% от размера базы данных для баз данных с размером страницы 65 536 байт.
6. Почему нельзя просто использовать обычный rsync?
Обычный rsync не понимает транзакций SQLite. Rsync сделает копию ORIGIN в REPLICA, однако копия может быть несовместимой. Части копии могут быть из одной транзакции, а другие — из другой. Копия базы данных может быть повреждённой.
Если во время работы rsync ни одна другая программа не будет подключена к базе данных, и база данных не имеет горячего журнала, то rsync создаст согласованную копию базы данных. Но если вы не можете гарантировать выполнение обоих этих условий, то rsync может создать повреждённую копию. С другой стороны, утилита sqlite3_rsync всегда создаёт согласованную копию.
SQLite is in the Public Domain.
https://sqlite.org/rsync.html