mysqldump 是什么
mysqldump 是 MySQL 自带的逻辑备份工具,把库表结构与数据导出成 SQL 文本。产物可以直接阅读、检索,也能按对象截取,因此除整库恢复外还常用于跨版本迁移与单表回滚。它的代价是导出与恢复都要逐条回放 SQL,大库耗时明显高于物理备份。
基本信息
| 定位 | 逻辑备份,导出 SQL 文本 |
|---|---|
| 范围 | 单库、多库或全实例 |
| 产物 | 可读可编辑,支持按表截取恢复 |
| 适用 | 中小库、跨版本迁移、单表恢复 |
| 不适用 | 超大实例的快速整体恢复 |
| 权限 | 涉及 SELECT、LOCK TABLES、PROCESS、RELOAD 等 |
基本用法
基本用法
# 单库(含建库语句)
mysqldump -u root -p --databases appdb > appdb-$(date +%F).sql
# 全实例(含用户与权限表)
mysqldump -u root -p --all-databases > all-$(date +%F).sql
# 只要表结构,不要数据
mysqldump -u root -p --no-data --databases appdb > appdb-schema.sql生产常用参数
生产常用参数
mysqldump -u root -p --single-transaction --source-data=2 \
--routines --events --triggers --set-gtid-purged=OFF \
--databases appdb > appdb-$(date +%F).sql
# 账号密码写入受限权限的配置文件,避免命令行明文暴露
mysqldump --defaults-extra-file=/etc/my-backup.cnf --all-databases > all.sql常用参数与作用
| 参数 | 作用 |
|---|---|
| --databases | 导出时写入建库语句,恢复不必手工建库 |
| --single-transaction | 用一致性快照导出 InnoDB,不长时间锁表 |
| --source-data=2 | 以注释形式记录 binlog 位点,供后续回放 |
| --routines / --events | 导出存储过程、函数与事件调度器对象 |
| --set-gtid-purged | 控制产物是否携带 GTID 语句,按目标环境选择 |
典型使用场景
- 每日逻辑备份:中小库用一条命令即可覆盖结构、数据与存储程序对象
- 跨版本迁移:从旧版本实例导出后导入新版本,兼容性优于物理文件拷贝
- 单表回滚:从产物中截取目标表的语句单独回放,不必恢复整个库
- 变更前留底:执行大批量更新或结构变更前导出快照,出问题时快速对照
- 结构与数据分离:用 --no-data 与 --no-create-info 分别导出,便于版本管理
逻辑与物理的分工
逻辑备份的优势是可读、可选择、跨平台,劣势是恢复速度受 SQL 回放速度限制。数据量增长到几百 GB 以上时,整实例恢复动辄数小时,通常改用物理备份打底、逻辑备份补充单表与迁移需求,两者并存而不是互相替代。
恢复方式
恢复方式
# 含 --databases 的产物可直接回放
mysql -u root -p < /backup/appdb-2026-10-12.sql
# 不含建库语句的产物需要先手工建库
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS appdb DEFAULT CHARACTER SET utf8mb4"
mysql -u root -p appdb < /backup/appdb-2026-10-12.sql对大表默认会加读锁并阻塞写入,InnoDB 实例应配合 --single-transaction;混合了 MyISAM 等非事务表的库,该参数无法保证整体一致。
备份账号建议单独创建并只授予必要权限,密码放入仅 root 可读的配置文件,避免出现在命令历史与进程列表中。
常见坑位与规避
- 产物为空但不报错:导出到已存在的目录或不存在的路径时可能失败,脚本要检查产物大小
- 字符集不一致:导出与导入实例的字符集或排序规则不同,中文等数据会出现乱码或比较异常
- 长事务推高 undo 保留:大库在业务高峰导出会拉长历史版本链,低峰执行更稳
- 权限对象与数据错序:先恢复账号与授权再导入数据,避免中途因权限不足中断
- 单表过大:导出与恢复都以单表为最小单位,超大表按时间分区导出更便于局部重放
大库的替代路子
单线程的 mysqldump 在几百 GB 级别的库上会明显吃力,官方 mysqlpump(8.0.34 起已标记弃用)与第三方 mydumper 支持并行导出,能把导出时间摊到多个线程上。需要快速整体恢复时,物理备份工具(如 XtraBackup)更适合作为主干,逻辑导出退居单表恢复与迁移用途。
恢复提速与核对
恢复提速与核对
# 导入前临时关闭检查可缩短回放时间(会话级,不影响全局)
mysql -u root -p appdb -e "SET foreign_key_checks=0; SET unique_checks=0;" < /backup/appdb.sql
# 导入后核对关键表行数与业务抽检
mysql -u root -p appdb -e "SELECT COUNT(*) FROM orders WHERE created_at >= CURDATE() - INTERVAL 1 DAY;"