Skip to content

sqlite3_rsync.exe 同步 SQLite 数据库

SQLite 官方配套工具(在 sqlite‑tools‑win‑x64.zip 包里),专门用来安全复制/同步 SQLite 数据库文件,类似 rsync,但理解 SQLite 数据库页结构,普通文件 rsync 做不到事务一致性。

核心作用

普通 rsync /直接拷贝 db 文件风险:源库正在被程序读写,复制出来的文件是损坏、半事务碎片。 sqlite3_rsync.exe数据库页级别增量快照复制,拿到源库某一瞬间完整一致快照,只传输发生变更的数据库页,节省带宽,源库可以业务不停机(程序继续读写源库)。

⚠️它做一次性快照备份,不是持续实时主从复制;执行那一刻的状态复制过去,运行中新写入源库的数据不会自动同步到副本。

支持两种场景:

  1. 本地→本地:本机把 a.db 复制成备份副本 b.db
  2. 本地 ↔ 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.db

SSH远程示例:

cmd
:: 远程服务器 user@server 的 /data/test.db 拉取到本地
sqlite3_rsync.exe user@server:/data/test.db ./local_copy.db

重要限制

  1. 不是实时同步:执行完成得到一份快照;后续源库更新,不会自动同步,需要再次运行命令。
  2. SSH模式,远程机器也必须部署 sqlite3_rsync,否则无法工作。
  3. 同步过程中源库继续写入,这部分新数据不会进入本次副本,副本是命令启动瞬间的快照。
  4. 副本(replica)同步完成后是完整可用 sqlite 文件,可以直接 sqlite3.exe 打开。

你日常测试怎么选

  • 小库、迁移:.dump + .read SQL导出导入最省事,无依赖。
  • 大库本地热备份:sqlite3_rsync.exe 本地复制,或者 rusqlite backup API。
  • 需要远程服务器拿SQLite备份:sqlite3_rsync.exe + SSH。
  • 不要直接复制 db‑wal 模式下的裸文件,很容易拿到损坏副本。

补充同目录另外两个工具:

  • sqldiff.exe:对比两个sqlite数据库差异,输出差异SQL
  • sqlite3_analyzer.exe:分析数据库、表、索引占用页大小统计

Windows bat 脚本:sqlite3_rsync 定时快照备份

功能:

  1. 使用 sqlite3_rsync.exe一致性快照备份,业务不需要停;
  2. 按时间戳生成备份文件;
  3. 保留最近 N 份备份,自动删除老旧备份,防止磁盘占满;
  4. 输出简单日志;
  5. 适合 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.

使用说明

  1. 修改脚本开头 SOURCE_DBBACKUP_DIR 指向你真实数据库;
  2. sqlite3_rsync.exebackup_sqlite.bat 放在同一个文件夹;
  3. 双击测试运行一次,看 sqlite_backup 目录是否生成 backup_20260906_221011.db
  4. 校验备份是否可用:
cmd
sqlite3.exe D:\data\sqlite_backup\backup_20260906_221011.db ".tables"

能看到表,代表备份文件完好。

设置 Windows 任务计划程序(定时自动跑)

  1. Win+R → taskschd.msc 打开任务计划程序
  2. 创建基本任务
    • 触发器:每天/每小时,按需设置;
    • 操作:启动程序
    • 程序或脚本:选 backup_sqlite.bat
    • 起始于(可选):填写 bat 所在目录,非常重要,否则找不到 sqlite3_rsync.exe。

重要注意事项

  1. sqlite3_rsync.exe 是快照复制,只复制运行那一刻的数据,不是实时同步;需要持续备份就靠任务计划反复调用。
  2. 源库正在读写也没关系,它内部拿到一致性快照,副本不会损坏。
  3. 如果数据库很大,单次备份会占用对应磁盘IO;避开业务高峰时间。
  4. 日志文件 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 导入。