mysqldump备份默认无进度,需用pv命令实时显示:mysqldump -u root -p mydb | pv -b > mydb.sql;pv须提前安装,仅作用于stdout流,压缩时需置于gzip前,不可颠倒顺序。
默认情况下 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.gzmysqldump ... | gzip | pv —— 因为 gzip 输出是非恒定速率流,pv 无法准确估算另外,mysqldump 的 --single-transaction 会显著影响实际耗时,但不会改变进度可视性 —— 它只是避免锁表,不提供进度指标。
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 的估算值,不一定实时精确,但趋势可靠SHOW TABLE STATUS LIKE 'users' 看 Data_length 变化更稳CREATE TABLE 或 ALTER,早期可能看不到行数变化,要等第一批 INSERT 开始才动很多人试过 SHOW PROCESSLIST,发现状态长期卡在 executing 或 updating,但这毫无意义 —— MySQL 的客户端导入命令(mysql CLI)在服务端表现为单个连接,执行的是“一条超长 SQL 流”,不是多个独立语句。
所以你会看到:
Query,Command 是 Query,Info 字段只显示当前正在解析的那条 SQL 的开头几十个字符(比如 INSERT INTO logs...)Progress 列(那是 Percona Server 或 MariaDB 的扩展,最新 MySQL 不支持)换句话说:SHOW PROCESSLIST 在标准 MySQL 恢复场景下,只能告诉你“还在跑”,不能告诉你“跑到哪了”。
如果你用 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 最新 positionmysqlbinlog 自身的进度提示 —— 它只在读取阶段打印“reading file”,不反映执行进度真正难的不是“看到进度”,而是“知道这个进度对应业务数据的哪一部分”。比如回放到 position 12345678,你得自己查 binlog 里这个位置附近写了哪些表、哪些主键,否则数字毫无业务意义。