Navicat历史执行记录默认仅内存保存,重启即丢失;需手动开启Tools→Options→Environment→Query History中的Save query history并设路径才能持久化,且仅保存F6或“运行全部”执行的SQL文本。
Navicat 历史执行记录默认不持久保存
navicat 的「查询」窗口里点过的 sql、按过的历史按钮(上下箭头)、甚至关掉再重开,大概率都找不回来了——它默认只存在内存里,没写进磁盘。这不是 bug,是设计如此。历史记录只在当前会话存活,重启软件或切换连接后清空。
- 真正能找回的,只有
Query History面板里手动勾选了Save query history并设置了保存路径的情况 - 该选项藏在
Tools → Options → Environment → Query History,默认是关闭的 - 即使开启,也只保存你主动点击「执行」(F6)或「运行全部」的语句,Ctrl+Enter 或右键执行不会计入
- 保存的是纯文本文件(
.sql),不带时间戳、不带连接上下文、不区分数据库名
从 navicat.conf 或本地 SQLite 数据库里硬挖
Navicat 15+ 把部分操作元数据存在本地 SQLite 文件中,不是所有版本都支持,也不是所有操作都会记——但它比内存历史更“耐折腾”。关键路径和字段得对上:
- Windows:检查
%AppData%\PremierSoft\Navicat Premium\profiles\default\navicat.conf,里面可能有last_query这类键,但值是 Base64 编码的,需解码 - macOS:对应路径是
~/Library/Application Support/PremierSoft/Navicat Premium/profiles/default/navicat.conf - 更靠谱的是查
navicat.db(如果存在),用命令行 sqlite3 打开:sqlite3 navicat.db "SELECT sql_text FROM query_history ORDER BY created_time DESC LIMIT 20;" - 注意:这个表结构随 Navicat 版本变,v16 后字段名可能是
query_text而非sql_text,直接 SELECT 报错就试试 DESCRIBE
用系统级日志或第三方工具补位
当 Navicat 自身不留痕,就得往外找。前提是你的数据库服务端开了日志,或者你愿意装轻量监控工具:
- MySQL:确认
general_log = ON,日志路径在general_log_file配置项里,内容是明文 SQL + 时间戳,但体积增长快,别长期开着 - PostgreSQL:需设置
log_statement = 'all'+logging_collector = on,日志在log_directory下,按天滚动 - 不想动服务端?可以开个
tcpdump抓包(tcpdump -i lo port 3306 -w mysql.pcap),再用 Wireshark 过滤 MySQL 协议解析 SQL —— 仅限本地调试,生产慎用 - Navicat 自带的「SQL Log」功能(
Tools → SQL Log)只记录当前连接的收发,不跨会话,且默认关闭
预防性配置:让下次不用再翻箱倒柜
与其事后抢救,不如把「可追溯」变成默认动作。以下三项改完,下次执行 SQL 就自动落盘:
- 打开
Tools → Options → Environment → Query History,勾选Save query history,并指定一个你记得住的路径(比如D:\navicat-history\) - 在同一页勾选
Include timestamp in saved queries,否则所有文件都叫query_001.sql,没法分清哪条是昨天改的 - 给常用连接单独配「自动保存查询」:右键连接 →
Edit Connection → Advanced → Save queries automatically,这里存的是该连接下的执行快照,和全局历史分开 - 注意:
Save query history不等于「自动备份」,它不存结果集、不存错误信息、不存变量绑定值——只是 SQL 文本快照
最常被忽略的一点:Navicat 的「历史」和「已保存的查询」(Saved Queries)是两套系统。前者是执行痕迹,后者是你手动存的 .sql 文件,别指望在「Saved Queries」目录里翻出上周随手敲的那条 UPDATE。










