RowDeck: MySQL® Monitor for iPhone

See what's burning in your MySQL. Put it out.

Paged at night with the laptop at home? RowDeck opens on Health, finds the transaction that holds the lock and counts the sessions stuck behind it. Kill the right thread from your iPhone, then do the real fix at your desk.

Coming soon to the App Store Email me when it's out

Free Pro $14.99 once MySQL 8.0+ and MariaDB 10.5+ iOS 17+ iPhone

See an incident in four screens
Works with MySQL 8.0 and newerMariaDB 10.5 and newerPercona Server for MySQLAmazon RDSAurora MySQLYour own servers
The 3 a.m. loop

From the page to unblocked in four screens.

The built-in demo replays a common MySQL incident. A forgotten transaction holds a row lock on shop.orders, a migration waits behind it, and eight sessions queue up. Pick a step to see its screen.

Try it without a server: on the Connections screen, tap Explore demo data. You need no account, and Pro actions run on the sample data.

Health screen of prod-shop in a Critical state: Blocked shows 8 waiting, connections 112 of 151, the longest query at 09:12
Health · Critical · 8 waiting
  • Row locks

    InnoDB lock waits grouped under the thread that holds them, with the SQL each one runs and how long it has waited.

  • Metadata locks

    The ALTER TABLE queue: who waits for a table metadata lock, which transaction keeps it, and a button to kill the waiting ALTER instead.

  • Deadlocks

    The latest deadlock from InnoDB: who waited for what, and which transaction it rolled back.

  • Kill on Amazon RDS

    No KILL rights on Amazon RDS or Aurora? RowDeck calls mysql.rds_kill and names the path in the confirmation.

Purge & Bloat

Catch AUTO_INCREMENT before INSERTs start failing.

Purge & Bloat shows how much of each auto-increment range you have used, how far purge has fallen behind, and which tables and indexes hold space for nothing.

  • Headroom per column. At 93% of the INT range of order_items.id, RowDeck warns that every INSERT fails at the end and copies the ALTER that widens the column.
  • History list length, with the oldest transaction that keeps InnoDB from purging old row versions.
  • Fragmented tables, and unused or duplicate indexes with the space each one holds.
  • Run ANALYZE TABLE from the list, or OPTIMIZE TABLE after you type the table name. DROP INDEX and ALTER statements go to your clipboard, and you decide when to run them. PRO
Purge & Bloat screen: order_items.id at 93% of its INT range with a warning that every INSERT fails at the end, purge lag of 1.2M and the oldest transaction
Inside the app

Every screen you open during a MySQL incident.

Health up front and a native screen behind each tile, so you skip the mysql prompt on a phone keyboard. The SQL console covers the rest and checks each statement before it runs.

  • Health

    One verdict and ten tiles with thresholds: connections against max_connections, blocked threads, the longest query, queries per second, buffer pool hits, purge lag, auto-increment headroom, deadlocks, replication and disk. It refreshes every 10 seconds while you look at it, in dark or light like iOS.

    Health screen in the app's light appearance: Critical, 8 waiting, connections 112 of 151
  • Activity

    Every thread from the processlist, waiting ones first. Filter by running, in transaction, over 10 s or waiting, or group the threads by client.

  • Replication

    Seen from the replica: IO and SQL threads, lag and the error that stopped a channel. On the source: connected replicas and the space binlogs hold.

  • Slow queries

    Statement digests from performance_schema, sorted by total time, average time, calls or rows examined.

  • Storage

    The biggest schemas, tables and indexes, split into data, index and free space.

  • Data

    Browse tables, filter on the server, follow foreign keys, export a page as CSV or copy it as JSON. Row edits come with Pro.

  • SQL console

    The classifier labels each statement as you type: Read, Write, DDL or Destructive. Free runs reads; Pro runs the rest.

  • PRO

    AI assistant on your own model

    Explains an incident or a lock chain and drafts the fix. It reads a redacted snapshot, shows you what it will send, and runs nothing itself. Free on the demo.

    • Anthropic
    • OpenAI
    • OpenRouter
    • Z.ai
    • OpenAI-compatible server
    • Ollama on your network
Before anything writes

Four checks stand between your thumb and the server.

