存储服务
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 的关键所在。