sqlite3_rsync.exe 同步 SQLite 数据库
SQLite 官方配套工具(在 sqlite‑tools‑win‑x64.zip 包里),专门用来安全复制/同步 SQLite 数据库文件,类似 rsync,但理解 SQLite 数据库页结构,普通文件 rsync 做不到事务一致性。
核心作用
普通 rsync /直接拷贝 db 文件风险:源库正在被程序读写,复制出来的文件是损坏、半事务碎片。 sqlite3_rsync.exe:数据库页级别增量快照复制,拿到源库某一瞬间完整一致快照,只传输发生变更的数据库页,节省带宽,源库可以业务不停机(程序继续读写源库)。
⚠️它做一次性快照备份,不是持续实时主从复制;执行那一刻的状态复制过去,运行中新写入源库的数据不会自动同步到副本。
支持两种场景:
- 本地→本地:本机把 a.db 复制成备份副本 b.db
- 本地 ↔ SSH远程机器:通过 SSH,把远程服务器 sqlite db 拉到本地,或本地推到远程服务器;两端都需要有 sqlite3_rsync 程序。
和几种备份手段对比
| 方式 | 特点 |
|---|---|
| 直接复制 db 文件 | 源库有写入时极易损坏副本,需要先 checkpoint、停止写入 |
.dump SQL导出 | 文本完整备份,大库慢;可以跨版本迁移 |
| rusqlite backup API | 代码内热备份,本地库之间,不能远程 |
| sqlite3_rsync.exe | 页级增量,不停业务拿一致性快照;支持SSH远程;两端都要有该工具 |
本地简单示例(Windows)
cmd
:: 本地:把 test.db 同步生成副本 test_backup.db
sqlite3_rsync.exe test.db test_backup.dbSSH远程示例:
cmd
:: 远程服务器 user@server 的 /data/test.db 拉取到本地
sqlite3_rsync.exe user@server:/data/test.db ./local_copy.db重要限制
- 不是实时同步:执行完成得到一份快照;后续源库更新,不会自动同步,需要再次运行命令。
- SSH模式,远程机器也必须部署 sqlite3_rsync,否则无法工作。
- 同步过程中源库继续写入,这部分新数据不会进入本次副本,副本是命令启动瞬间的快照。
- 副本(replica)同步完成后是完整可用 sqlite 文件,可以直接 sqlite3.exe 打开。
你日常测试怎么选
- 小库、迁移:
.dump+.readSQL导出导入最省事,无依赖。 - 大库本地热备份:
sqlite3_rsync.exe本地复制,或者 rusqlite backup API。 - 需要远程服务器拿SQLite备份:
sqlite3_rsync.exe+ SSH。 - 不要直接复制 db‑wal 模式下的裸文件,很容易拿到损坏副本。
补充同目录另外两个工具:
sqldiff.exe:对比两个sqlite数据库差异,输出差异SQLsqlite3_analyzer.exe:分析数据库、表、索引占用页大小统计
Windows bat 脚本:sqlite3_rsync 定时快照备份
功能:
- 使用
sqlite3_rsync.exe做一致性快照备份,业务不需要停; - 按时间戳生成备份文件;
- 保留最近 N 份备份,自动删除老旧备份,防止磁盘占满;
- 输出简单日志;
- 适合 Windows 任务计划程序定时调用。
前提:
- 把
sqlite3_rsync.exe和 bat 放在同一个目录;- 源数据库建议开启 WAL 模式,
sqlite3_rsync会自动处理 wal,不需要手动 checkpoint。
backup_sqlite.bat
batch
@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
:: ====================== 配置区,请修改这里 ======================
set "SOURCE_DB=D:\data\test_big.db" :: 你的源数据库路径
set "BACKUP_DIR=D:\data\sqlite_backup" :: 备份存放目录
set "KEEP_COUNT=10" :: 保留最近多少个备份
set "RSYNC_EXE=%~dp0sqlite3_rsync.exe"
:: =================================================================
:: 创建备份目录
if not exist "%BACKUP_DIR%" mkdir "%BACKUP_DIR%"
:: 时间戳 YYYYMMDD_HHMMSS
for /f "delims=" %%a in ('wmic os get localdatetime ^| find "."') do set dt=%%a
set "TS=!dt:~0,8!_!dt:~8,6!"
set "BACKUP_FILE=%BACKUP_DIR%\backup_!TS!.db"
set "LOG=%BACKUP_DIR%\backup.log"
echo ====================================== >>%LOG%
echo 开始备份:!date! !time! >>%LOG%
echo 源库: %SOURCE_DB%
echo 输出: %BACKUP_FILE%
:: 执行 sqlite3_rsync 快照复制
"%RSYNC_EXE%" "%SOURCE_DB%" "%BACKUP_FILE%"
if !errorlevel! equ 0 (
echo 备份成功:%BACKUP_FILE% >>%LOG%
) else (
echo 【错误】备份失败,errorlevel=!errorlevel! >>%LOG%
echo ====================================== >>%LOG%
exit /b 1
)
:: 清理旧备份:只保留最新 KEEP_COUNT 个
echo 清理旧备份,保留 %KEEP_COUNT% 个 >>%LOG%
pushd "%BACKUP_DIR%"
for /f "skip=%KEEP_COUNT% delims=" %%f in ('dir /b /o-d backup_*.db 2^>nul') do (
echo 删除旧备份:%%f >>%LOG%
del "%%f"
)
popd
echo 备份流程完成 >>%LOG%
echo ====================================== >>%LOG%
echo.使用说明
- 修改脚本开头
SOURCE_DB、BACKUP_DIR指向你真实数据库; - 将
sqlite3_rsync.exe和backup_sqlite.bat放在同一个文件夹; - 双击测试运行一次,看
sqlite_backup目录是否生成backup_20260906_221011.db; - 校验备份是否可用:
cmd
sqlite3.exe D:\data\sqlite_backup\backup_20260906_221011.db ".tables"能看到表,代表备份文件完好。
设置 Windows 任务计划程序(定时自动跑)
- Win+R →
taskschd.msc打开任务计划程序 - 创建基本任务
- 触发器:每天/每小时,按需设置;
- 操作:启动程序
- 程序或脚本:选
backup_sqlite.bat - 起始于(可选):填写 bat 所在目录,非常重要,否则找不到 sqlite3_rsync.exe。
重要注意事项
sqlite3_rsync.exe是快照复制,只复制运行那一刻的数据,不是实时同步;需要持续备份就靠任务计划反复调用。- 源库正在读写也没关系,它内部拿到一致性快照,副本不会损坏。
- 如果数据库很大,单次备份会占用对应磁盘IO;避开业务高峰时间。
- 日志文件
backup.log会持续追加,长期运行可以再加一个日志轮转逻辑,或者定期清空。
可选变体:同时生成一份 dump sql 备份(双重保险)
如果你希望除了二进制快照,额外生成 .dump SQL备份,可以在 bat 后面追加一段,需要 sqlite3.exe:
batch
:: 额外导出dump sql备份
set "DUMP_FILE=%BACKUP_DIR%\backup_!TS!.sql"
"%~dp0sqlite3.exe" "%SOURCE_DB%" ".output !DUMP_FILE!" ".dump" ".output stdout"
echo SQL dump 已生成: !DUMP_FILE! >>%LOG%二进制
sqlite3_rsync备份恢复直接复制 db 文件即可;sql dump 需要.read导入。