【MySQL】mysqldump 核心用法详解:12个高频场景与实操指南

作为 MySQL 生态中最常用的逻辑备份工具,mysqldump 凭借丰富的参数设计,能灵活应对全库备份、单表备份、远程备份等多种运维需求。本文整理了 12 个日常工作中高频使用的场景,结合具体命令示例与原理说明,帮你快速掌握 mysqldump 的核心用法,提升备份效率与数据安全性。

一、基础认知:mysqldump 核心优势

mysqldump 是 MySQL 官方提供的逻辑备份工具,支持将数据库 / 表结构、数据导出为 SQL 脚本,具备以下核心优势:

  • 跨平台兼容,支持 Windows、Linux、Unix 系统;
  • 参数丰富,可精准控制备份范围(结构 / 数据 / 条件筛选);
  • 无需额外依赖,默认随 MySQL 安装;
  • 备份文件可读性强,支持跨版本恢复(兼容大部分 MySQL/MariaDB 版本)。

二、12 个高频实操场景(含命令示例)

场景 1:控制 GTID 信息,避免恢复冲突

适用场景:开启 GTID(全局事务标识符)的 MySQL 环境,备份文件若包含 GTID 信息,可能导致目标库恢复失败(因 GTID 执行记录不兼容)。

核心参数--set-gtid-purged=off(关闭 GTID 信息写入)

实操命令

# 备份 bak1 库,不包含 GTID 相关语句
mysqldump -u'u_bak' -p'Ijd71Gcd_a' --set-gtid-purged=off bak1 > bak1_gtid_off.sql

注意:若目标库未开启 GTID,建议强制关闭该参数,避免恢复时出现 “GTID_PURGED can only be set when GTID_EXECUTED is empty” 错误。

场景 2:多库批量备份(含建库语句)

适用场景:需要同时备份多个业务库,且希望恢复时自动创建数据库(无需手动建库)。

核心参数-B(–databases,指定多个库,空格分隔)

实操命令

# 同时备份 bak1、bak2 两个库,备份文件含建库语句
mysqldump -u'u_bak' -p'Ijd71Gcd_a' --set-gtid-purged=off -B bak1 bak2 > bak1_bak2.sql

优势:恢复时直接执行 source bak1_bak2.sql 即可自动创建两个库,无需提前手动建库。

场景 3:全库备份(含系统库)

适用场景:需要备份 MySQL 所有数据库(含 mysql、information_schema 等系统库),适用于整机迁移。

核心参数-A(–all-databases,备份所有库)

实操命令

# 备份所有数据库(含系统库),注意恢复时的覆盖风险
mysqldump -u'u_bak' -p'Ijd71Gcd_a' --set-gtid-purged=off -A > all_databases.sql

风险提示:恢复时会覆盖目标库的系统表(如用户权限表),建议仅在全新环境或确认无需保留目标库系统配置时使用。

场景 4:单表 / 多表精准备份

适用场景:仅需备份某个库中的特定表,减少备份文件体积与恢复时间。

核心语法:指定 “库名 表名”(多表用空格分隔)

实操命令

# 1. 备份 bak1 库的 t1 表
mysqldump -u'u_bak' -p'Ijd71Gcd_a' --set-gtid-purged=off bak1 t1 > bak1_t1.sql

# 2. 备份 bak1 库的 t1、t2 两个表
mysqldump -u'u_bak' -p'Ijd71Gcd_a' --set-gtid-purged=off bak1 t1 t2 > bak1_t1_t2.sql

优势:针对性备份,避免冗余数据,恢复速度更快。

场景 5:远程跨机器备份

适用场景:需要备份远程服务器的 MySQL 数据,且不想在远程服务器存储备份文件(节省磁盘空间)。

核心参数-h(指定远程数据库 IP)

实操命令

# 在本地机器(maria_02)执行,备份远程机器(192.168.184.151)的 bak1.t1 表
mysqldump -u'u_bak' -p'Ijd71Gcd_a' -h'192.168.184.151' --set-gtid-purged=off bak1 t1 > bak1_t1_remote.sql

前置条件:远程 MySQL 需允许备份用户(u_bak)从本地机器登录(授权语句:GRANT SELECT, RELOAD ON *.* TO 'u_bak'@'本地IP' IDENTIFIED BY '密码';)。

场景 6:结构与数据分离备份

适用场景:仅需备份表结构(如迁移表结构到测试环境)或仅需备份数据(如同步生产数据到开发环境,保留测试环境结构)。

核心参数

  • -d(–no-data):仅备份结构,不含插入语句;
  • -t(–no-create-info):仅备份数据,不含建表语句。

实操命令

# 1. 仅备份 bak1.t1 表结构
mysqldump -u'u_bak' -p'Ijd71Gcd_a' --set-gtid-purged=off -d bak1 t1 > bak1_t1_struct.sql

# 2. 仅备份 bak1.t1 表数据
mysqldump -u'u_bak' -p'Ijd71Gcd_a' --set-gtid-purged=off -t bak1 t1 > bak1_t1_data.sql

场景 7:条件筛选备份(按需导出数据)

适用场景:仅需备份满足特定条件的数据(如备份近 30 天的订单数据、指定用户的相关记录)。

核心参数-w(–where,指定筛选条件,需用引号包裹)

实操命令

# 备份 bak1.t1 表中 id=1 的记录
mysqldump -u'u_bak' -p'Ijd71Gcd_a' --set-gtid-purged=off bak1 t1 -w"id=1" > bak1_t1_id1.sql

# 扩展:备份近30天的订单数据(假设订单表 order 含 create_time 字段)
mysqldump -u'u_bak' -p'Ijd71Gcd_a' --set-gtid-purged=off db_order order -w"create_time >= DATE_SUB(NOW(), INTERVAL 30 DAY)" > order_last30d.sql

