首页/数据/备份与容灾速查/mysqldump 逻辑备份
数据库与云备份56 条

mysqldump 逻辑备份

MySQL 自带逻辑备份工具:把库表结构与数据导出为 SQL 文本,可单库、多库或全实例导出,产物可读可检索,适合中小库与跨版本迁移。

备份与容灾速查数据更新于 2026-10-13

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;"

易错点

  • 不带 --databases 的单库导出不含建库语句,恢复前要手工建库,否则报 Unknown database
  • 对大表默认锁表会阻塞写入:InnoDB 应配合 --single-transaction 使用
  • 恢复时用 --force 忽略错误继续执行会得到半成品库,脚本应默认遇错停下并检查退出码
  • 导出期间执行 DDL 会破坏一致性快照,DDL 变更应与备份窗口错开
  • 只备份数据不备份账号与授权,恢复后应用无法连接,需单独规划权限对象的备份

数据来源与参考

  • MySQL 8.0 Reference Manual: mysqldump
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