MySQL 数据库备份与还原是保障数据安全的核心操作,需根据数据库规模、性能要求、恢复时效选择合适方案。本文从备份类型、推荐方案、具体命令行、备份策略到注意事项全面解析,覆盖逻辑备份、物理备份及点-in-time恢复(PITR)。

MySQL 备份分为 逻辑备份 和 物理备份,核心区别如下:
| 类型 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 逻辑备份 | 将数据导出为 SQL 语句或文本格式 | 跨版本兼容、可读性强、支持部分备份 | 备份/恢复速度慢(尤其大数据量)、锁表风险 | 小型数据库(<100GB)、跨环境迁移 |
| 物理备份 | 直接复制数据文件(如 InnoDB 表空间) | 备份/恢复速度快、支持增量备份、低锁表 | 依赖存储引擎、跨版本兼容性差、不可读 | 大型数据库(>100GB)、高性能恢复需求 |
mysqldump(官方)、mysqlpump(官方多线程)、mydumper(第三方多线程)。Percona XtraBackup(开源,支持热备)、MySQL Enterprise Backup(官方收费)。根据数据库规模和需求选择方案:
优势:简单易用、跨版本兼容、支持单库/单表备份,适合开发环境或小型生产库。
工具:mysqldump(MySQL 自带,无需额外安装)。
优势:多线程并行备份,速度远超 mysqldump,支持分块导出、压缩,适合中等规模数据库。
工具:mydumper(需手动安装,基于 glib 开发)。
优势:支持 InnoDB 热备(不锁表)、增量备份、压缩,恢复速度快,适合生产环境核心库。
工具:Percona XtraBackup(开源,Percona 公司开发)。
优势:通过“全量备份+增量备份+Binlog”实现任意时间点恢复(PITR),满足 RTO(恢复时间目标)和 RPO(恢复点目标)要求。
mysqldump 是 MySQL 官方逻辑备份工具,语法:
mysqldump [选项] 数据库名 [表名...] > 备份文件.sql
# 备份 db_name 数据库到 backup_db.sqlmysqldump -u 用户名 -p 密码 db_name > backup_db.sql# 示例(输入密码时隐藏明文)mysqldump -u root -p db_test > /backup/db_test_$(date +%Y%m%d).sql# 执行后输入密码:Enter password: ******
# 备份 db1、db2 到 multi_db.sqlmysqldump -u root -p --databases db1 db2 > multi_db.sql
# 备份所有库(包括 mysql、information_schema 等)mysqldump -u root -p --all-databases > all_databases.sql
# 备份 db_name 库的 table_name 表mysqldump -u root -p db_name table_name > table_name.sql
# 备份 orders 表中 2023 年的数据(需表有 create_time 字段)mysqldump -u root -p db_name orders --where="create_time >= '2023-01-01'" > orders_2023.sql
结合 gzip 压缩备份文件(推荐):
mysqldump -u root -p db_name | gzip > db_name.sql.gz
| 选项 | 作用 |
|---|---|
--single-transaction | 对 InnoDB 表使用事务快照备份(不锁表,适合生产环境) |
--routines | 备份存储过程和函数 |
--triggers | 备份触发器 |
--events | 备份事件调度器 |
--hex-blob | 二进制数据(如 BLOB)以十六进制格式导出(避免乱码) |
--skip-lock-tables | 不锁表(MyISAM 表可能不一致,慎用) |
mydumper 是第三方多线程逻辑备份工具,速度比 mysqldump 快 5~10 倍,支持分块导出和压缩。
sudo apt install mydumper
sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpmsudo percona-release enable-only tools releasesudo yum install mydumper
# 多线程备份 db_name(-t 线程数,-c 压缩,-o 输出目录)mydumper -u root -p 密码 -h localhost -P 3306 -t 4 -c -o /backup/mydumper/db_name -B db_name # -B 指定数据库名
mydumper -u root -p 密码 -t 4 -c -o /backup/mydumper/all_databases -a # -a 备份所有库
Percona XtraBackup 支持 InnoDB 热备(不锁表)、增量备份,适合大型数据库。
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.debsudo dpkg -i percona-release_latest.*.debsudo apt updatesudo apt install percona-xtrabackup-24 # MySQL 5.7/8.0 对应版本
# 备份所有 InnoDB 表到 /backup/xtrabackup/fullxtrabackup --backup --user=root --password=密码 --target-dir=/backup/xtrabackup/full/$(date +%Y%m%d)
# 基于全量备份做增量备份(需指定上次备份目录)xtrabackup --backup --user=root --password=密码 --target-dir=/backup/xtrabackup/incr/$(date +%Y%m%d) --incremental-basedir=/backup/xtrabackup/full/20231001
备份文件需通过 --prepare 命令整理后才能恢复:
# 全量备份准备(--apply-log)xtrabackup --prepare --target-dir=/backup/xtrabackup/full/20231001# 增量备份准备(合并到全量备份)xtrabackup --prepare --target-dir=/backup/xtrabackup/full/20231001 --incremental-dir=/backup/xtrabackup/incr/20231002
使用 mysql 命令导入 SQL 文件:
# 还原单个数据库(需先创建空库)mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS db_name;"mysql -u root -p db_name < backup_db.sql# 还原所有数据库(直接导入 all_databases.sql)mysql -u root -p < all_databases.sql
使用 myloader(mydumper 配套工具)还原:
myloader -u root -p 密码 -h localhost -P 3306 -t 4 -d /backup/mydumper/db_name # -d 指定备份目录
sudo systemctl stop mysql
/var/lib/mysql):sudo rm -rf /var/lib/mysql/*
sudo cp -r /backup/xtrabackup/full/20231001/* /var/lib/mysql/
mysql:mysql):sudo chown -R mysql:mysql /var/lib/mysql
sudo systemctl start mysql
db_test_20231001_full.sql.gz)。gzip 或 mydumper 内置压缩(节省存储空间)。openssl 加密备份文件(如 mysqldump ... | openssl enc -aes-256-cbc -salt -pass pass:密钥 > backup.sql.enc)。锁表风险:
mysqldump 默认对 MyISAM 表锁表,InnoDB 表建议加 --single-transaction 选项(事务快照备份,不锁表)。字符集问题:
备份/还原时指定字符集(如 --default-character-set=utf8mb4),避免乱码:
mysqldump -u root -p --default-character-set=utf8mb4 db_name > backup.sqlmysql -u root -p --default-character-set=utf8mb4 db_name < backup.sql
权限问题:
备份用户需有 SELECT、SHOW VIEW、TRIGGER、LOCK TABLES(非事务表)权限。
Binlog 开启:
点-in-time恢复需开启 Binlog,在 my.cnf 中配置:
[mysqld]log_bin = /var/log/mysql/mysql-bin.logbinlog_format = ROW # 推荐 ROW 格式(记录行变更)expire_logs_days = 7 # Binlog 保留 7 天
mysqldump 逻辑备份(简单、兼容),命令示例:mysqldump -u root -p --single-transaction --routines --triggers db_name | gzip > db_name_$(date +%Y%m%d).sql.gz
Percona XtraBackup 物理热备(高速、低影响),结合 Binlog 实现 PITR。通过合理选择工具和策略,可最大化保障 MySQL 数据安全与业务连续性。