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表。
