Debian 上 MySQL 数据库恢复指南
一 准备与环境检查
- 确认 MySQL 服务状态:sudo systemctl status mysql;如准备做一致性导入,可先停止写入(必要时执行 sudo systemctl stop mysql)。
- 备份当前数据与配置:sudo cp -a /var/lib/mysql /var/lib/mysql.bak_$(date +%F_%T);sudo cp /etc/mysql /etc/mysql.bak_$(date +%F_%T)。
- 准备恢复所需账号与权限:确保用于恢复的 MySQL 用户具备对目标库的 CREATE、DROP、INSERT、ALTER 等权限。
- 校验备份完整性与空间:ls -lh /path/to/backup.sql*;df -h;gzip -t /path/to/backup.sql.gz。
- 建议在非生产环境演练,避免不可逆操作。
二 使用 mysqldump 逻辑备份恢复(最常用)
- 场景:已有 .sql 或 .sql.gz 的 逻辑备份。
- 步骤:
- 如恢复到新库,先在 MySQL 中创建空库:CREATE DATABASE IF NOT EXISTS your_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 导入备份:
- 未压缩:mysql -u root -p your_db < /path/to/backup.sql
- 已压缩:zcat /path/to/backup.sql.gz | mysql -u root -p your_db
- 验证:SELECT COUNT(*) FROM your_table; 或检查表结构与数据量。
- 全库恢复:mysql -u root -p < full_backup.sql(会重建所有库表,谨慎执行)。
三 时间点恢复 使用二进制日志 Binary Log
- 适用:已有全量备份,且 binlog 已开启,需要恢复到故障前的任意时间点。
- 步骤:
- 检查是否开启 binlog:SHOW VARIABLES LIKE ‘log_bin’; 如为 ON 继续;查看当前文件与位置:SHOW MASTER STATUS;
- 定位时间或位置范围:
- 按时间:mysqlbinlog --start-datetime=“2025-12-28 10:00:00” --stop-datetime=“2025-12-28 10:05:00” /var/lib/mysql/mysql-bin.00000* > inc.sql
- 按位置:mysqlbinlog --start-position=154 --stop-position=123456 /var/lib/mysql/mysql-bin.00000* > inc.sql
- 重放增量:mysql -u root -p < inc.sql
- 校验数据一致性与业务状态。
- 提示:确保 binlog 文件完整且未被轮转覆盖;生产环境建议先演练。
四 物理备份恢复 使用 Percona XtraBackup
- 适用:需要快速全量恢复、或 InnoDB 大库,要求尽量接近崩溃前的状态。
- 步骤:
- 安装工具(Debian 可用 apt):sudo apt-get install percona-xtrabackup-24
- 准备备份(回滚未提交事务):xtrabackup --prepare --target-dir=/backup/full_20251228
- 停止 MySQL:sudo systemctl stop mysql
- 清空数据目录(谨慎):sudo rm -rf /var/lib/mysql/*
- 拷贝回数据:sudo xtrabackup --copy-back --target-dir=/backup/full_20251228
- 修正权限:sudo chown -R mysql:mysql /var/lib/mysql
- 启动:sudo systemctl start mysql
- 说明:XtraBackup 为物理备份,恢复速度快,但要求版本匹配与目录布局一致。
五 常见问题与注意事项
- 恢复前尽量停止写入或切换到维护模式,避免导入期间产生新数据导致不一致。
- 压缩备份请先校验:gzip -t;导入失败可分段执行或查看 .sql 头部/尾部错误定位问题。
- 权限与字符集:创建库时显式指定 utf8mb4,导入用户具备足够权限;避免误删库后无备份可用。
- 时间点恢复务必确认 binlog 开启与保留策略,并优先在测试环境演练。
- 重要业务建议建立定期备份 + 定期恢复演练机制,确保备份可用。