Navicat 本身不支持增量备份,其“备份”功能仅调用 mysqldump 生成全量 SQL 快照;真正增量需结合 MySQL binlog 手动截取,即 Navicat 全备 + mysqlbinlog 增量捕获配合实现。
navicat 本身不支持增量备份——它只能做全量导出(转储 sql 文件),所谓“增量”必须依赖 mysql 的 binlog 机制手动拼接。 直接在 navicat 界面点“备份”按钮,无论选多少选项,生成的都是完整快照,不是增量。
为什么不能只靠 Navicat 做增量
Navicat 的 转储 SQL 文件 功能本质是调用 mysqldump,输出的是 CREATE TABLE + INSERT 语句。它没有能力识别“上次备份后改了哪些行”,也不读取或解析 binlog。你看到的“增量备份”选项(如果某些版本有)只是 UI 误导,实际未生效。
- 所有 Navicat 导出的 .sql 文件都包含全部数据,反复导出会占用大量磁盘空间
- 即使勾选“仅结构”或“忽略数据”,也仍是全量逻辑快照,不是基于时间点或位置的增量切片
- Navicat 不提供
mysqlbinlog集成界面,无法自动定位start-position或过滤 DML 类型
真正可行的增量流程:Navicat 全备 + 手动 binlog 截取
把 Navicat 当作全量备份工具,把 mysqlbinlog 当作增量捕获工具,二者配合才是落地方案:
- 先用 Navicat 导出全量:
右键数据库 → 转储 SQL 文件 → 勾选“结构和数据” → 保存为 full_20260424.sql - 立即执行
SHOW MASTER STATUS;,记下File(如mysql-bin.000012)和Position(如154) - 后续每天执行:
mysqlbinlog --start-position=154 /var/lib/mysql/mysql-bin.000012 > inc_20260425.sql - 如果期间发生
FLUSH LOGS,新日志文件(如mysql-bin.000013)需从 position 4 开始截取
恢复时必须按顺序重放,顺序错就丢数据
恢复不是“导入一个 SQL 文件”那么简单。全备和每个增量文件之间有严格依赖关系:
- 先用
mysql -u root -p db_name 恢复基线 - 再按时间顺序依次应用增量:
mysqlbinlog inc_20260425.sql | mysql -u root -p db_name - 若跳过某天增量,或颠倒
inc_20260426.sql和inc_20260425.sql,会导致主键冲突、重复插入或丢失更新 - 注意:
mysqlbinlog输出含SET TIMESTAMP和USE语句,直接管道导入即可,无需额外处理
容易被忽略的关键细节
很多人卡在恢复失败,问题往往出在这些地方:
-
binlog_format必须是MIXED或ROW,STATEMENT在某些函数(如NOW()、UUID())下会丢失一致性 -
server_id必须全局唯一,否则主从复制或日志轮转异常,SHOW BINARY LOGS可能不显示最新文件 - Navicat 备份时若没勾选“包括创建数据库”,恢复前得手动
CREATE DATABASE,否则报错退出 -
mysqlbinlog默认会写入注释和事件头,用--base64-output=DECODE-ROWS -v查看内容更安全,但导入时别加这些参数,否则语法错误


















