Skip to content

MySQL 恢复步骤

完整恢复

准备工作

  • 确认备份文件完整性
  • 准备恢复环境
  • 规划恢复时间窗口
  • 通知相关人员
  • 准备必要的工具和权限

恢复步骤

1. 停止服务

bash
# 停止应用服务
systemctl stop application.service

# 停止MySQL服务
systemctl stop mysql.service

2. 清理数据目录

bash
# 备份原有数据目录
mv /var/lib/mysql /var/lib/mysql.bak

# 创建新的数据目录
mkdir -p /var/lib/mysql
chown mysql:mysql /var/lib/mysql

3. 从完整备份恢复

bash
# 使用xtrabackup恢复
xtrabackup --copy-back --target-dir=/backup/full_backup

# 或使用mysqldump恢复
mysql -u root -p < /backup/full_backup.sql

4. 调整权限

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

5. 启动服务

bash
# 启动MySQL服务
systemctl start mysql.service

# 启动应用服务
systemctl start application.service

6. 验证恢复

bash
# 检查服务状态
systemctl status mysql.service

# 验证数据完整性
mysql -u root -p -e "SELECT COUNT(*) FROM important_table;"

点恢复

准备工作

  • 确认完整备份和增量备份文件
  • 准备恢复环境
  • 规划恢复时间点
  • 通知相关人员

恢复步骤

1. 停止服务

bash
# 停止应用服务
systemctl stop application.service

# 停止MySQL服务
systemctl stop mysql.service

2. 清理数据目录

bash
# 备份原有数据目录
mv /var/lib/mysql /var/lib/mysql.bak

# 创建新的数据目录
mkdir -p /var/lib/mysql
chown mysql:mysql /var/lib/mysql

3. 恢复完整备份

bash
# 使用xtrabackup恢复完整备份
xtrabackup --copy-back --target-dir=/backup/full_backup

# 调整权限
chown -R mysql:mysql /var/lib/mysql

4. 应用增量备份

bash
# 启动MySQL服务到只读模式
systemctl start mysql.service

# 应用增量备份
xtrabackup --prepare --apply-log --target-dir=/backup/incremental_backup

# 或使用二进制日志恢复到指定时间点
mysqlbinlog /var/lib/mysql/binlog.000001 | mysql -u root -p

5. 启动服务

bash
# 启动MySQL服务
systemctl start mysql.service

# 启动应用服务
systemctl start application.service

6. 验证恢复

bash
# 检查服务状态
systemctl status mysql.service

# 验证数据完整性
mysql -u root -p -e "SELECT COUNT(*) FROM important_table;"

# 验证指定时间点的数据
mysql -u root -p -e "SELECT * FROM important_table WHERE created_at < '2023-01-01';"

增量恢复

准备工作

  • 确认完整备份和增量备份文件
  • 准备恢复环境
  • 规划恢复策略
  • 通知相关人员

恢复步骤

1. 停止服务

bash
# 停止应用服务
systemctl stop application.service

# 停止MySQL服务
systemctl stop mysql.service

2. 清理数据目录

bash
# 备份原有数据目录
mv /var/lib/mysql /var/lib/mysql.bak

# 创建新的数据目录
mkdir -p /var/lib/mysql
chown mysql:mysql /var/lib/mysql

3. 恢复完整备份

bash
# 使用xtrabackup恢复完整备份
xtrabackup --copy-back --target-dir=/backup/full_backup

# 调整权限
chown -R mysql:mysql /var/lib/mysql

4. 应用增量备份

bash
# 应用第一个增量备份
xtrabackup --prepare --apply-log --target-dir=/backup/full_backup --incremental-dir=/backup/incremental_1

# 应用第二个增量备份
xtrabackup --prepare --apply-log --target-dir=/backup/full_backup --incremental-dir=/backup/incremental_2

