RowDeck: MySQL® Monitor iPhone 版

看清 MySQL 里哪里在着火。 把火扑灭。

半夜收到告警,笔记本却在家里?RowDeck 一打开就是“健康”页面,它会找出持有锁的事务,并数出卡在它后面的会话。在 iPhone 上终止该终止的线程,回到电脑前再彻底修复。

即将登陆 App Store 上线时邮件提醒

Free Pro 一次性购买 US$14.99 MySQL 8.0+ 与 MariaDB 10.5+ iOS 17+ iPhone

用四个页面看完一次故障
支持 MySQL 8.0 及更高版本MariaDB 10.5 及更高版本Percona Server for MySQLAmazon RDSAurora MySQL自建服务器
凌晨 3 点的处理流程

从收到告警到解除阻塞,只需四个页面。

内置演示会重现一次常见的 MySQL 故障:一个被遗忘的事务持有 shop.orders 上的行锁,一次迁移在它后面等待,八个会话排起了队。选择一个步骤,查看对应的页面。

不连服务器也能试:在“连接”页面轻点查看演示数据。无需账号,Pro 操作在示例数据上运行。

prod-shop 的“健康”页面处于“严重”状态:“被阻塞”显示 8 个等待中,连接数 112/151,最长的查询已运行 09:12
健康 · 严重 · 8 个等待中
  • 行锁

    InnoDB 锁等待按持有锁的线程分组,并显示每个等待者运行的 SQL 和已等待的时间。

  • Metadata locks

    ALTER TABLE 队列:谁在等待表的 metadata lock、哪个事务一直占着它,还有一个按钮可以改为取消等待中的 ALTER。

  • Deadlocks

    InnoDB 记录的最近一次 deadlock:谁在等待什么,以及哪个事务被回滚。

  • 在 Amazon RDS 上终止

    在 Amazon RDS 或 Aurora 上没有 KILL 权限?RowDeck 会调用 mysql.rds_kill,并在确认面板中写明走的是哪条途径。

Purge 与膨胀

赶在 INSERT 开始失败之前,盯住 AUTO_INCREMENT。

“Purge 与膨胀”页面显示每个自增范围已经用掉多少、purge 落后了多少,以及哪些表和索引白白占着空间。

  • 按列显示余量。order_items.id 用到 INT 范围的 93% 时,RowDeck 会警告范围用尽后每条 INSERT 都会失败,并复制用于加宽该列的 ALTER。
  • History list length,以及阻止 InnoDB purge 旧行版本的最老事务。
  • 碎片化的表,以及未使用或重复的索引和各自占用的空间。
  • 可直接在列表中运行 ANALYZE TABLE;输入表名后可运行 OPTIMIZE TABLE。DROP INDEX 和 ALTER 语句会复制到剪贴板,何时执行自行决定。 PRO
“Purge 与膨胀”页面:order_items.id 已用到 INT 范围的 93%,并警告范围用尽后每条 INSERT 都会失败;purge 延迟为 1.2M,并显示最老的事务
App 里有什么

MySQL 故障时要打开的每一个页面。

