Skip to content

sqldiff.exe 比较SQLite数据库

官方工具包配套,对比两个 SQLite 数据库文件,输出可以把库A变成库B的SQL补丁脚本

注意顺序:sqldiff A.db B.db → 输出SQL执行后,A就变成B的数据状态

输出内容包含:INSERT / UPDATE / DELETE,可以直接拿去执行做数据同步、比对备份差异、校验备份是否完整。

基础命令

cmd
:: 直接控制台输出差异SQL
sqldiff.exe a.db b.db

:: 将差异保存为补丁sql文件(最常用)
sqldiff.exe a.db b.db > patch.sql

得到的 patch.sql 可以应用到 a.db:

cmd
sqlite3.exe a.db < patch.sql

常用参数示例

cmd
# 只对比某一张表,忽略其他表
sqldiff.exe --table test_user a.db b.db > diff_user.sql

# 只看表结构差异,不对比数据
sqldiff.exe --schema a.db b.db

# 只输出变更行数统计,不输出完整SQL
sqldiff.exe --summary a.db b.db

# 输出SQL包裹在事务里,执行要么全部成功要么失败
sqldiff.exe --transaction a.db b.db > patch.sql

# 使用表主键匹配行(推荐,避免依赖rowid)
sqldiff.exe --primarykey a.db b.db > patch.sql

实操小例子

  1. test1.db 原始库
  2. 复制一份得到 test2.db,修改几条数据、新增几条记录
  3. 执行
cmd
sqldiff.exe test1.db test2.db > diff.sql

diff.sql 里面会自动生成对应的 UPDATE / INSERT / DELETE。 把 diff.sql 导入 test1.db,test1的数据就和 test2 一模一样。

Windows批处理小脚本 diff_db.bat

batch
@echo off
chcp 65001 >nul
set "DB1=origin.db"
set "DB2=backup.db"
set "OUT=diff_patch.sql"

sqldiff.exe --transaction --primarykey "%DB1%" "%DB2%" > "%OUT%"
echo 差异脚本输出:%OUT%
echo 查看文件
notepad "%OUT%"

重要坑点

  1. 顺序不要搞反sqldiff A B:生成补丁把 A → B;反过来会得到反向删除插入。

  2. 默认依靠 rowid 匹配行;有显式主键的表建议加上 --primarykey,否则rowid发生变化时比对错乱。

  3. 只对比数据内容,不能处理ALTER TABLE改字段这种DDL变更;表结构改动,--schema 仅能提示差异,不会生成ALTER语句。

  4. 虚拟表(FTS等)需要加参数 --vtab 才能正常对比。

  5. 大库对比会扫描全部数据,IO开销大,避开业务高峰。

SQLite官方四件套完整总结

工具核心用途
sqlite3.exe交互式客户端,执行SQL、.dump.read
sqlite3_rsync.exe不停机一致性快照备份,本地/SSH远程增量复制db文件
sqlite3_analyzer.exe分析数据库存储、页碎片、表/索引空间占用报告
sqldiff.exe对比两个库,输出SQL补丁脚本,做数据差异比对

使用场景建议:

  • 备份校验:备份完一份db,用 sqldiff 对比原库与备份库,确认数据一致;
  • 两套环境数据比对;
  • 做简单数据同步(小库适用,百万级以上比较会慢)。