SQLite备份完 .dump 之后命令行看不到表
现象:执行完
.output dump.sql+.dump+.output stdout,.tables看不到表,或者打开 dump.sql 看里面有表,但当前库没表。
先理清楚最常见 3 个原因:
原因1:你打开错数据库文件(最高概率)
.dump 是把当前已经打开的db导出到 dump.sql; 导出本身不会修改当前数据库!导出之后原库表还在。
错误操作示例
bash
# 进入 sqlite3,没指定db!打开了一个临时内存数据库!
sqlite3
sqlite> .output dump.sql
sqlite> .dump
sqlite> .output stdout
sqlite> .quit👉 你连的是临时内存空库,dump出来是空的;你以为备份了你的业务库,实际啥也没备份。
✅ 正确进入方式:启动时带上数据库文件名
bash
sqlite3 mydata.db
sqlite> .tables # 先确认!这里能看到你的表,再执行备份
sqlite> .output dump.sql
sqlite> .dump
sqlite> .output stdout
sqlite> .quit第一步一定要先
.tables确认表存在,再备份。
原因2:你执行了 .read dump.sql,但是打开错db
bash
sqlite3 other.db # 新建/打开了另外一个空库
sqlite> .read dump.sql如果 dump.sql 本身是空,导入完自然没有表。
校验 dump.sql 文件本身
直接打开 dump.sql,看文件内容:
- 文件开头是否有
CREATE TABLE xxx(语句? - 如果文件几乎为空,说明刚才备份的时候,当前 sqlite3 会话里本来就没有表。
原因3:WAL模式,复制文件备份方式踩坑(如果你是直接拷贝db文件)
如果你不是用 .dump,而是直接复制 mydata.db: WAL模式下有三个文件:
mydata.db
mydata.db-wal
mydata.db-shm只复制 db 文件,不复制 wal/shm,数据会缺失、看不到表。
用
.dumpsql导出不受wal影响;二进制文件备份必须三个文件一起复制,或者先执行 checkpoint。
sql
PRAGMA wal_checkpoint(FULL); -- 把wal全部合并进主db文件执行完 checkpoint,wal 文件会清空,此时复制 db 文件就足够。
排查步骤,照着一步步做
- 退出 sqlite3,命令行,明确指定你的数据库文件名打开
bash
sqlite3 my.db- 立刻执行
.tables✅ 如果这里能看到表:你的原始库没问题,只是刚才备份时连错库。 ❌ 如果这里看不到表:你的原始库本身就出问题。
- 确认 dump.sql 文件大小和内容
bash
cat dump.sql看有没有 CREATE TABLE。
- 恢复测试:拿dump.sql导入到全新库测试
bash
sqlite3 test_restore.db < dump.sql
sqlite3 test_restore.db ".tables"如果 test_restore.db 能看到表,说明备份文件没问题,只是你操作时打开数据库搞错。
标准安全备份完整会话(复制粘贴)
bash
sqlite3 my.db
.tables
.output dump.sql
.dump
.output stdout
.quit恢复
bash
sqlite3 new.db < dump.sql补充:如果你愿意,把你执行的全部命令,以及
.tables的输出发给我,可以直接定位问题。
小坑提醒
.output dump.sql只是把输出写到文件,不会清空、不会修改当前数据库。备份操作本身不会删除表。- 只有
.read dump.sql才会执行sql修改数据库。 - 千万不要直接
sqlite3不带文件名就开始操作,那是临时内存库,退出全部丢失。