最前面是“健康”页面,每张卡片背后都有一个原生页面,不必在手机键盘上敲 mysql 命令行。其余情况交给 SQL 控制台,每条语句运行前都会先经过检查。

  • 健康

    一个总体判断加十张带阈值的卡片:连接数对比 max_connections、被阻塞的线程、最长的查询、每秒查询数、Buffer pool 命中率、purge 延迟、AUTO_INCREMENT 余量、Deadlocks、复制和磁盘。页面打开期间每 10 秒刷新一次,和 iOS 一样提供深色和浅色外观。

    浅色外观下的“健康”页面:严重,8 个等待中,连接数 112/151
  • 活动

    processlist 中的每个线程,等待中的排在最前。可按运行中、事务中、超过 10 秒或等待中筛选,也可以按客户端分组。

  • 复制

    在备库上:IO 和 SQL 线程、延迟,以及导致某个通道停止的错误。在主库上:已连接的备库,以及 binlog 占用的空间。

  • 慢查询

    来自 performance_schema 的语句摘要,可按总耗时、平均时间、调用次数或已检查行数排序。

  • 存储

    最大的架构、表和索引,按数据、索引和空闲空间拆分。

  • 数据

    浏览表、在服务端筛选、沿外键跳转,把一页数据导出为 CSV 或复制为 JSON。行编辑属于 Pro。

  • SQL 控制台

    输入时,分类器就为每条语句标注:读取、写入、DDL 或破坏性。Free 运行读取语句,Pro 运行其余语句。

  • PRO

    运行在自有模型上的 AI 助手

    解释故障或阻塞链,并起草修复方案。它读取脱敏后的快照,发送前先展示要发送的内容,自身不执行任何操作。在演示中免费。

    • Anthropic
    • OpenAI
    • OpenRouter
    • Z.ai
    • 兼容 OpenAI 的服务器
    • 自己网络中的 Ollama
写入之前

从指尖到服务器,中间隔着四道检查。

RowDeck 按顺序逐一检查。任何一步没通过,操作就会停止,不会有任何内容到达 MySQL。

  1. Pro

    Free 从不向服务器写入。

  2. Read-only 连接

    把连接标记为 Read-only,该连接上的写入就会停止,Pro 也不例外,直到为本次会话解锁写入。

  3. 分类器

    对每条语句都会运行,Free 和 Pro 都一样。

  4. 手动确认

    预览中显示目标、架构、连接和 PROD 徽标。破坏性操作,以及 Production 连接上的终止操作,需要先输入目标才会执行。

分类器看到了什么 prod-shop PROD
SELECT * FROM orders WHERE id = 4820118; 读取
UPDATE orders SET status = 'shipped' WHERE id = 4820118; 写入
CREATE INDEX idx_orders_total ON orders (total); DDL
TRUNCATE TABLE shop.sessions; 破坏性
  • 经由堡垒机

    SSH 支持密码、一次性验证码或密钥:OpenSSH、PEM、PKCS#8 或 PuTTY 格式的 Ed25519、ECDSA 或 RSA 密钥,或者 Secure Enclave 密钥。堡垒机后面最多还可以加两台跳板主机。

  • 固定 TLS 证书

    首次连接时,RowDeck 显示服务器证书的 SHA-256 指纹;之后证书一旦变化,连接就会停止。

  • Keychain 与 Face ID

    密码、密钥和指纹保存在此 iPhone 的 iOS Keychain 中。用 Face ID 打开 App。

  • 没有 PROCESS 也如实相告

    没有该权限时,MySQL 只显示当前账号自己的线程。RowDeck 会如实说明,并给出解决方法:

    GRANT PROCESS ON *.* TO 'oncall'@'%';
截图

RowDeck 1.0,使用内置演示数据。

“健康”页面:严重,8 个等待中,十张卡片

健康 打开笔记本之前就看清故障。

“锁”页面的阻塞树:两个根阻塞者,以及一个等待 metadata lock 的 ALTER TABLE

锁 行锁和 metadata lock 在同一棵树中。

“终止阻塞连接”面板,已输入线程 ID 进行确认

终止连接 确认之前,先看会解除哪些阻塞。

“活动”页面,筛选项为运行中、事务中、> 10秒、等待中和全部

活动 等待中的线程排在最前。

“Purge 与膨胀”:六个未使用的索引占用 34 GB,并带有“复制 DROP INDEX 语句”

索引 未使用与重复索引,DROP INDEX 已代为复制。

备库上的“复制”页面:IO 和 SQL 线程运行中,落后主库 4.2 s

复制 通道状态和待应用的事务。

“慢查询”按总耗时排序,显示调用次数、平均时间和已检查行数

慢查询 按总耗时排序。

“存储”页面:数据和索引共 412 GB,以及各个架构和最大的表

存储 最大的表和索引。

shop.orders 的“数据”标签页,筛选出待处理的订单

