使用 Litestream 同步 sqlite数据库

7 min read

存储服务

docker run -p 9000:9000 -p 9001:9001 minio/minio server /data --console-address ":9001"

Username: minioadmin
Password: minioadmin

//create a bucket mybkt

创建数据库

sqlite3 fruits.db

复制数据库

export LITESTREAM_ACCESS_KEY_ID=minioadmin
export LITESTREAM_SECRET_ACCESS_KEY=minioadmin

litestream replicate fruits.db s3://mybkt.localhost:9000/fruits.db

你应该看到Litestream打印一些初始化命令,然后无限期地等待。

通常情况下,Litestream是作为后台服务运行的,所以它持续观察你的数据库是否有新的变化,所以该命令不会退出。

恢复数据库

export LITESTREAM_ACCESS_KEY_ID=minioadmin
export LITESTREAM_SECRET_ACCESS_KEY=minioadmin
litestream restore -o fruits2.db s3://mybkt.localhost:9000/fruits.db


流式备份恢复原理

SQLite 有一个名为 "WAL"(预写日志)的日志模式。它首先将数据库页面的变化写入一个单独的 -wal 文件,然后再将这些页面复制回主数据库文件。这让 SQLite 提供了安全的原子事务,因为如果一个事务被回滚,它可以简单地删除 WAL。如果页面直接写入数据库文件,那么在回滚时就没有办法取回原始的页面数据。WAL 也允许读事务在事务开始时有自己的数据库快照视图,因为同一数据库页面可以有多个实例分布在数据库文件和 WAL 中。然而,WAL 不断增长,所以最终页面必须被移回数据库文件,以便 WAL 可以重新开始记录。这个过程被称为 检查点,只有在没有事务的情况下才能进行。这就是 Litestream 复制 SQLite 的关键所在。