乐途乐途
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
  • 学习路径
  • 第1章 数据库基础与安装

    • MySQL 简介
    • MySQL 5.6 到 5.7 到 8.0 关键差异速查
    • 安装 MySQL 5.7
    • 连接与断开服务器
    • 创建数据库
    • 创建数据表
    • 数据库与数据表
    • 加载数据
    • 获取数据库信息
    • 批处理模式
    • SHOW 语句汇总
    • FLUSH 与 RESET 语句
    • my.cnf 核心参数
    • 字符集与排序规则
  • 第2章 SQL基础查询

    • SELECT
    • WHERE
    • ORDER BY
    • LIMIT
    • COUNT
    • 聚合函数
    • 比较运算符
    • 逻辑运算符
    • 算术运算符
    • 模式匹配
    • NULL 值处理
    • UPDATE
    • DELETE
    • REPLACE
    • SELECT INTO
  • 第3章 数据类型与运算符

    • 数值类型
    • 字符串类型
    • 日期时间类型
    • BIT 类型
    • ENUM 类型
    • SET 类型
    • JSON 类型
    • 类型转换
  • 第4章 函数与表达式

    • 字符串函数
    • 数值函数
    • 日期函数
    • 全文检索函数
  • 第5章 高级查询与子查询

    • JOIN
    • 子查询
    • UNION
    • GROUP BY
    • HAVING
    • DISTINCT
  • 第6章 表与索引

    • 数据定义语言
    • 修改表结构
    • 视图
    • 修改视图与检查选项
    • 外键
    • 索引
    • 唯一索引
    • 复合索引
    • 存储引擎对比
    • 分区表
    • 第一范式与第二范式
    • 第三范式与 BC 范式
    • 反范式设计
  • 第7章 存储过程与函数

    • 存储过程
    • 存储函数
    • 变量
    • 流程控制
    • 游标
    • 预处理语句
  • 第8章 事务与锁

    • 事务
    • 事务隔离级别
    • 锁机制
    • MVCC
    • 死锁专题分析
    • LOCK TABLES
    • XA 事务
  • 第9章 用户管理与安全

    • 用户管理
    • 权限管理
    • 角色
    • SQL 注入防范
  • 第10章 性能优化入门

    • 执行计划
    • 索引优化
    • 查询优化
    • 查询优化器提示
    • 慢查询日志
    • InnoDB 深入机制
    • InnoDB 专项优化
    • Performance Schema
    • sys Schema
  • 第11章 复制与高可用

    • 主从复制原理
    • 半同步复制配置
    • binlog 开启与 point-in-time 恢复
    • mysqldump 全库备份
    • mysqldump 单表与条件备份
    • mysqldump 恢复与导入
    • xtrabackup 全量热备
    • xtrabackup 准备与恢复
    • xtrabackup 增量与流式备份
  • 第12章 触发器与事件

    • 触发器
    • 事件调度器
  • 参考

    • MySQL 5.7 专业术语大全
    • MySQL 5.7 关键字与保留字大全

mysqldump 全库备份

导学

mysqldump 是 MySQL 自带的逻辑备份工具,它将数据库结构和数据导出为可执行的 SQL 文本。全库备份是最常用的备份场景——每天凌晨跑一次,生成一个 .sql 文件,既是灾难恢复的底线,也是迁移环境的利器。

定义

mysqldump:MySQL 官方提供的逻辑备份客户端程序,通过执行 SELECT 将表数据转为 INSERT 语句,同时导出 CREATE TABLE 等结构语句,最终生成纯文本 SQL 文件。

核心参数速查

参数作用使用建议
--single-transaction对 InnoDB 开启一致性读事务,不锁表InnoDB 必加
--master-data=2记录 binlog 文件名和位置(注释形式)搭建从库或 PITR 必加
--all-databases备份所有数据库全库备份用
--databases db1 db2备份指定数据库多库备份用
--routines包含存储过程和函数完整备份必加
--triggers包含触发器完整备份必加
--events包含事件调度器完整备份必加
--hex-blob二进制字段用十六进制导出避免 BLOB 数据损坏
--set-gtid-purged=OFF不输出 GTID 相关语句跨实例恢复时避免 GTID 冲突
--skip-lock-tables跳过锁表(配合 --single-transaction)避免与事务选项冲突

场景一:全库一致性备份

当前数据状态:company 库有员工表和绩效表,业务正在运行。