RowDeck asks them in order. A no at any step stops the action, and nothing reaches MySQL.

  1. Pro

    Free never writes to your server.

  2. Read-only connection

    Mark a connection read-only and writes stop there, Pro included, until you unlock them for the session.

  3. Classifier

    It runs on every statement, on Free and on Pro.

  4. Your confirmation

    A preview with the target, schema, connection and PROD badge. Destructive steps, and kills on a Production connection, wait until you type the target.

What the classifier saw prod-shop PROD
SELECT * FROM orders WHERE id = 4820118; Read
UPDATE orders SET status = 'shipped' WHERE id = 4820118; Write
CREATE INDEX idx_orders_total ON orders (total); DDL
TRUNCATE TABLE shop.sessions; Destructive
  • Through your bastion

    SSH with a password, a one-time code or a key: Ed25519, ECDSA or RSA in OpenSSH, PEM, PKCS#8 or PuTTY format, or a Secure Enclave key. Up to two jump hosts behind the bastion.

  • Pinned TLS

    RowDeck shows the SHA-256 fingerprint of the server certificate on first connect and stops if it changes later.

  • Keychain and Face ID

    Passwords, keys and fingerprints live in the iOS Keychain on this iPhone. Face ID opens the app.

  • Honest without PROCESS

    Without it, MySQL shows you only your own threads. RowDeck says so and hands you the fix:

    GRANT PROCESS ON *.* TO 'oncall'@'%';
Screens

RowDeck 1.0 on the built-in demo data.

Health screen: Critical, 8 waiting, ten tiles

Health The incident before you open a laptop.

Locks tree with two root blockers and an ALTER TABLE waiting for a metadata lock

Locks Row locks and metadata locks in one tree.

Kill the blocking connection sheet with the thread ID typed to confirm

Kill connection See what it unblocks before you confirm.

Activity screen with the filters Running, In trx, over 10s, Waiting and All

Activity Waiting threads first.

Purge & Bloat: six unused indexes holding 34 GB, with Copy DROP INDEX statement

Indexes Unused and duplicate indexes, with DROP INDEX copied for you.

Replication on a replica: IO and SQL threads running, 4.2 s behind the source

Replication Channel status and transactions left to apply.

Slow queries sorted by total time, with calls, average time and rows examined

Slow queries Sorted by total time.

Storage screen: 412 GB of data and indexes, the schemas and the largest tables

Storage The biggest tables and indexes.

Data tab of shop.orders with a filter for pending orders

Data Filter on the page or on the server.

SQL console with a read query on performance_schema and its result

SQL console Each statement classified.

SQL console with CREATE INDEX classified as DDL that commits any open transaction

DDL What the classifier saw before the statement runs.

Assistant answer about a forgotten transaction that holds a row lock, with the suggested kills

Assistant Your model. Every action is your call.

New connection form with an SSH tunnel through a bastion and key import

SSH tunnel Your key and your jump hosts.

Health The incident before you open a laptop.

Pricing

Monitoring is free. Pro is one purchase.

Point RowDeck at your production server and use every monitoring screen for free. Pay $14.99 once, on the night you need to act.

Free

forever

$0

See everything on one server.

  • One saved connection. The demo and a replica you open from its source don't count.
  • Health, Activity, Locks, Purge & Bloat, Replication, Storage and Slow queries
  • TLS with a pinned fingerprint, SSH tunnels and Face ID
  • Data browser with server-side filters, foreign keys, CSV export and JSON copy
  • Read-only SQL with the classifier

Pro

one-time purchase

$14.99

Act on any server.

  • Unlimited saved connections
  • Kill queries and connections, unblock a locked chain
  • Run ANALYZE TABLE and OPTIMIZE TABLE
  • Writes, DDL and row edits, behind confirmations
  • The AI assistant with your own key or your own Ollama

No subscription and no account. The demo lets you try every Pro action on sample data before you buy. Restore Purchases sits on the paywall and in Settings. Outside the US, the App Store shows the price in your currency.

Coming soon to the App Store Email me when it's out

Free Pro $14.99 once MySQL 8.0+ and MariaDB 10.5+ iOS 17+ iPhone

FAQ

Questions about RowDeck and MySQL

Something missing? Write to support@rowdeck.app.

Does it work with Amazon RDS, Aurora or my own servers?

RowDeck works with MySQL 8.0 or newer and MariaDB 10.5 or newer that your iPhone can reach, self-hosted or managed, including Amazon RDS and Aurora MySQL. Percona Server for MySQL works too.

