备份与恢复
约 1131 字大约 4 分钟
布欧-Lewyon
2026-05-15
首页 › MySQL › 运维与部署(在新窗口打开) › 备份与恢复
备份是数据库运维中最重要的工作。"没有备份"不是运维事故,而是灾难。本节覆盖逻辑备份(mysqldump)、物理备份(XtraBackup)和基于 binlog 的时间点恢复。
备份策略概览
mysqldump——逻辑备份
备份整个库
# 备份单个库
mysqldump -u root -p --databases demo > demo_backup.sql
# 备份多个库
mysqldump -u root -p --databases demo blog > multi_backup.sql
# 备份所有库
mysqldump -u root -p --all-databases > all_backup.sql
# 备份单张表
mysqldump -u root -p demo employee > employee_table.sql常用参数
# 生产环境常用参数组合
mysqldump -u root -p \
--single-transaction \ # InnoDB 一致性读,不加锁
--routines \ # 备份存储过程和函数
--triggers \ # 备份触发器
--events \ # 备份事件
--set-gtid-purged=OFF \ # 不输出 GTID 信息(非 GTID 复制时)
--hex-blob \ # 二进制字段以十六进制导出
demo > demo_backup.sql| 参数 | 说明 |
|---|---|
--single-transaction | 用事务快照保证一致性,不锁表(仅 InnoDB) |
--lock-tables | 锁表(MyISAM 必需,不推荐新项目) |
--quick | 逐行读取,不缓存到内存(大表必加) |
--where | 只导部分数据 |
--no-data | 只导结构,不导数据 |
--result-file | 输出到文件(避免 shell 编码问题) |
恢复
# 方法一:直接重定向
mysql -u root -p demo < demo_backup.sql
# 方法二:source 命令(在 mysql 客户端内)
mysql> source /path/to/demo_backup.sqlmysqlpump——增强版逻辑备份
MySQL 5.7+ 提供的 mysqlpump 支持并行备份:
# 并行导出(4线程)
mysqlpump -u root -p \
--default-parallelism=4 \
--include-databases=demo \
> demo_pump.sql-- mysqlpump 备份文件的恢复
mysql -u root -p < demo_pump.sqlXtraBackup——物理备份
XtraBackup 是 Percona 提供的开源物理备份工具,支持 InnoDB 热备。
# 安装
brew install percona-xtrabackup # macOS
apt install percona-xtrabackup-84 # Ubuntu
# 全量备份
xtrabackup --backup \
--target-dir=/data/backup/full \
--user=root --password=...
# 准备(应用 Redo Log 使备份一致)
xtrabackup --prepare \
--target-dir=/data/backup/full
# 恢复到 MySQL 数据目录
xtrabackup --copy-back \
--target-dir=/data/backup/full \
--datadir=/var/lib/mysql全量 + 增量备份
# 第1天:全量
xtrabackup --backup --target-dir=/data/backup/full --user=root --password=...
# 第2天:增量(基于全量)
xtrabackup --backup \
--target-dir=/data/backup/inc1 \
--incremental-basedir=/data/backup/full \
--user=root --password=...
# 恢复:先准备全量,再合并增量
xtrabackup --prepare --apply-log-only --target-dir=/data/backup/full
xtrabackup --prepare --apply-log-only \
--target-dir=/data/backup/full \
--incremental-dir=/data/backup/inc1
# 最终回滚未提交事务
xtrabackup --prepare --target-dir=/data/backup/fullbinlog 时间点恢复
binlog 记录所有数据变更,配合全量备份可实现"恢复到任意时间点"。
开启 binlog
[mysqld]
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW # 推荐 ROW 格式
binlog_expire_logs_seconds = 604800 # 保留 7 天查看 binlog
-- 查看 binlog 文件列表
SHOW BINARY LOGS;
-- 查看当前正在写入的 binlog
SHOW MASTER STATUS;
-- 查看 binlog 内容
SHOW BINLOG EVENTS IN 'mysql-bin.000001' LIMIT 10;mysqlbinlog 工具
# 查看 binlog 内容(文本格式)
mysqlbinlog /var/log/mysql/mysql-bin.000001
# 恢复到指定的时间点
mysqlbinlog --stop-datetime="2026-05-15 14:30:00" mysql-bin.000001 | mysql -u root -p
# 恢复到指定的 position
mysqlbinlog --stop-position=12345 mysql-bin.000001 | mysql -u root -p
# 跳过误操作(如 DROP TABLE)
mysqlbinlog --stop-position=1000 mysql-bin.000001 \
| mysql -u root -p
# 从特定位置开始重放
mysqlbinlog --start-position=2000 mysql-bin.000001 | mysql -u root -p完整恢复流程
# 1. 恢复最近的全量备份
mysql -u root -p < /data/backup/full_dump.sql
# 2. 恢复全量之后的增量 binlog(到指定的时间点)
mysqlbinlog \
--start-datetime="2026-05-15 03:00:00" \ # 全量备份完成时间
--stop-datetime="2026-05-15 14:25:00" \ # 误操作前的时间点
mysql-bin.000001 mysql-bin.000002 \
| mysql -u root -p备份检验与演练
# 定期检验备份的有效性
# 在测试环境恢复并做数据校验
mysql -u root -p test < /data/backup/latest.sql
# 查询行数、最新记录等
mysql -u root -p -e "SELECT COUNT(*) FROM demo.employee;"重要:备份文件需要定期做恢复演练。无法恢复的备份等于没有备份。
小结
| 备份方式 | 优点 | 缺点 | 场景 |
|---|---|---|---|
| mysqldump | 简单、跨版本、可部分恢复 | 大表慢 | 小数据量、迁移 |
| mysqlpump | 并行导出,更快 | MySQL 特有 | 中等数据量 |
| XtraBackup | 速度快、可做增量 | 需额外安装 | 大数据量 |
| binlog | 支持时间点恢复 | 需全量配合 | 灾难恢复 |
- 推荐策略:每周全量(XtraBackup)+ 每日增量 + binlog 实时。
- 备份文件放在不同存储(远程服务器/对象存储)。
- 定期演练恢复流程,确保关键时刻能用。
