Debian 上 MySQL 数据库恢复实操指南
一、恢复前准备
- 确认备份类型与完整性:常见为 逻辑备份(mysqldump 生成的 .sql/.sql.gz) 与 物理备份(如 Percona XtraBackup)。优先使用最近一次且校验通过的备份。
- 准备恢复环境:安装同版本 MySQL/MariaDB,确保磁盘空间充足,备份文件存放在 非数据库本地磁盘或远程存储,并设置最小权限的备份专用账户。
- 规划恢复窗口与一致性:尽量在 维护时段 进行;如为业务库,提前通知并准备 只读/维护模式。
- 建议先演练:在 测试环境 完整走一遍恢复流程,验证表数量、数据量、主外键、触发器、存储过程及视图是否正常。
二、使用 mysqldump 逻辑备份恢复
- 基本步骤
- 如有同名库,先做好导出或重命名:
mysql -u root -p -e “SHOW CREATE DATABASE `your_db`\G”
- 创建目标库(如备份不含 CREATE DATABASE):
mysql -u root -p -e “CREATE DATABASE IF NOT EXISTS `your_db` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;”
- 导入备份:
- 未压缩:mysql -u root -p your_db < /backup/your_db.sql
- 已压缩:zcat /backup/your_db.sql.gz | mysql -u root -p your_db
- 验证:
mysql -u root -p -e “USE your_db; SHOW TABLES; SELECT COUNT(*) FROM your_table;”
- 单表恢复
- 仅导入某表:mysql -u root -p your_db < /backup/your_table.sql
- 或在交互中:USE your_db; SOURCE /backup/your_table.sql;
- 注意事项
- 若备份包含 CREATE DATABASE,导入时不要在命令中指定库名,避免库名冲突。
- 大库建议按表或分库分批导入,降低失败回滚成本。
三、基于二进制日志的时间点恢复 PITR
- 前提条件
- 已启用 二进制日志(Binlog):SHOW VARIABLES LIKE ‘log_bin’; 返回值为 ON。
- 具备从上一次全量备份到故障前的 连续 binlog 文件,且这些文件未损坏、未缺失。
- 操作步骤
- 先做全量恢复到最近一次备份:mysql -u root -p your_db < /backup/full_2025-04-01.sql
- 定位恢复时间窗口(示例窗口:2025-04-01 02:00:00 ~ 2025-04-01 03:00:00):
mysql -u root -p -e “SHOW MASTER STATUS\G”
- 使用 mysqlbinlog 重放增量:
mysqlbinlog
–start-datetime=“2025-04-01 02:00:00”
–stop-datetime=“2025-04-01 03:00:00”
/var/log/mysql/mysql-bin.00000[1-9]*
| mysql -u root -p your_db
- 如为 GTID 环境,优先使用 --skip-gtids 避免 GTID 冲突:
mysqlbinlog --skip-gtids … | mysql -u root -p your_db
- 验证增量是否生效:核对关键表行数、业务关键指标。
- 提示
- 若仅需回滚某张表的误操作,可结合 –database、表名过滤与时间窗口精确回放。
四、物理备份恢复 Percona XtraBackup
- 适用场景
- InnoDB 为主、数据量大、需要 热备/快速恢复 的生产环境。
- 基本流程
- 安装工具:apt install percona-xtrabackup
- 准备备份(回滚未提交事务,使备份一致性就绪):
xtrabackup --prepare --target-dir=/backup/xtra_20250401/
- 停止 MySQL:systemctl stop mysql
- 备份并替换数据目录(路径以实际配置为准,常见为 /var/lib/mysql):
- 先备份原目录:mv /var/lib/mysql /var/lib/mysql.bak_$(date +%F)
- 拷贝恢复:xtrabackup --copy-back --target-dir=/backup/xtra_20250401/
- 修正权限并启动:
chown -R mysql:mysql /var/lib/mysql
systemctl start mysql
- 验证:登录 MySQL 检查库表与数据。
- 注意
- 恢复前后 server-id、innodb_log_file_size 等配置需与备份时一致;如为 压缩/加密 备份,使用相应参数。
五、常见故障与应急
- 误删数据目录或数据文件
- 先安装同版本 MySQL 以恢复服务框架:apt-get update && apt-get install --reinstall mysql-server
- 若有备份,按上文逻辑或物理方式恢复;若无备份,仅能尝试第三方工具或专业数据恢复服务,成功率不保证。
- 恢复后权限或对象缺失
- 导入用户与权限:mysql -u root -p < /backup/mysql_users.sql(若备份包含 mysql 库)
- 检查视图/存储过程/触发器是否可用:SHOW FULL TABLES WHERE TABLE_TYPE=‘VIEW’; SHOW PROCEDURE STATUS; SHOW TRIGGERS;
- 最佳实践清单
- 定期做 全量 + 增量(Binlog),并 异地/多副本 保存;
- 定期 恢复演练 与 校验(校验和、行数、抽样查询);
- 重要操作前对当前实例做快照或额外备份。