On Amazon RDS and Aurora, where an admin can't KILL other users' threads, RowDeck calls the provider's procedure, mysql.rds_kill. Behind a proxy it sends no KILL, because the thread ID may belong to another server, and gives you the statement to run on the server itself.

MySQL 5.7 and MariaDB before 10.5 are outside the supported range, and TiDB keeps different monitoring tables. The app tells you so when you connect.

Can it reach a database behind a bastion?

Yes. Turn on the SSH tunnel in the connection and sign in to the bastion with a password, a key or a Secure Enclave key made on this iPhone. Keys can be Ed25519, ECDSA or RSA in OpenSSH, PEM, PKCS#8 or PuTTY format, with or without a passphrase. One-time codes work when the server asks for them.

If the bastion sits behind another host, add up to two jump hosts. RowDeck pins each host key on first connect and refuses to go on if one changes.

Do my credentials or data leave my iPhone?

RowDeck connects straight to your server or through your bastion. No RowDeck server sits in between, and you need no account. Passwords and keys stay in the iOS Keychain.

Crash reports go to Sentry and usage counts to our own analytics server once you tap Done on the first screen, where both switches start on. You can turn either off there or later in Settings › Privacy. Neither contains your SQL, schema, table or column names, hostnames, values or credentials. The details are in the privacy policy.

Do I need SUPER or an admin account?

No. The monitoring screens need read-only grants, and the connection form lists them for MySQL and for MariaDB. The one that matters most is PROCESS: without it MySQL shows you only your own threads, and RowDeck says so on each screen instead of showing an empty list.

Pro actions need CONNECTION_ADMIN to kill other users' threads; on Amazon RDS and Aurora, RowDeck uses the provider's kill procedure instead. A metric the server hides shows a reason, never a zero.

KILL QUERY or KILL CONNECTION: which one?

KILL QUERY stops the running statement and keeps the connection and its transaction. KILL CONNECTION closes the connection and rolls back its open transaction.

A thread asleep in an open transaction runs no statement, so KILL QUERY changes nothing and its locks stay. RowDeck reads what the root is doing and offers the kill that frees the queue.

Can RowDeck break my database?

Free never writes: console reads run inside a read-only transaction. With Pro, every write passes four checks in order: Pro, the connection's Read-only switch, the classifier and your confirmation. Destructive statements wait until you type the target, and a connection marked Production gets a PROD badge and stricter confirmations.

RowDeck copies DROP INDEX and ALTER … BIGINT for you and leaves running them to you. It doesn't purge binlogs or skip a transaction on a replica, and it never asks the server for LOAD DATA LOCAL or for several statements in one call.

Why not SSH in and run mysql?

You can. At 3 a.m. on a phone keyboard, RowDeck saves you the joins across performance_schema and information_schema: the lock tree, the waiting ALTER and the transaction behind it are one tap from Health.

What does the AI assistant see?

A redacted snapshot of the screen you asked about. Host, port, IP addresses, connection names and passwords never leave, and values inside statements never leave either. For cloud models, schema, table and column names go out as placeholders like table_1, and RowDeck puts the real names back on your iPhone.

Requests go from your iPhone to the provider you chose with your own key (Anthropic, OpenAI, OpenRouter, Z.ai or any OpenAI-compatible endpoint) or to your own Ollama. You see what the model will get before you send. The assistant is part of Pro, free on the demo, and leaves running SQL to you.

Is there a subscription?

No. Pro is a single purchase of $14.99 tied to your Apple Account. Monitoring stays free, with no account and no trial clock.

Will it alert me when something breaks?

No. RowDeck does no background work and doesn't watch servers while it is closed. Keep your alerting where it is: RowDeck is the screen you open after the page.

Does it run on iPad?

We built RowDeck for iPhone, in portrait. It has no iPad layout of its own.

Amazon Web Services, AWS, Amazon RDS and Amazon Aurora are trademarks of Amazon.com, Inc. or its affiliates. RowDeck is not affiliated with or endorsed by Amazon.

Guides

Guides for MySQL incidents.

The problems that page you at night, one page each: the SQL to run by hand and what RowDeck shows.

From the blog

All posts

Have it on your phone before the next incident.

Add a server, pin its certificate and keep every monitoring screen free. Pro unlocks the actions for the night you need them.

Coming soon to the App Store Email me when it's out

Free Pro $14.99 once MySQL 8.0+ and MariaDB 10.5+ iOS 17+ iPhone