全量导出关键参数组合为:--all-databases --single-transaction --set-gtid-purged=off --default-character-set=utf8mb4 --events --routines --triggers,缺一不可;其中--single-transaction保障innodb一致性且不锁表,--set-gtid-purged=off适配目标库gtid启用状态,--default-character-set=utf8mb4防编码错乱,--events --routines --triggers确保完整导出数据库对象。

全量导出时 mysqldump 的关键参数组合
直接用 mysqldump --all-databases 会失败,尤其当库中含视图、存储过程或 GTID 开启时。必须显式控制字符集、锁机制和兼容性选项。
- 加
--single-transaction替代--lock-all-tables,避免长时全局锁(仅对 InnoDB 有效) - 强制指定
--default-character-set=utf8mb4,否则导出的 SQL 可能因客户端默认编码错乱 - 必须加
--set-gtid-purged=OFF(目标库 GTID 已启用)或ON(目标库未启用 GTID),否则导入报错GTID_PURGED can only be set when GTID_MODE = ON - 若含事件或函数,需额外加
--events --routines --triggers,缺一不可
示例全量导出命令:
mysqldump -h127.0.0.1 -uadmin -p'xxx' \ --all-databases \ --single-transaction \ --set-gtid-purged=OFF \ --default-character-set=utf8mb4 \ --events --routines --triggers > full_$(date +%Y%m%d_%H%M%S).sql
增量备份依赖 binlog 的正确开启与定位
MySQL 不自带“增量导出”功能,本质是解析 binlog。先确认源库已开启并配置合理:
- 检查
show variables like 'log_bin';返回ON,否则无法做增量 -
expire_logs_days至少设为 7,防止 binlog 被自动清理导致断点丢失 - 增量起点不能靠猜:全量导出后立即执行
show master status;,记下File和Position(不是时间戳!)
常见错误:用 mysqlbinlog --start-datetime 恢复,但跨 DDL 语句时易错位。应严格使用位置点:
mysqlbinlog --base64-output=decode-rows -v \ --start-position=123456789 \ /var/lib/mysql/mysql-bin.000001 > inc_20240501.sql
自动化脚本里必须处理的三个状态断点
纯定时 dump + binlog 拼接会丢数据,因为无法保证“全量结束”和“增量起始”之间无写入。必须引入协调机制:
- 全量导出前加
FLUSH TABLES WITH READ LOCK;,再立刻SHOW MASTER STATUS;,最后UNLOCK TABLES;(注意:该锁阻塞写,需快速操作) - 把获取到的 binlog 文件名和 position 写入一个标记文件(如
last_full_point.txt),供下次增量脚本读取 - 增量脚本运行前,先检查当前
SHOW MASTER STATUS;的 position 是否大于标记值,否则跳过——避免重复拉取或漏拉
脚本中不要用 date -d "1 hour ago" 这类时间推算,binlog 是按 position 顺序的,时间只是近似参考。
目标库导入时的权限与冲突规避
mysql 命令直接导入全量 SQL 很容易失败,原因常被忽略:
- 目标库需提前创建同名用户,并赋予
CREATE ROUTINE、EVENT、TRIGGER等权限,否则--routines导出的存储过程会报错 - 全量 SQL 中含
CREATE DATABASE IF NOT EXISTS,但若目标库已有同名库且结构不一致(如表引擎不同),导入会卡住或静默失败 - 建议在导入前加
SET SESSION FOREIGN_KEY_CHECKS=0; SET SESSION SQL_MODE='';,否则外键和严格模式常引发中断
更稳妥的做法是:全量导入用 mysql -f(force 模式跳过单条错误),但必须配合日志检查:
mysql -h127.0.0.1 -uadmin -p'xxx' -f &1 | grep -E "(ERROR|Warning)"
增量导入前务必停掉目标库写入,或确保应用已切走;binlog 回放不具备事务原子性,中间出错会导致主从不一致。
实际跑通的关键不在语法多漂亮,而在每个环节是否守住那个 position 断点——它一旦漂移,后续所有增量都不可信。