数据 在本页筛选或在服务端筛选。

SQL 控制台:一条读取 performance_schema 的查询及其结果

SQL 控制台 每条语句都经过分类。

SQL 控制台:CREATE INDEX 被归类为 DDL,会提交所有打开的事务

DDL 运行之前先看分类器的判断。

助手的回答:一个被遗忘的事务持有行锁,并附有建议的终止操作

助手 模型自己选,每个操作自己定。

新建连接表单:经由堡垒机的 SSH 隧道,以及密钥导入

SSH 隧道 使用自己的密钥和跳板主机。

健康 打开笔记本之前就看清故障。

价格

监控免费。Pro 只需购买一次。

把 RowDeck 连到生产服务器,所有监控页面都免费使用。到了需要出手的那个夜晚,再一次性支付 US$14.99。

Free

永久免费

US$0

一台服务器,一切尽收眼底。

  • 一个已保存的连接。演示连接以及从主库打开的备库不计入其中。
  • 健康、活动、锁、Purge 与膨胀、复制、存储和慢查询
  • 固定指纹的 TLS、SSH 隧道和 Face ID
  • 数据浏览器:服务端筛选、外键、CSV 导出和 JSON 复制
  • 带分类器的只读 SQL

Pro

一次性购买

US$14.99

在任何服务器上出手。

  • 不限数量的已保存连接
  • 终止查询和连接,解除阻塞链
  • 运行 ANALYZE TABLE 和 OPTIMIZE TABLE
  • 写入、DDL 和行编辑,均需确认
  • 使用自己的密钥或自己的 Ollama 的 AI 助手

无需订阅,也无需账号。购买之前,可以先在演示的示例数据上试用每一项 Pro 操作。“恢复购买”位于付费页面和“设置”中。在美国以外的地区,App Store 会以当地货币显示价格。

即将登陆 App Store 上线时邮件提醒

Free Pro 一次性购买 US$14.99 MySQL 8.0+ 与 MariaDB 10.5+ iOS 17+ iPhone

常见问题

关于 RowDeck 与 MySQL 的常见问题

没找到答案?请写信至 support@rowdeck.app。

支持 Amazon RDS、Aurora 或自建服务器吗?

只要 iPhone 能访问到,RowDeck 就能连接 MySQL 8.0 及更高版本和 MariaDB 10.5 及更高版本,无论自建还是托管,包括 Amazon RDS 和 Aurora MySQL。Percona Server for MySQL 也可以使用。

在 Amazon RDS 和 Aurora 上,管理员无法 KILL 其他用户的线程,RowDeck 会改为调用服务商提供的存储过程 mysql.rds_kill。在代理后面时,RowDeck 不发送 KILL,因为线程 ID 可能属于另一台服务器,而是给出需要在服务器本身上运行的语句。

MySQL 5.7 和 10.5 之前的 MariaDB 不在支持范围内,TiDB 的监控表也不一样。连接时 App 会给出提示。

能连接堡垒机后面的数据库吗?

可以。在连接设置中打开 SSH 隧道,用密码、密钥或在此 iPhone 上生成的 Secure Enclave 密钥登录堡垒机。密钥可以是 OpenSSH、PEM、PKCS#8 或 PuTTY 格式的 Ed25519、ECDSA 或 RSA 密钥,有无密钥口令均可。服务器要求一次性验证码时,也可以使用。

如果堡垒机位于另一台主机后面,最多可以添加两台跳板主机。RowDeck 在首次连接时固定每台主机的主机密钥,其中任何一个发生变化,都会拒绝继续。

凭据或数据会离开 iPhone 吗?

RowDeck 直接连接服务器,或经由堡垒机连接。中间没有 RowDeck 服务器,也无需账号。密码和密钥留在 iOS Keychain 中。

在首次启动的页面上轻点“完成”后,崩溃报告会发送到 Sentry,使用统计会发送到我们自己的分析服务器;该页面上的两个开关初始均为打开。可以当场关闭其中任一项,也可以之后在“设置 › 隐私”中关闭。两者都不包含 SQL、架构名、表名、列名、主机名、值或凭据。详情见隐私政策。

