SHOW MASTER STATUS是最直接查看当前binlog文件名和位置的方式,返回File(当前写入的二进制日志文件名)和Position(字节偏移量)等关键信息,需在主库执行且具备REPLICATION CLIENT权限。

查当前binlog文件名和位置用 SHOW MASTER STATUS
这是最直接的方式,能立刻看到正在写入的 binlog 文件名、当前写入位置(Position)以及 GTID(如果启用)。执行后返回单行结果,File 和 Position 是核心字段。
注意:该命令只反映“当前已写入的最终位置”,不提供速率信息;且需要 REPLICATION CLIENT 权限(普通只读账号通常没有)。
- 若报错
ERROR 1227 (42501): Access denied; you need ... REPLICATION CLIENT ...,说明权限不足,不能绕过,必须联系 DBA 授权 - 返回的
Position是字节偏移量,不是时间戳,无法直接换算成每秒写入量 - 在主从架构中,从库执行此命令会报错,必须在主库上运行
估算写入速率需对比两次 SHOW MASTER STATUS 的位置差
MySQL 自身不提供实时写入速率指标,只能靠人工采样计算:间隔固定时间(如 1 秒)执行两次 SHOW MASTER STATUS,用第二次的 Position 减去第一次的,再除以时间差(秒),得到平均字节/秒。
示例逻辑(需外部脚本或手动操作):
mysql -e "SHOW MASTER STATUS\G" | grep "Position\|File" # 记下 Position=123456 sleep 1 mysql -e "SHOW MASTER STATUS\G" | grep "Position\|File" # 得到 Position=123987 → 差值 = 531 字节/秒
- 采样间隔不宜过短(Position 可能未更新,差值为 0
- 高写入场景下,单次差值波动大,建议连续采样 5–10 次取中位数
- 注意单位是字节/秒,不是事件数/秒;一个 INSERT 可能生成几百字节 binlog(含事务头、checksum、语句内容等)
SHOW BINARY LOGS 能看历史文件大小,但不能反映实时速率
该命令列出所有已生成的 binlog 文件及其大小(File_size),可用于判断近期写入总量趋势,比如观察 mysql-bin.000123 是否在快速膨胀。
但它不包含时间戳,也不显示当前正在写的文件的“动态增长过程”,所以仅作辅助参考。
- 文件大小突增可能意味着批量导入或大事务,但无法区分是突发还是持续写入
- 如果启用了
expire_logs_days,旧文件会被自动清理,列表长度不稳定 - 文件名序号不严格递增——例如
mysql-bin.000123后可能是mysql-bin.000125(中间被 purge)
真正监控速率得靠外部工具或 Performance Schema(MySQL 8.0+)
MySQL 5.7 及以前版本无内置速率指标;MySQL 8.0 开始可通过 Performance Schema 的 events_statements_summary_by_digest 或配合 binary_log_transaction_compression 等参数间接推断,但依然不直接暴露“binlog bytes/sec”。
生产环境推荐方案:
- 用
pt-heartbeat或自定义脚本定时抓取SHOW MASTER STATUS并上报到 Prometheus + Grafana - 监听
/var/lib/mysql/mysql-bin.*文件的stat()时间与大小变化(需 OS 层权限,且注意 SELinux/AppArmor 限制) - 避免在高峰期间高频轮询
SHOW MASTER STATUS(虽轻量,但锁表时间极短,频繁调用仍可能堆积)
真正难的不是查一次位置,而是稳定、低开销、带时间上下文的持续采集 —— 这部分没法靠一条 SQL 解决。


















