Skip to content

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,数据会缺失、看不到表。

.dump sql导出不受wal影响;二进制文件备份必须三个文件一起复制,或者先执行 checkpoint。

sql
PRAGMA wal_checkpoint(FULL); -- 把wal全部合并进主db文件

执行完 checkpoint,wal 文件会清空,此时复制 db 文件就足够。


排查步骤,照着一步步做

  1. 退出 sqlite3,命令行,明确指定你的数据库文件名打开
bash
sqlite3 my.db
  1. 立刻执行
.tables

✅ 如果这里能看到表:你的原始库没问题,只是刚才备份时连错库。 ❌ 如果这里看不到表:你的原始库本身就出问题。

  1. 确认 dump.sql 文件大小和内容
bash
cat dump.sql

看有没有 CREATE TABLE

  1. 恢复测试:拿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 不带文件名就开始操作,那是临时内存库,退出全部丢失。