在使用SQLite做项目开发时,经常遇到需要备份数据库、迁移环境或者查看整个库结构的场景。SQLite内置的.dump命令正是为此设计的,它可以把数据库中的所有对象(表、索引、触发器、视图)和数据,完整地转换成一份SQL脚本文件。这份脚本拿到任何支持SQLite的环境里执行一遍,就能还原出一模一样的数据库。本文将从基本用法、导出内容结构、条件导出和常见问题几个方面,详细讲解.dump的使用方法。

.dump命令的基本用法
.dump是SQLite命令行工具sqlite3中的一个点命令,所谓点命令,就是以点号开头、不需要分号结尾、由命令行程序本身解析的指令。它有两种常见的执行方式。
第一种是交互式方式。先在终端启动sqlite3并打开数据库文件,然后直接输入.dump,所有SQL语句会打印到标准输出:
# 打开数据库
sqlite3 mydata.db
# 在交互模式中执行
sqlite> .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER
);
INSERT INTO users VALUES(1,'张三',25);
INSERT INTO users VALUES(2,'李四',30);
COMMIT;
第二种是批处理方式,直接在shell中执行并把输出重定向到文件,这是实际工作中最常用的写法:
# 把整个数据库导出到backup.sql文件 sqlite3 mydata.db .dump > backup.sql
这种写法的好处是可以写进定时任务脚本,比如配合crontab实现每天自动备份。导出的文件是纯文本,可以直接用任何编辑器打开查看,也可以直接压缩归档,占用空间比原始数据库文件小得多。
导出的SQL脚本如何还原数据库
.dump生成的脚本是一份自包含的SQL文件,开头通常是PRAGMA foreign_keys=OFF;和BEGIN TRANSACTION;,中间依次是CREATE TABLE、CREATE INDEX等建表语句,之后是按行生成的INSERT语句,最后以COMMIT;结尾。整个脚本包在一个事务里执行,保证了还原过程的原子性。
还原数据库非常简单,把脚本通过管道或read命令喂给一个新的sqlite3会话即可:
# 方式一:使用管道 sqlite3 newdata.db < backup.sql # 方式二:使用.read命令还原 sqlite3 newdata.db sqlite> .read backup.sql
需要注意的一点是,目标数据库最好是一个空库或者不存在的文件。如果目标库中已经存在同名表,脚本中的CREATE语句会报错。虽然这不会中断整个还原过程(SQLite会跳过报错继续执行后面的INSERT),但可能导致数据重复插入。因此在还原前建议先确认目标库状态,或者干脆删除旧文件重新创建。
另外,脚本开头的PRAGMA foreign_keys=OFF;是有意为之的。因为导出的INSERT顺序不一定满足外键约束的先后关系,关闭外键检查可以让还原顺利完成,执行完毕后SQLite会自动恢复默认设置,不会影响后续操作。
只导出部分表以及进阶技巧
.dump后面可以跟表名参数,只导出指定的表,这在只需要迁移个别表的场景下很实用:
# 只导出users表和orders表 sqlite3 mydata.db ".dump users orders" > partial.sql
如果需求更复杂,比如只导出满足条件的数据,.dump本身不支持WHERE条件,这时可以换一种思路:先创建一个临时数据库,把符合条件的数据复制过去,再对临时库执行dump:
# 利用ATTACH把筛选后的数据复制到临时库再导出 sqlite3 mydata.db "ATTACH DATABASE 'tmp.db' AS tmp; CREATE TABLE tmp.users AS SELECT * FROM users WHERE age > 18;" sqlite3 tmp.db .dump > filtered.sql rm tmp.db
还有一种常见的坑需要提醒:如果数据表中包含BLOB二进制字段,dump生成的INSERT语句会把二进制数据转成十六进制字面量(类似X'89504E47'的形式),这本身没有问题,但导出的脚本体积会明显膨胀。对于包含大量图片、附件的数据库,建议改用VACUUM INTO或者直接复制数据库文件的方式做备份,效率更高:
# SQLite推荐的单文件备份方式 sqlite3 mydata.db "VACUUM INTO 'backup_copy.db';"
最后补充一个与.dump对应的反向操作:如果想在导出时顺便压缩,可以配合管道使用gzip:sqlite3 mydata.db .dump | gzip > backup.sql.gz,还原时再通过gunzip解压喂给sqlite3即可,这套组合在备份体积和可读性之间取得了不错的平衡。
使用中的注意事项
第一,.dump是在命令行工具层面实现的,不是SQL语法的一部分,因此不能通过程序中的SQL接口(比如各语言驱动执行的execute方法)调用它。在代码里如果要实现类似功能,可以调用sqlite3的备份API,或者通过shell调用sqlite3命令。
第二,dump过程中数据库会被读取,如果同时有大量写入操作,虽然SQLite的锁机制能保证读到一致的数据,但最好还是在业务低峰期执行,避免长时间持锁影响其他会话。
第三,导出的脚本默认使用UTF-8编码,如果目标环境的终端或工具编码不一致,中文数据可能出现乱码。遇到这种情况,确认执行还原的sqlite3版本和终端编码都是UTF-8即可解决。
总体来说,.dump配合管道重定向,是SQLite最经典也最可靠的逻辑备份方案,掌握它之后,无论是日常备份、版本迁移还是把数据发给他人排查问题,都能轻松应对。
SQLite dump数据库导出SQL脚本修改时间:2026-09-02 21:35:01