USE company;
SELECT emp_name, dept FROM employees;
emp_namedept
大翔技术部
白歌技术部

操作语句(在服务器命令行执行):

mysqldump -u root -p \
  --single-transaction \
  --master-data=2 \
  --routines \
  --triggers \
  --events \
  --all-databases \
  --hex-blob \
  > /backup/full_backup_$(date +%Y%m%d_%H%M%S).sql

输入 root 密码后,命令执行期间:

  • --single-transaction 在 InnoDB 内部开启一个 REPEATABLE READ 事务,备份期间看到的数据是命令开始时的快照,不阻塞业务写入
  • --master-data=2 在 SQL 文件头部写入 -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000015', MASTER_LOG_POS=1234;
  • 备份文件大小取决于数据量,可用 gzip 压缩:... | gzip > backup.sql.gz

验证备份文件:

head -n 20 /backup/full_backup_*.sql

输出中应包含:

-- MySQL dump 10.13  Distrib 5.7.44, for Linux (x86_64)
--
-- Host: localhost    Database:
-- ------------------------------------------------------
-- Server version	5.7.44-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
-- ...
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000015', MASTER_LOG_POS=1234;

结果解读:-- CHANGE MASTER TO 这行注释记录了备份时刻的 binlog 坐标,是 point-in-time 恢复和搭建从库的关键锚点。

场景二:只备份结构(不备份数据)

操作语句:

mysqldump -u root -p --no-data --databases company > company_schema.sql

验证:

grep -c "INSERT INTO" company_schema.sql

预期输出:0

grep "CREATE TABLE" company_schema.sql | head -n 3

预期输出包含 CREATE TABLE 语句。

结果解读:--no-data 只导出 CREATE DATABASE、CREATE TABLE、CREATE INDEX 等结构语句,不导出 INSERT。适合快速复制表结构到新环境,或做 schema 版本管理。

场景三:只备份数据(不备份结构)

操作语句:

mysqldump -u root -p --no-create-info --databases company > company_data_only.sql

验证:

grep -c "CREATE TABLE" company_data_only.sql

预期输出:0

grep "INSERT INTO" company_data_only.sql | head -n 2

预期输出包含 INSERT INTO 语句。

结果解读:--no-create-info 跳过所有 CREATE 语句,只导出 INSERT。适合表结构已存在、只需导入数据的场景(如测试环境刷新数据)。

常见误区

误区正解
"不加 --single-transaction 也能备份"可以,但默认会锁表(FLUSH TABLES WITH READ LOCK),阻塞写入。InnoDB 生产环境必须加。
"--master-data=2 会锁表"会短暂加全局读锁(获取 binlog 坐标),但配合 --single-transaction 时锁的时间极短(通常 < 1 秒)。
"mysqldump 备份文件可以直接用编辑器打开"小库可以;大库(> 1GB)用 less、head、grep 查看,不要直接用记事本打开。
"备份时加 --quick 没用"大表必加。默认 mysqldump 将整张表读入内存再输出,--quick 逐行读取,避免内存溢出。

面试考点

Q:--single-transaction 的原理是什么?

对 InnoDB 开启一个 REPEATABLE READ 事务,利用 MVCC 获得一致性快照。备份期间业务可以正常读写,不阻塞。但仅对 InnoDB 有效,MyISAM 仍需锁表。

Q:--master-data=1 和 =2 的区别?

=1 写入非注释的 CHANGE MASTER TO 语句,恢复时会自动执行;=2 写入注释形式(前面加 --),恢复时不会自动执行,需手动提取坐标。推荐 =2,避免误恢复时自动改主库配置。

Q:mysqldump 备份 100GB 的库有什么问题?

  1. 生成 SQL 文件体积大(通常比数据文件大 2~3 倍);2. 恢复极慢(逐行 INSERT);3. 内存消耗高(不加 --quick 时)。大库应改用 xtrabackup 物理备份。

小结

  • mysqldump 是逻辑备份,生成可执行的 SQL 文本
  • InnoDB 全库备份必加 --single-transaction(不锁表)和 --master-data=2(记录 binlog 坐标)
  • --no-data 只备份结构,--no-create-info 只备份数据
  • 大表备份加 --quick 避免内存溢出,大库整体应考虑 xtrabackup

下一章引子:全库备份是日常基线,但有时候你只需要备份一张表,或者只备份满足某个条件的数据行。

上一页
binlog 开启与 point-in-time 恢复
下一页
mysqldump 单表与条件备份