MySQL 8.0 本身不记录备份状态到系统表中,information_schema、performance_schema 和 mysql 系统库均无内置视图或字段追踪备份执行时间、成功与否或文件路径,因备份是外部工具行为,非数据库自身SQL操作,官方未提供类似 pg_stat_archiver 的监控机制。

MySQL 8.0 本身不记录备份状态到系统表中 —— 这是关键前提。information_schema、performance_schema 和 mysql 系统库均无内置字段或视图用于追踪 mysqldump、xtrabackup 或其他工具的备份执行时间、成功与否或文件路径。
为什么查不到 backup_status 这类表
MySQL 不把备份视为数据库“自身行为”,而是外部操作:无论是 mysqldump 还是 xtrabackup,都运行在服务进程之外,不经过 SQL 执行引擎,也不会写入任何系统元数据表。官方未提供类似 pg_stat_archiver(PostgreSQL)的监控视图。
-
SHOW VARIABLES LIKE 'log_bin'只能告诉你 binlog 是否开启,不能说明“有没有人用它做过备份” -
SELECT * FROM performance_schema.replication_applier_status仅反映从库复制状态,和备份无关 - 试图查询
mysql.backup_history或information_schema.backup_log会直接报错:表不存在
真正能查到的“最近备份线索”只有 binlog 文件信息
如果你依赖 binlog 做增量恢复(例如配合全量备份),可间接推断“最近一次可能的备份点”:
- 执行
SHOW BINARY LOGS查看当前活跃的 binlog 列表,最新文件名如binlog.000012 - 用
SHOW MASTER STATUS获取当前写入位置:File和Position是下一个事件将写入的位置,不是最后一条已写入事件 - 结合
mysqlbinlog --base64-output=decode-rows -v binlog.000012 | tail -20手动翻最后几条事件,找DROP DATABASE或INSERT INTO backup_log这类人工标记(前提是有人写了)
注意:expire_logs_days 设置为 0 表示 binlog 永不过期,但不代表它能回溯备份行为——只是日志没被自动清理而已。
想让“最近一次备份”可查,必须自己建表+人工/脚本写入
这是唯一可靠方式。例如:
CREATE TABLE IF NOT EXISTS mysql.backup_log (
id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
backup_type ENUM('full', 'incremental', 'schema') NOT NULL,
tool VARCHAR(32) NOT NULL COMMENT 'mysqldump/xtrabackup/mysqlpump',
db_list TEXT,
start_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
end_time DATETIME NULL,
status ENUM('success', 'failed', 'interrupted') DEFAULT 'success',
output_file VARCHAR(512),
checksum CHAR(64) COMMENT 'sha256 of output file'
) ENGINE=InnoDB;- 每次备份脚本结尾加一句
INSERT INTO mysql.backup_log (...) VALUES (...) - 避免在备份过程中写入该表(否则可能锁表或影响一致性)
- 不要依赖
SELECT MAX(start_time) FROM mysql.backup_log就认定是“有效备份”——得同时检查status = 'success'和output_file是否存在且可读
真正容易被忽略的是:即使你用了 mysqldump --single-transaction,它也不生成任何日志记录;所谓“最近一次备份”,永远是你自己定义、自己维护、自己验证的那个时间点。


















