最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
MySQL如何查看备份与恢复执行进度
时间:2026-09-02 07:32:49 编辑:袖梨 来源:一聚教程网
mysqldump备份默认无进度,需用pv命令实时显示:mysqldump -u root -p mydb | pv -b > mydb.sql;pv须提前安装,仅作用于stdout流,压缩时需置于gzip前,不可颠倒顺序。
mysqldump 备份时怎么知道进度
默认情况下 mysqldump 不输出进度,大库备份时容易误判“卡死”。真正能看进度的方式只有两种:一是用 --verbose 配合日志解析(不实用),二是改用带进度反馈的替代工具。
推荐直接使用 pv(pipe viewer)包住 mysqldump 输出流,实时显示已处理字节数和估算剩余时间:
mysqldump -uroot -p mydb | pv -b > mydb.sql
注意:pv 需提前安装(apt install pv 或 yum install pv),且仅对 stdout 流式输出有效;若加了 -c(压缩)或重定向到 gzip,需调整管道顺序:
mysqldump -uroot -p mydb | pv -b | gzip > mydb.sql.gz- 不能写成
mysqldump ... | gzip | pv—— 因为 gzip 输出是非恒定速率流,pv无法准确估算
另外,mysqldump 的 --single-transaction 会显著影响实际耗时,但不会改变进度可视性 —— 它只是避免锁表,不提供进度指标。
mysql 恢复时如何监控执行进度
mysql 命令本身完全不提供进度反馈,source 或管道导入都是“黑盒执行”。常见错误是盯着终端光标不动就以为卡住,其实可能正在解析百万行 INSERT 语句。
真正可落地的监控方式只有一种:查目标库的 information_schema.TABLES 行数变化(前提是恢复前表为空或可预估):
SELECT table_name, table_rows FROM information_schema.TABLES WHERE table_schema = 'mydb' AND table_name = 'users';
在另一个终端反复执行该查询,观察 table_rows 是否持续增长。注意:
-
table_rows是 InnoDB 的估算值,不一定实时精确,但趋势可靠 - MyISAM 表该字段是准确值;InnoDB 下建议搭配
SHOW TABLE STATUS LIKE 'users'看Data_length变化更稳 - 如果恢复脚本里含大量
CREATE TABLE或ALTER,早期可能看不到行数变化,要等第一批INSERT开始才动
为什么不能靠 processlist 查恢复进度
很多人试过 SHOW PROCESSLIST,发现状态长期卡在 executing 或 updating,但这毫无意义 —— MySQL 的客户端导入命令(mysql CLI)在服务端表现为单个连接,执行的是“一条超长 SQL 流”,不是多个独立语句。
所以你会看到:
- 状态始终是
Query,Command 是Query,Info 字段只显示当前正在解析的那条 SQL 的开头几十个字符(比如INSERT INTO logs...) - Time 字段是这条连接存活秒数,不是当前语句执行时长,不能反推剩余时间
- 没有
Progress列(那是 Percona Server 或 MariaDB 的扩展,最新 MySQL 不支持)
换句话说:SHOW PROCESSLIST 在标准 MySQL 恢复场景下,只能告诉你“还在跑”,不能告诉你“跑到哪了”。
binlog 回放进度怎么看
如果你用 mysqlbinlog + mysql 回放 binlog(比如做增量恢复),进度判断比全量 SQL 导入稍好一点,但依然受限:
先确认当前正在回放哪个 binlog 文件:
mysqlbinlog --base64-output=decode-rows -v mysql-bin.000012 | head -n 20
再结合 SHOW MASTER STATUS 和 SHOW BINARY LOGS 查看文件序号和大小,手动对比已回放位置。但更实用的是:
- 用
mysqlbinlog --start-position=... --stop-position=...分段回放,每段控制在几万行内,便于分步验证 - 回放时加
--verbose,输出每条事件的 timestamp 和 position,重定向到日志文件后 grep 最新 position - 不要依赖
mysqlbinlog自身的进度提示 —— 它只在读取阶段打印“reading file”,不反映执行进度
真正难的不是“看到进度”,而是“知道这个进度对应业务数据的哪一部分”。比如回放到 position 12345678,你得自己查 binlog 里这个位置附近写了哪些表、哪些主键,否则数字毫无业务意义。