注意:条件语句需符合 MySQL 语法,字符串类型字段需加单引号(如 name='zhangsan')。

场景 8:插入语句优化(兼容表结构变更)

适用场景:备份数据后,目标表可能存在字段增减(如新增字段),需确保插入语句兼容;或需要处理重复数据。

核心参数

  • -c(–complete-insert):插入语句包含列名(如 INSERT INTO t1(id,a,b) VALUES(...));
  • --replace:重复数据替换(用 REPLACE 替代 INSERT);
  • --insert-ignore:忽略重复数据(用 INSERT IGNORE 替代 INSERT)。

实操命令

# 1. 插入语句包含列名,兼容表结构变更
mysqldump -u'u_bak' -p'Ijd71Gcd_a' --set-gtid-purged=off -c bak1 t1 > bak1_t1_complete.sql

# 2. 重复数据替换(备份数据覆盖目标库重复记录)
mysqldump -u'u_bak' -p'Ijd71Gcd_a' --set-gtid-purged=off -t --replace bak1 t1 > bak1_t1_replace.sql

# 3. 忽略重复数据(目标库重复记录保留,不覆盖)
mysqldump -u'u_bak' -p'Ijd71Gcd_a' --set-gtid-purged=off -t --insert-ignore bak1 t1 > bak1_t1_ignore.sql

场景 9:InnoDB 表无锁备份

适用场景:生产环境高峰期备份 InnoDB 表,需避免锁表导致业务卡顿。

核心参数--single-transaction(基于 MVCC 机制,创建一致性快照,不锁表)

实操命令

# 无锁备份 bak1 库,仅对 InnoDB 表有效
mysqldump -u'u_bak' -p'Ijd71Gcd_a' --set-gtid-purged=off --single-transaction bak1 > bak1_no_lock.sql

关键说明

  • 仅对 InnoDB 表有效,MyISAM 表仍会加表锁;
  • 备份期间避免执行 ALTER TABLE、DROP TABLE 等 DDL 语句,否则会导致备份失败或数据不一致。

场景 10:记录复制位点(搭建从库)

适用场景:基于备份搭建 MySQL 主从复制,需记录备份时的 binlog 位点(日志文件 + 偏移量)。

核心参数--master-data(取值 1 或 2):

  • --master-data=1:备份文件写入未注释的 CHANGE MASTER TO 语句,恢复时自动执行;
  • --master-data=2:备份文件写入注释的 CHANGE MASTER TO 语句,需手动调整后执行。

实操命令

# 备份 bak1 库,记录 binlog 位点(注释形式),用于搭建从库
mysqldump -u'u_bak' -p'Ijd71Gcd_a' --set-gtid-purged=off --master-data=2 bak1 > bak1_master.sql

使用方式:恢复备份后,在从库执行注释中的 CHANGE MASTER TO 语句(需替换主库 IP、用户名、密码等),即可启动主从同步。

场景 11:压缩备份(节省磁盘空间)

适用场景:备份文件较大(如全库备份),需减少存储占用。

核心思路:结合 gzip 命令实时压缩备份文件。

实操命令

# 备份并压缩 bak1 库,生成 .sql.gz 压缩文件
mysqldump -u'u_bak' -p'Ijd71Gcd_a' --set-gtid-purged=off bak1 | gzip > bak1_compressed.sql.gz

# 解压恢复:gzip -d bak1_compressed.sql.gz && mysql -u用户名 -p 库名 

场景 12:排除指定表备份

适用场景:备份某个库时,需排除超大表或无用表(如日志表)。
核心参数--ignore-table(指定“库名.表名”,多个表需重复该参数)
实操命令

# 备份 bak1 库,排除 t_log(日志表)和 t_temp(临时表)
mysqldump -u'u_bak' -p'Ijd71Gcd_a' --set-gtid-purged=off -B bak1 --ignore-table=bak1.t_log --ignore-table=bak1.t_temp > bak1_exclude.sql

三、实操注意事项与避坑指南

  1. 防火墙拦截连接报错提示:Can’t connect to MySQL server on 'IP:3306'解决方案:临时关闭目标库防火墙(iptables -F),或开放 3306 端口(firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload)。
  2. 备份用户权限不足报错提示:Access denied; you need (at least one of) the RELOAD privilege(s) for this operation解决方案:为备份用户授予必要权限:GRANT SELECT, RELOAD, LOCK TABLES, SHOW VIEW, EVENT ON *.* TO 'u_bak'@'登录IP' IDENTIFIED BY '密码'; FLUSH PRIVILEGES;
  3. GTID 冲突导致恢复失败报错提示:@@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty解决方案:
    • 若目标库未执行过 GTID 事务,执行 RESET MASTER 清空 GTID 记录后再恢复;
    • 若目标库已启用 GTID,备份时强制添加 --set-gtid-purged=off 参数。
  4. 大表备份效率优化问题:备份超大表(千万级数据)时,mysqldump 占用大量 CPU/IO,导致业务卡顿。优化方案:
    • 结合 --quick 参数(逐行读取数据,减少内存占用);
    • 在业务低峰期执行备份;
    • 拆分大表备份(按分区或条件分批导出)。

四、总结

mysqldump 的灵活性在于其丰富的参数组合,无论是简单的单表备份、复杂的主从搭建,还是跨机器备份、压缩备份,都能通过参数精准控制。实际使用时,建议根据业务需求(备份范围、恢复场景、性能要求)选择合适的参数组合,并定期测试备份文件的可用性(避免备份失效)。

Tags:

发表回复

Your email address will not be published. Required fields are marked *.

*
*