Closed1

sqlite3_rsync雑記

黒ヰ樹黒ヰ樹

2024/10/21にリリースされたSQLite 3.47.0や2024/11/25にリリースされたSQLite 3.47.1にsqlite3_rsyncバイナリやsqlite3_rsync.exeバイナリが同梱されるようになったので試してみたけど言語化するのが難しかったためスクラップに投げておきます。

https://www.sqlite.org/rsync.html

sqlite-tools-win-x64-3470100.zipをダウンロード

https://www.sqlite.org/download.html

zipファイルを展開してコマンドプロンプトからSQLiteを起動

> sqlite3 origin.db

下準備

sqlite> PRAGMA journal_mode = WAL;
sqlite> PRAGMA synchronous = NORMAL;
sqlite> PRAGMA busy_timeout = 5000;
sqlite> PRAGMA cache_size = -20000;
sqlite> PRAGMA foreign_keys = ON;
sqlite> PRAGMA auto_vacuum = INCREMENTAL;
sqlite> PRAGMA temp_store = MEMORY;
sqlite> PRAGMA mmap_size = 2147483648;
sqlite> PRAGMA page_size = 8192;
sqlite> .exit

コピペ用SQL

PRAGMA journal_mode = WAL;
PRAGMA synchronous = NORMAL;
PRAGMA busy_timeout = 5000;
PRAGMA cache_size = -20000;
PRAGMA foreign_keys = ON;
PRAGMA auto_vacuum = INCREMENTAL;
PRAGMA temp_store = MEMORY;
PRAGMA mmap_size = 2147483648;
PRAGMA page_size = 8192;

walモードにするだけでいいけど下記参考にして色々つけた

https://briandouglas.ie/sqlite-defaults/

> sqlite3_rsync --help
sqlite3_rsync ORIGIN REPLICA ?OPTIONS?

One of ORIGIN or REPLICA is a pathname to a database on the local
machine and the other is of the form "USER@HOST:PATH" describing
a database on a remote machine.  This utility makes REPLICA into a
copy of ORIGIN

OPTIONS:

   --exe PATH    Name of the sqlite3_rsync program on the remote side
   --help        Show this help screen
   --ssh PATH    Name of the SSH program used to reach the remote side
   -v            Verbose.  Multiple v's for increasing output
   --version     Show detailed version information

これだけでも動く
同じフォルダにコピーされる

> sqlite3_rsync origin.db replica.db

rsyncっぽさがないのでSSHを有効にしたGitpodをで試す
SSHの鍵生成と公開鍵登録については割愛

https://gitpod.new/

ソースコード取ってきてビルドする

$ wget -q https://www.sqlite.org/2024/sqlite-src-3470100.zip
$ unzip -q sqlite-src-3470100.zip 
$ rm sqlite-src-3470100.zip
$ cd sqlite-src-3470100
$ ./configure
$ make sqlite3_rsync
$ mv sqlite3_rsync /workspace/empty/sqlite3_rsync
$ cd ..
$ rm -rf sqlite-src-3470100
$ ls -lah
total 4.9M
drwxr-xr-x 3 gitpod gitpod   39 Nov 30 13:44 .
drwxr-xr-x 7 gitpod gitpod   91 Nov 30 13:40 ..
drwxr-xr-x 7 gitpod gitpod  119 Nov 30 13:44 .git
-rwxr-xr-x 1 gitpod gitpod 4.9M Nov 30 13:42 sqlite3_rsync

これでよし
ビルドしたsqlite3_rsyncバイナリはダウンロードしておくとお得

再走1
$ wget -q https://www.sqlite.org/2024/sqlite-tools-linux-x64-3470100.zip
$ unzip -q sqlite-tools-linux-x64-3470100.zip
$ ./sqlite3_rsync --version
./sqlite3_rsync: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.38' not found (required by ./sqlite3_rsync)

sqlite-tools-linux-x64-3470100.zip内のバイナリではglibc 2.38以上が必要らしい
少なくともUbuntu 22.04ではそのまま動かなかったのでソースコードからビルドしました

Windowsのsshコマンドをいい感じに使ってくれるのでこれで動く
Gitpodのsqlite3_rsyncバイナリがあるフォルダにコピーされる

> sqlite3_rsync origin.db gitpodio-empty-00000000000@gitpodio-empty-00000000000.ws-us117.gitpod.io:/workspace/empty/replica.db --exe /workspace/empty/sqlite3_rsync

ただsshコマンドのオプションをsqlite3_rsyncコマンドに渡せないため秘密鍵が%USERPROFILE%\.ssh以外の場所にあると使えないように見える
そんなことはない
%USERPROFILE%\.ssh\configファイルで設定すればよい

config
Host gitpod
    HostName gitpodio-empty-00000000000.ws-us117.gitpod.io
    User gitpodio-empty-00000000000
    IdentityFile C:\Users\sqlite\Documents\path\to\id_ed25519

コマンドも短くなってお得

> sqlite3_rsync origin.db gitpod:/workspace/empty/replica.db --exe /workspace/empty/sqlite3_rsync

Verboseは-vではなく-vvにするとより詳しく分かる

> sqlite3_rsync origin.db gitpod:/workspace/empty/replica.db --exe /workspace/empty/sqlite3_rsync -vv
ssh -e none gitpod /workspace/empty/sqlite3_rsync --replica origin.db /workspace/empty/replica.db
sent 13 bytes, received 22 bytes, 23.10 bytes/sec
total size 4,096  speedup is 117.03

SQLite + rsync + SSH = GOD

https://zenn.dev/laiso/articles/70f58fa1ac7d0e

Litestreamの代わりになるかな……。

このスクラップは18日前にクローズされました