MySQL 定期备份与还原指南

MySQL 定期备份与还原指南

MySQL 数据库的定期备份和还原是数据库管理的关键任务。以下是完整的备份和还原方案,包含多种方法和自动化策略:

一、备份方法

1. mysqldump (逻辑备份)

特点:最常用的备份工具,生成 SQL 文件,适合中小型数据库

# 备份单个数据库

mysqldump -u [用户名] -p[密码] [数据库名] > backup.sql

# 备份所有数据库

mysqldump -u [用户名] -p[密码] --all-databases > all_backup.sql

# 压缩备份

mysqldump -u [用户名] -p[密码] [数据库名] | gzip > backup.sql.gz

# 示例(备份名为 mydb 的数据库)

mysqldump -u root -p'your_password' mydb > /backups/mydb_$(date +%F).sql

2. mysqlhotcopy (物理备份)

特点:快速备份 MyISAM 表,仅适用于存储引擎为 MyISAM 的表

mysqlhotcopy -u [用户名] -p [密码] [数据库名] /备份目录

3. Percona XtraBackup (物理热备份)

特点:开源热备份工具,支持 InnoDB/XtraDB,适合大型数据库

# 全量备份

xtrabackup --backup --user=[用户名] --password=[密码] --target-dir=/backups/full

# 增量备份

xtrabackup --backup --user=[用户名] --password=[密码] --target-dir=/backups/inc1 \

--incremental-basedir=/backups/full

4. MySQL Enterprise Backup (商业版)

特点:MySQL 官方企业级备份工具

mysqlbackup --user=[用户名] --password=[密码] --backup-dir=/backups backup

二、定期备份自动化

1. 使用 Linux cron 定时任务

创建备份脚本 /usr/local/bin/mysql_backup.sh:

#!/bin/bash

# 配置

USER="root"

PASSWORD="your_secure_password"

BACKUP_DIR="/backups/mysql"

DATE=$(date +%F)

RETENTION=30 # 保留天数

# 创建备份目录

mkdir -p $BACKUP_DIR/$DATE

# 备份所有数据库

mysqldump -u$USER -p$PASSWORD --all-databases --single-transaction | gzip > $BACKUP_DIR/$DATE/full_backup.sql.gz

# 备份重要数据库(单独备份)

mysqldump -u$USER -p$PASSWORD --databases db1 db2 | gzip > $BACKUP_DIR/$DATE/important_dbs.sql.gz

# 删除旧备份

find $BACKUP_DIR -type d -mtime +$RETENTION -exec rm -rf {} \;

设置可执行权限:

chmod +x /usr/local/bin/mysql_backup.sh

添加 cron 任务(每天凌晨 2 点执行):

crontab -e

# 添加以下行

0 2 * * * /usr/local/bin/mysql_backup.sh

2. 使用 Windows 任务计划程序

创建备份脚本 mysql_backup.bat:

@echo off

set DATE=%date:~0,4%-%date:~5,2%-%date:~8,2%

"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqldump.exe" -u root -pyour_password --all-databases > "C:\Backups\mysql\%DATE%\full_backup.sql"

在任务计划程序中创建新任务:

触发器:每天凌晨 2 点

操作:启动程序 mysql_backup.bat

三、备份策略建议

备份类型

频率

保留时间

适用场景

全量备份

每周

1个月

基础备份

增量备份

每天

1周

大型数据库

二进制日志备份

每小时

7天

点时间恢复

云存储快照

每天

30天

云环境

四、还原方法

1. 从 mysqldump 还原

# 还原单个数据库

mysql -u [用户名] -p[密码] [数据库名] < backup.sql

# 还原所有数据库

mysql -u [用户名] -p[密码] < full_backup.sql

# 还原压缩备份

gunzip < backup.sql.gz | mysql -u [用户名] -p[密码] [数据库名]

2. 从 Percona XtraBackup 还原

# 准备全量备份

xtrabackup --prepare --target-dir=/backups/full

# 停止 MySQL

systemctl stop mysql

# 清空数据目录(谨慎操作)

rm -rf /var/lib/mysql/*

# 恢复备份

xtrabackup --copy-back --target-dir=/backups/full

# 设置权限

chown -R mysql:mysql /var/lib/mysql

# 启动 MySQL

systemctl start mysql

3. 点时间恢复 (PITR)

# 1. 还原最近的全量备份

mysql -u root -p < full_backup.sql

# 2. 应用二进制日志

mysqlbinlog --start-datetime="2023-10-01 00:00:00" \

--stop-datetime="2023-10-01 12:00:00" \

binlog.000001 | mysql -u root -p

五、高级备份方案

1. 主从复制 + 从库备份

graph LR

A[主库] -->|复制| B[从库1]

A -->|复制| C[从库2]

C -->|备份| D[备份服务器]

2. 云数据库备份方案

AWS RDS:自动备份 + 手动快照

Google Cloud SQL:按计划备份

Azure Database for MySQL:自动备份 + 长期保留

3. 使用备份工具

mydumper/myloader:并行备份/恢复工具

# 备份

mydumper -u [用户] -p [密码] -B [数据库] -o /backup_dir

# 恢复

myloader -u [用户] -p [密码] -d /backup_dir

BorgBackup:去重压缩备份

ZFS/Btrfs:文件系统级快照

六、备份验证与监控

1. 定期验证备份

# 创建测试数据库

mysql -u root -p -e "CREATE DATABASE backup_test"

# 还原备份到测试数据库

gunzip < backup.sql.gz | mysql -u root -p backup_test

# 检查数据完整性

mysql -u root -p backup_test -e "SELECT COUNT(*) FROM important_table"

2. 监控备份状态

使用 Nagios/Zabbix/Prometheus 监控:

备份文件大小

备份完成时间

备份文件完整性(MD5校验)

存储空间使用情况

3. 备份加密

# 使用 GPG 加密备份

mysqldump -u root -p db | gzip | gpg --encrypt --recipient backup@company.com > backup.sql.gz.gpg

# 解密还原

gpg --decrypt backup.sql.gz.gpg | gunzip | mysql -u root -p db

七、灾难恢复计划

恢复优先级:

关键业务数据库(1小时内恢复)

重要业务数据库(4小时内恢复)

其他数据库(24小时内恢复)

恢复流程:

graph TD

A[发现故障] --> B[评估影响]

B --> C{是否硬件故障?}

C -->|是| D[更换硬件]

C -->|否| E[确定恢复点]

E --> F[选择备份]

F --> G[执行恢复]

G --> H[验证数据]

H --> I[恢复服务]

恢复测试:

每季度执行一次恢复演练

记录恢复时间指标(RTO/RPO)

更新恢复文档

八、最佳实践

3-2-1 备份原则:

至少保留3份备份

使用2种不同存储介质

1份异地备份

自动化验证:

# 每周自动验证备份

0 3 * * 0 /usr/local/bin/verify_backup.sh

安全措施:

备份文件设置严格权限(600)

使用专用备份账户(最小权限)

备份文件加密存储

定期轮换备份密码

文档记录:

维护备份恢复手册

记录每次备份大小和时间

保存关键恢复命令

通过实施这些策略,您可以确保 MySQL 数据库的安全性和可恢复性。定期测试恢复流程至关重要,它能确保在真正需要时备份是有效的。