mysql无内置“恢复模式”,完全恢复需全量备份加连续binlog,部分恢复须人工过滤binlog并精准定位位点,无binlog则只能回退至最近备份点。

MySQL 没有“恢复模式”这个内置概念
MySQL 本身不提供像 SQL Server 那样的“完整恢复模式”“简单恢复模式”等数据库级恢复模式设置。所谓“完全恢复”和“部分恢复”,是运维人员基于备份策略与二进制日志(binlog)使用方式形成的实践分类,不是 MySQL 的配置项或运行状态。
完全恢复:依赖全量备份 + 所有 binlog 到故障点
这是最接近“不丢数据”的恢复方式,前提是:binlog已开启、未被清理、且从全量备份时间点起连续可用。
-
mysqldump或mysqlpump生成的逻辑全备,必须加上--single-transaction和--master-data=2(记录备份时的binlog文件名与位置) - 物理全备(如
Percona XtraBackup)需配合xtrabackup_binlog_info中的位点信息 - 恢复流程:先导入全量备份 → 再用
mysqlbinlog解析并重放从备份位点到故障前一刻的所有binlog - 常见错误:跳过某段
binlog导致主键冲突或数据覆盖;误用--stop-datetime而非--stop-position,因时区或执行延迟造成截断不准
部分恢复:按库/表/时间点精准回退
适用于误删表、错更新某张表、或仅需恢复某个业务库的场景。本质是“隔离式重放”,不是 MySQL 原生支持的功能,需人工拆分处理。
- 从全量备份中单独提取某库的
CREATE database和CREATE table语句(mysqldump --databases db1可限定) - 用
mysqlbinlog --database=db1过滤出目标库的操作(注意:该参数只过滤USE db1后的语句,跨库写入仍可能漏判) - 更可靠的做法是结合
--start-position和--stop-position,定位到具体误操作前后的位置再切割 - 风险点:
binlog_format=STATEMENT下某些函数(如NOW()、UUID())重放结果不一致;ROW格式虽安全但日志体积大,解析慢
没有 binlog 就只能做“时间点还原”,不是“完全恢复”
如果未启用 binlog,或备份后发生过 RESET MASTER、磁盘损坏导致日志丢失,那么任何“恢复到最新状态”的说法都不成立——你最多能回到上一次全量备份的时间点,中间所有变更永久丢失。
- 检查是否启用:
SHOW VARIABLES LIKE 'log_bin';返回ON才有效 - 确认保留周期:
SHOW VARIABLES LIKE 'expire_logs_days';默认为 0(永不过期),但磁盘满时 dba 可能手动PURGE BINARY LOGS - 线上库务必禁用
sql_log_bin=0(除非明确知道后果),否则 DML 不记日志,备份后无法追平
真正难的不是命令怎么写,而是判断哪一段 binlog 属于“有效重放区间”——它取决于你的备份一致性、应用事务边界、以及是否混用了 MyISAM 和 InnoDB 表。