面向 DBA 与开发运维的“mysqldump 逻辑备份”实操手册
下面是一份面向 DBA 与开发运维的“mysqldump 逻辑备份”实操手册,涵盖核心概念、常用/高级选项、压缩与自动化、恢复验证,以及生产环境最佳实践。所有命令均基于 MySQL 5.7/8.0 官方文档 和社区权威资料整理,可直接在 Linux/macOS(Bash)、Windows PowerShell 下使用。
一、逻辑备份 vs 物理备份
| 方式 | 工具 | 内容 | 典型用途 |
|---|---|---|---|
| 逻辑备份 | mysqldump、mysqlpump | 生成 SQL 语句(DDL + DML) | 小中型库迁移、跨版本升级、表级导入导出 |
| 物理备份 | mysqlbackup (Enterprise)、xtrabackup (社区) | 拷贝数据文件 / InnoDB 页 | TB 级热备、Point‑in‑time 恢复、快速回滚 |
二、基础命令:全库导出
mysqldump -u root -p -h 127.0.0.1 \
--databases mydb1 mydb2 \
--single-transaction --master-data=2 \
--routines --events --triggers \
--default-character-set=utf8mb4 \
--hex-blob \
> alldb_$(date +%F).sql
--single-transaction:在线热备,避免锁表(仅适用 InnoDB)。--master-data=2:在备份文件内写入CHANGE MASTER TO,便于复制恢复。--routines --events --triggers:连同存储过程、事件、触发器。--hex-blob:二进制 / BLOB 列安全转储。> xxx.sql:重定向输出;亦可| gzip > xxx.sql.gz立即压缩。
三、表级/条件备份示例
指定表
mysqldump -u backup -p --databases sales --tables orders order_items > sales_orders.sql
排除表(≥8.0.29)
mysqldump --databases sales \
--ignore-table=sales.logs \
--ignore-table=sales.temp_data \
> sales_without_logs.sql
WHERE 过滤(仅支持单表导出)
mysqldump test orders --where="created_at >= '2025-01-01'" > orders_2025.sql
四、使用配置文件隐藏密码
~/.my.cnf 中存储凭据并限制 600 权限:
[client]
user=backup
password="S3cr3tP@ss"
host=127.0.0.1
执行时可省略 -u/-p,防止密码泄露到 ps 列表或 shell 历史。
五、压缩与分卷
mysqldump mydb | gzip | split -b 2G - mydb_$(date +%F).sql.gz.part-
split -b 2G:按 2 GB 分卷,适合跨平台复制。- 恢复:
cat mydb_2025-07-06.sql.gz.part-* | gunzip | mysql mydb
六、恢复数据
mysql -u root -p < alldb_2025-07-06.sql # 全量恢复
mysql --database=mydb < mydb_schema.sql # 单库
mysql mydb < orders_2025.sql # 表或行过滤文件
如果备份包含
DROP DATABASE / TABLE语句,务必先在测试库验证再导入生产。
七、自动化调度 (Cron 示例)
/etc/cron.d/mysqldump-nightly:
0 2 * * * backup /usr/bin/mysqldump --defaults-file=/home/backup/.my.cnf \
--single-transaction --quick --databases prod | gzip > /backup/prod_$(date +\%F).sql.gz
--quick:行流式输出,降低内存占用。- 建议配合 离线复制到对象存储(S3、OSS)或异地服务器。
八、大库/高并发环境加固
| 技巧 | 说明 |
|---|---|
--chunk-size=N | 把 InnoDB 表分块导出(mysqlpump 提供)。 |
| 只导出从库 | 主库高并发场景避免影响。 |
| 禁用 binlog | SET sql_log_bin=0; 内嵌到 dump,可减少恢复时 binlog 膨胀。 |
| 确认 GTID | --set-gtid-purged=ON 方便 GTID 复制。 |
九、校验与演练
- 校验文件完整性
sha256sum *.sql.gz > backup.sha
- 在隔离环境恢复并跑集成测试
- Docker:
docker run --name testdb -e MYSQL_ALLOW_EMPTY_PASSWORD=1 -d mysql:8 - 导入备份:
docker exec -i testdb mysql < alldb.sql
- 定期灾难演练(至少季度一次)。
🔗 参考文档
- MySQL 8.0 Reference – mysqldump – A Database Backup Program
https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html - MySQL Shell –
util.dumpInstance()(并行逻辑备份,适合 MySQL 8.0+ 大库)
https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities-instance-dump.html - Oracle MySQL Backup Best Practices Whitepaper
更多详细内容请关注其他相关文章!