# 复制到数据目录
cp -r /backup/full_backup/* /var/lib/mysql/

# 调整权限
chown -R mysql:mysql /var/lib/mysql

5. 启动服务

bash
# 启动MySQL服务
systemctl start mysql.service

# 启动应用服务
systemctl start application.service

6. 验证恢复

bash
# 检查服务状态
systemctl status mysql.service

# 验证数据完整性
mysql -u root -p -e "SELECT COUNT(*) FROM important_table;"

# 验证增量数据
mysql -u root -p -e "SELECT * FROM important_table WHERE updated_at BETWEEN '2023-01-01' AND '2023-01-31';"

单表恢复

准备工作

  • 确认备份文件
  • 准备测试环境
  • 规划恢复策略
  • 通知相关人员

恢复步骤

1. 从备份中提取单表

bash
# 使用mysqldump备份提取
mysql -u root -p -e "CREATE DATABASE temp_db;"
mysql -u root -p temp_db < /backup/full_backup.sql

# 或使用mysqlbinlog提取
mysqlbinlog /var/lib/mysql/binlog.000001 | grep -A 100 "CREATE TABLE important_table" > /tmp/table_backup.sql

2. 恢复单表

bash
# 恢复到测试数据库
mysql -u root -p temp_db < /tmp/table_backup.sql

# 或使用mysqlimport
mysqlimport -u root -p temp_db /path/to/table_data.txt

3. 验证数据

bash
# 检查表结构
mysql -u root -p -e "DESCRIBE temp_db.important_table;"

# 检查数据量
mysql -u root -p -e "SELECT COUNT(*) FROM temp_db.important_table;"

# 检查数据内容
mysql -u root -p -e "SELECT * FROM temp_db.important_table LIMIT 10;"

从二进制日志恢复

准备工作

  • 确认二进制日志文件完整性
  • 确定恢复时间点
  • 准备恢复环境
  • 通知相关人员

恢复步骤

1. 查看二进制日志内容

bash
# 查看二进制日志文件列表
ls -la /var/lib/mysql/binlog.*

# 查看二进制日志内容
mysqlbinlog /var/lib/mysql/binlog.000001 | head -100

2. 提取指定时间范围的日志

bash
# 提取从指定时间开始的日志
mysqlbinlog --start-datetime='2023-01-01 00:00:00' /var/lib/mysql/binlog.000001 > /tmp/recovery.sql

# 提取指定时间范围的日志
mysqlbinlog --start-datetime='2023-01-01 00:00:00' --stop-datetime='2023-01-01 12:00:00' /var/lib/mysql/binlog.000001 > /tmp/recovery.sql

3. 恢复数据

bash
# 恢复到测试数据库
mysql -u root -p temp_db < /tmp/recovery.sql

4. 验证恢复

bash
# 检查数据完整性
mysql -u root -p -e "SELECT COUNT(*) FROM temp_db.important_table;"

# 检查恢复时间点的数据
mysql -u root -p -e "SELECT * FROM temp_db.important_table WHERE created_at BETWEEN '2023-01-01 00:00:00' AND '2023-01-01 12:00:00' LIMIT 10;"

异地恢复

准备工作

  • 确认备份文件可访问
  • 准备网络连接
  • 规划带宽和时间
  • 通知相关人员

恢复步骤

1. 传输备份文件

bash
# 使用scp传输
scp -r /backup/* remote_user@remote_host:/remote/backup/

# 或使用rsync
rsync -avz /backup/ remote_user@remote_host:/remote/backup/

2. 在异地环境恢复

bash
# 登录异地服务器
ssh remote_user@remote_host

# 执行恢复步骤
xtrabackup --copy-back --target-dir=/remote/backup/full_backup

# 调整权限
chown -R mysql:mysql /var/lib/mysql

# 启动服务
systemctl start mysql.service

3. 验证异地恢复

bash
# 检查服务状态
systemctl status mysql.service

# 验证数据完整性
mysql -u root -p -e "SELECT COUNT(*) FROM important_table;"

恢复后验证

数据完整性验证

bash
# 检查关键表数据量
mysql -u root -p -e "SELECT table_name, table_rows FROM information_schema.tables WHERE table_schema = 'important_db';"

# 检查数据一致性
mysql -u root -p -e "CHECK TABLE important_table;"

# 验证业务数据
mysql -u root -p -e "SELECT * FROM important_table WHERE id IN (1, 100, 1000);"

性能验证

bash
# 测量查询性能
mysql -u root -p -e "SELECT BENCHMARK(10000, SELECT * FROM important_table WHERE id = 1);"

# 检查恢复时间
# 记录从开始到完成的总时间

服务验证

bash
# 检查连接数
mysql -u root -p -e "SHOW GLOBAL STATUS LIKE 'Threads_connected';"

# 检查服务状态
systemctl status mysql.service

# 检查应用连接
mysql -u root -p -e "SHOW PROCESSLIST;"

常见问题处理

备份文件损坏

  • 症状:恢复过程中报错
  • 处理:尝试使用其他备份文件,检查备份完整性

权限错误

  • 症状:权限被拒绝错误
  • 处理:调整文件权限,确保mysql用户有访问权限

空间不足

  • 症状:磁盘空间不足错误
  • 处理:清理临时文件,扩展磁盘空间

服务启动失败

  • 症状:MySQL服务无法启动
  • 处理:检查错误日志,修复配置问题

恢复最佳实践

文档化

  • 记录每次恢复过程
  • 文档化恢复步骤和时间
  • 建立恢复手册

定期测试

  • 每月执行测试恢复
  • 测试不同类型的备份恢复
  • 模拟故障场景

优化

  • 根据恢复时间优化备份策略
  • 调整备份频率
  • 优化恢复流程
  • 自动化恢复步骤

监控

  • 监控恢复时间
  • 监控备份完整性
  • 监控存储空间使用
  • 监控恢复成功率

常见问题(FAQ)

Q1: 如何确定恢复时间目标(RTO)?

A1: 确定RTO的方法:

  • 分析业务需求和影响
  • 测试不同场景的恢复时间
  • 参考行业标准
  • 平衡恢复时间和资源消耗

Q2: 如何处理增量备份链断裂?

A2: 处理方法:

  • 立即创建新的完整备份
  • 验证现有备份的完整性
  • 重建增量备份链
  • 调整备份策略

Q3: 恢复过程中如何最小化 downtime?

A3: 减少downtime的方法:

  • 使用并行恢复
  • 优化恢复流程
  • 准备预配置的恢复环境
  • 使用增量恢复

Q4: 如何自动化恢复过程?

A4: 自动化方法:

  • 编写恢复脚本
  • 使用自动化工具
  • 集成监控系统
  • 定期演练自动恢复

Q5: 跨版本恢复需要注意什么?

A5: 跨版本恢复注意事项:

  • 检查版本兼容性
  • 测试跨版本恢复
  • 备份前确认版本信息
  • 准备回滚方案