Cursor 的 state.vscdb 太大:是什么塞满了它,以及怎么安全瘦身
几十 GB 的聊天状态,以及在释放磁盘的同时保住对话记录的办法
常见现象:重启后 Cursor 一直卡在“Loading chats”,新开对话发第一条消息就转圈,一查 globalStorage 发现占了 30、50 甚至 125 GB。这里面几乎全是同一个文件:state.vscdb,而这个文件里几乎全是聊天状态。
state.vscdb 之前:Cursor 没有归档机制,为了腾空间删掉的任何对话都会永久消失。先用 deja-vu 建一份索引:它通过 sqlite3 只读读取 state.vscdb,在你瘦身或重置数据库之后,仍然在本地保留所有历史对话的可搜索索引。文件在哪里
# macOS ~/Library/Application Support/Cursor/User/globalStorage/state.vscdb # Linux ~/.config/Cursor/User/globalStorage/state.vscdb # Windows %APPDATA%\Cursor\User\globalStorage\state.vscdb
它是一个 SQLite 数据库。对话存在 cursorDiskKV 表里:每个会话一条 composerData:<id>,每条消息一条 bubbleId:<chat>:<bubble>,再加上 Agent 检查点和大对象的 checkpointId: 与 agentKv:。删除 Cursor 聊天记录那一页有完整的表结构说明。
先不改文件,只读查出是谁占了空间
退出 Cursor,或者直接带 -readonly 查询。两条查询都会扫全表,50 GB 的文件大约需要几分钟。
看哪一类键占了空间:
sqlite3 -readonly state.vscdb "
SELECT substr(key, 1, instr(key, ':') - 1) AS kind, count(*),
round(sum(length(CAST(value AS BLOB))) / 1e9, 2) AS gb
FROM cursorDiskKV GROUP BY kind ORDER BY gb DESC;"
看具体是哪几个会话占得最多:
sqlite3 -readonly state.vscdb "
SELECT substr(key, 10, 36) AS chat, count(*) AS messages,
round(sum(length(CAST(value AS BLOB))) / 1e6) AS mb
FROM cursorDiskKV WHERE key LIKE 'bubbleId:%'
GROUP BY chat ORDER BY mb DESC LIMIT 15;"
再查出某个会话的标题,方便在 Cursor 列表里找到它:
sqlite3 -readonly state.vscdb " SELECT json_extract(value, '$.name') FROM cursorDiskKV WHERE key = 'composerData:<chat id>';"
通常结果都是少数几个极长的 Agent 会话占掉了大半个文件,而不是几千个小对话。
按最安全的顺序瘦身
- 如果有
state.vscdb.backup,先删它。Cursor 早就不再更新这个文件了,它只是残留的旧副本,有时超过 10 GB;退出 Cursor 后直接删掉,不会碰任何聊天记录。 - 在 Cursor 界面里删掉最大的几个会话。通过界面删除能让 Cursor 自己清理关联行;在 Cursor 运行时直接用 SQL 改表,往往会把窗口状态一起搞坏。
- 触发回收。命令面板里的
Delete old chats…可以批量删旧对话,开发者命令GC Agent KV Blobs会清理不再被任何会话引用的大对象。注意:在旧版创建的数据库上,删除行释放的空间仍留在文件内部,压实(VACUUM/compaction)需要接近数据库本身甚至两倍大小的可用磁盘空间。 - 彻底重建。退出 Cursor,把
state.vscdb、state.vscdb-wal和state.vscdb-shm移到别的目录(先别进废纸篓),再启动 Cursor:它会建一个全新的空库。确认旧库里没有什么遗漏之前,先留着备份文件。
保住你删掉的那些对话
无论用哪种方式瘦身,里面那些对话都是你排查问题、跑通命令的记录,而 Cursor 自己没有归档。
deja-vu 通过 sqlite3 只读索引 Cursor 的对话,并和本机上 Claude Code、Codex 等其他智能体的历史放进同一个本地索引。已经被索引过的对话,就算从 state.vscdb 里删掉甚至整个数据库被移走,依然能搜到。所以在动手清理前先跑一次:
deja index deja "pgbouncer" # 从 Cursor 删掉之后依然能搜出那次对话
在直接运行 deja 打开的全屏界面里,你随时能翻阅这段对话,或者按 o 把它的上下文带进另一个智能体继续做。
删除 Cursor 的聊天记录 · 各个工具把历史存在哪里 · 给 Cursor 加上跨工具记忆
觉得有用?欢迎在 GitHub 上给 deja-vu 点颗 Star。