一、全量备份
1. 逻辑备份(Logical Backup)
原理:通过 SQL 语句导出数据库结构和数据,适用于小型数据库或跨版本迁移。
操作步骤:
# 备份单个数据库
mysqldump -u [用户名] -p[密码] --databases [数据库名] > backup_full.sql
# 备份所有数据库(包含系统库)
mysqldump -u root -p --all-databases --master-data=2 --single-transaction > backup_full.sql
# 关键参数说明:
# --master-data=2 记录二进制日志位置(用于增量恢复)
# --single-transaction 保证InnoDB表一致性(需事务支持)
# --flush-logs 刷新日志,方便后续增量备份
2. 物理备份(Physical Backup)
原理:直接复制数据文件(/var/lib/mysql),适用于大型数据库,速度快但依赖存储引擎。
操作步骤(使用 Percona XtraBackup):
# 安装 Percona XtraBackup
sudo apt-get install percona-xtrabackup-80
# 执行全量备份
xtrabackup --backup --user=[用户名] --password=[密码] --target-dir=/path/to/backup/full
# 准备备份(使数据文件一致)
xtrabackup --prepare --target-dir=/path/to/backup/full
3. 全量备份恢复
逻辑备份恢复:
mysql -u root -p < backup_full.sql
物理备份恢复:
# 停止MySQL服务
systemctl stop mysql
# 恢复文件
xtrabackup --copy-back --target-dir=/path/to/backup/full
# 修改文件权限
chown -R mysql:mysql /var/lib/mysql
# 启动MySQL
systemctl start mysql
二、增量备份
1. 基于二进制日志(Binary Log)
原理:记录所有数据更改操作,需结合全量备份使用。
操作步骤:
- 启用二进制日志(在 my.cnf 中配置):
[mysqld]
log-bin=mysql-bin
server-id=1
- 全量备份后记录日志位置:
SHOW MASTER STATUS;
-- 输出示例:File: mysql-bin.000001, Position: 154
- 增量备份操作:
# 刷新日志生成新的二进制文件
mysqladmin -u root -p flush-logs
# 备份前一个二进制日志(例如 mysql-bin.000001)
cp /var/lib/mysql/mysql-bin.000001 /backup/incremental/
2. 使用 XtraBackup 增量备份
原理:仅备份自上次全量/增量备份以来更改的数据页。
操作步骤:
# 第一次增量备份(基于全量备份)
xtrabackup --backup --user=root --password=[密码] \
--target-dir=/path/to/inc1 \
--incremental-basedir=/path/to/full
# 后续增量备份(基于前一次增量)
xtrabackup --backup --user=root --password=[密码] \
--target-dir=/path/to/inc2 \
--incremental-basedir=/path/to/inc1
# 准备恢复(合并所有增量到全量备份)
trabackup --prepare --apply-log-only --target-dir=/path/to/full
xtrabackup --prepare --apply-log-only --target-dir=/path/to/full --incremental-dir=/path/to/inc1
xtrabackup --prepare --target-dir=/path/to/full --incremental-dir=/path/to/inc2
三、增量恢复
1. 基于二进制日志的恢复
场景:从全量备份 + 增量二进制日志恢复到指定时间点。
操作步骤:
- 恢复全量备份:
mysql -u root -p < backup_full.sql
- 应用二进制日志:
# 恢复到特定时间点
mysqlbinlog --start-position=154 --stop-datetime="2023-10-01 12:00:00" \
/backup/incremental/mysql-bin.000001 | mysql -u root -p
# 或恢复所有增量日志
mysqlbinlog /backup/incremental/mysql-bin.* | mysql -u root -p
2. XtraBackup 增量恢复
# 合并全量和增量备份后,执行物理恢复
xtrabackup --copy-back --target-dir=/path/to/full
四、注意事项
- 备份一致性:
- InnoDB 使用 --single-transaction 避免锁表。
- MyISAM 需使用 --lock-all-tables。
- 二进制日志管理:
- 定期清理过期日志:PURGE BINARY LOGS BEFORE '2023-10-01';
- 使用 expire_logs_days 自动过期日志。
- 验证备份:
- 检查备份文件完整性(如 grep "Dump completed" backup_full.sql)。
- 在测试环境恢复验证。
- 自动化备份:
- 使用 cron 定时任务:
0 2 * * * /usr/bin/mysqldump -u root -p[密码] --all-databases > /backup/full_$(date +\%F).sql
- 存储安全:
- 备份文件加密(如 openssl 或 gpg)。
- 异地存储(云存储、NAS)。
五、高级场景
- 时间点恢复(PITR):
mysqlbinlog --start-datetime="2023-10-01 00:00:00" --stop-datetime="2023-10-01 12:00:00" \
mysql-bin.000001 | mysql -u root -p
- 部分数据库恢复:
# 从全量备份提取单个数据库
sed -n '/^-- Current Database: `mydb`/,/^-- Current Database: `/p' backup_full.sql > mydb.sql
- 并行备份加速:
mydumper -u root -p [密码] -B mydb -T table1,table2 -t 4 -o /backup/