需要 SUPER 或管理员账号吗?

不需要。监控页面只需要只读权限,连接表单中分别列出了 MySQL 和 MariaDB 所需的授权。最重要的是 PROCESS:没有它,MySQL 只显示当前账号自己的线程,RowDeck 会在每个页面上说明这一点,而不是显示一个空列表。

Pro 操作要终止其他用户的线程,需要 CONNECTION_ADMIN;在 Amazon RDS 和 Aurora 上,RowDeck 会改用服务商的终止存储过程。服务器隐藏的指标会显示原因,绝不显示为零。

KILL QUERY 还是 KILL CONNECTION:该用哪个?

KILL QUERY 停止正在运行的语句,保留连接及其事务。KILL CONNECTION 关闭连接,并回滚其打开的事务。

在打开的事务中处于 Sleep 状态的线程没有正在运行的语句,所以 KILL QUERY 对它不起作用,锁也依然保留。RowDeck 会读取根阻塞者正在做什么,并提供能释放队列的那种终止方式。

RowDeck 会弄坏数据库吗?

Free 从不写入:控制台的读取在只读事务中运行。在 Pro 中,每次写入都要依次通过四道检查:Pro、连接的 Read-only 开关、分类器,以及手动确认。破坏性语句需要先输入目标才会执行,标记为 Production 的连接会显示 PROD 徽标,确认也更严格。

RowDeck 会代为复制 DROP INDEX 和 ALTER … BIGINT,执行与否自行决定。它不会 purge binlog,也不会在备库上跳过事务;它从不向服务器请求 LOAD DATA LOCAL,也从不在一次调用中请求执行多条语句。

为什么不直接 SSH 上去运行 mysql?

当然可以。但凌晨 3 点在手机键盘上,RowDeck 省去了跨 performance_schema 和 information_schema 的 JOIN 查询:阻塞树、等待中的 ALTER 以及它背后的事务,从“健康”页面轻点一下就能看到。

AI 助手能看到什么?

所询问页面的脱敏快照。主机、端口、IP 地址、连接名称和密码绝不会发出,语句中的值也不会。使用云端模型时,架构名、表名和列名以 table_1 这样的占位符发出,RowDeck 再在 iPhone 上换回真实名称。

请求从 iPhone 发往所选的服务商,使用自己的密钥(Anthropic、OpenAI、OpenRouter、Z.ai 或任何兼容 OpenAI 的端点),或发往自己的 Ollama。发送之前可以看到模型将收到的内容。助手属于 Pro,在演示中免费,不会自行运行 SQL。

需要订阅吗?

不需要。Pro 是一次性购买,价格 US$14.99,与 Apple 账户绑定。监控始终免费,没有账号,也没有试用期倒计时。

出问题时会发告警吗?

不会。RowDeck 不在后台工作,关闭后也不监视服务器。现有的告警系统照常保留:RowDeck 是收到告警后打开的那个页面。

能在 iPad 上用吗?

RowDeck 专为竖屏 iPhone 设计,没有专门的 iPad 布局。

Amazon Web Services、AWS、Amazon RDS 和 Amazon Aurora 是 Amazon.com, Inc. 或其关联公司的商标。RowDeck 与 Amazon 无关联,也未获得其认可。

指南

MySQL 故障指南。

深夜把人叫醒的那些问题,每个一页:手动运行的 SQL,以及 RowDeck 中的显示。

指南和博客为英文。

博客文章

全部文章

在下一次故障之前,先装到手机上。

添加服务器、固定它的证书,所有监控页面都免费使用。Pro 解锁各项操作,留给需要出手的那个夜晚。

即将登陆 App Store 上线时邮件提醒

Free Pro 一次性购买 US$14.99 MySQL 8.0+ 与 MariaDB 10.5+ iOS 17+ iPhone