Ubuntu 上 MySQL 数据丢失的处置与恢复
一、先稳住现场
- 立刻停止写入:将应用切换到只读/维护模式,避免产生新的INSERT/UPDATE/DELETE,降低可恢复数据的二次覆盖风险。
- 保护现场:对当前数据目录与配置做一次完整拷贝,例如:sudo cp -a /var/lib/mysql /var/lib/mysql_backup_$(date +%F_%T);同时备份配置文件(如 /etc/mysql/ 下的 my.cnf/my.ini)。
- 快速自检:登录 MySQL 检查关键库表是否存在、数据量是否异常,记录时间点与操作人,便于后续定位。
- 规划恢复目标:明确是恢复到某个时间点(PITR)还是恢复到上一次备份,据此选择恢复路径。
二、有备份时的恢复
- SQL 转储备份(mysqldump):
- 如有同名库先备份当前状态:mysqldump -u root -p --databases your_db > your_db_before_recover.sql
- 导入备份:mysql -u root -p your_db < backup.sql
- 校验:SHOW TABLES; SELECT COUNT(*) FROM critical_table;
- 物理/热备(Percona XtraBackup):
- 准备备份:xtrabackup --prepare --target-dir=/path/to/backup
- 停库并覆盖数据目录:sudo systemctl stop mysql && sudo cp -a /path/to/backup/** /var/lib/mysql**
- 修正权限:sudo chown -R mysql:mysql /var/lib/mysql
- 启动:sudo systemctl start mysql
- 建议:恢复前先在测试环境演练,确认无误再上生产。
三、无备份时的恢复
- 使用二进制日志(Binary Log)做时间点恢复(PITR):
- 确认是否开启:SHOW VARIABLES LIKE ‘log_bin’; 若未开启,通常无法直接用此方法。
- 定位范围:SHOW BINARY LOGS; 结合应用日志或监控,确定误操作的大致时间窗口。
- 导出相关事件:
mysqlbinlog --start-datetime=“2025-12-24 10:00:00” --stop-datetime=“2025-12-24 10:20:00” /var/log/mysql/mysql-bin.00000X > recover.sql
- 先在一个临时库回放,确认无误后,再在正式库回放或按表/库粒度导入增量。
- 使用工具生成回滚 SQL(适用于误 UPDATE/DELETE):
- 借助 binlog2sql(row 格式 binlog 效果更好)提取指定时间窗内的事件,并生成反向 SQL用于回滚。
- 基本流程:定位 binlog 文件与位置(SHOW MASTER STATUS;),然后用 binlog2sql 生成回滚语句并审查后执行。
- 无日志且无备份:可尝试第三方数据恢复工具或专业服务,但成功率不保证,应尽快行动并避免继续写入。
四、常见场景与命令速查
| 场景 |
关键条件 |
核心命令/路径 |
| SQL 转储恢复 |
有 .sql 或 .sql.gz 备份 |
mysql -u root -p db < backup.sql |
| XtraBackup 物理恢复 |
有 XtraBackup 全备 |
xtrabackup --prepare /path;停库;cp -a /path/ /var/lib/mysql;chown -R mysql:mysql /var/lib/mysql;systemctl start mysql |
| 时间点恢复 |
开启 binlog |
mysqlbinlog --start-datetime=“YYYY-MM-DD HH:MM:SS” --stop-datetime=“YYYY-MM-DD HH:MM:SS” /var/log/mysql/mysql-bin.00000X > recover.sql |
| 误删表/库 |
有备份或 binlog |
用备份恢复;或用 binlog 导出删除前的 INSERT/建表语句,或借助 binlog2sql 生成回滚 SQL |
| 仅文件级损坏 |
有数据目录拷贝 |
停库;用旧目录覆盖(先备份当前目录);修正权限;启动 |
五、恢复后的验证与预防
- 恢复验证:核对表数量、行数、关键业务校验和/抽样记录,与备份时间点或删除前状态比对;在只读窗口期观察业务指标与错误日志。
- 预防措施:
- 建立定期备份(如每日全备 + 持续归档),并定期演练恢复;
- 启用并妥善管理 binlog(如设置 expire_logs_days),保留足够回放窗口;
- 关键操作使用事务与最小权限,变更前先备份;
- 重要系统建议引入主从复制/高可用,降低单点故障与误操作影响。