A backup nobody has restored is a promise, not a plan. A weekly timer is now scheduled — Sundays 03:30 for the database — to restore a real client database into a throwaway copy, count what came back, and write down the result. Two database drills have been published so far, the most recent on 28 July 2026, covering 16 databases. None of them failed. The separate full-stack drill — restoring the cluster and booting a tenant — is counted below, not here, and it has failed 6 times.
The drill takes the nightly dump of a live client database, restores it into a new throwaway database on a separate name, opens it, counts the tables, estimates the row counts from the restored catalogue, records the timings, and then destroys the throwaway database. The live database is never touched, and nothing is written back into it. It is the database dump that is drilled: attachments and uploaded documents are not drilled at all yet, and no filestore drill has produced a published result yet.
Client databases restored in this drill: 16, of which 16 came back verified. Which database it was is deliberately not published. The drill ran on 2026-07-28T13:41:00Z. The backup it used was 11.1 hours old at the moment of restore, because the drill deliberately uses the dump that already existed rather than one made for the occasion. 7855 tables came back. About 720937 rows were counted, estimated from the restored catalogue rather than compared row by row against the source. The restore and verification together took 86.0 seconds. The drill passed. The throwaway database was destroyed at the end of the run, so nothing is left behind and no copy of client data sits around waiting to be forgotten.
These are settings on the machines that run the client databases today, not a description of an intention. Each one is checkable during the 14-day trial.
Four steps, with the time each one really costs. The third step is where an automatic system would be quicker than we are, and we would rather you read that here than discover it on the day.
The primary stops sending the heartbeat it is expected to send, and the gap is what raises the alarm — the heartbeat and the disk watchdog are the two checks that notify a human today. The 60-second checks record the rest of the state, including replication lag past 30 seconds, but their routing is not yet wired up to any channel, so a fault that is not fatal may sit in the log until the next working morning.
The operator decides whether the primary is dead or merely slow, and reads how far the standby has replayed. This is the step that costs the most time, and it is the honest reason we publish no uptime percentage: one operator asleep at 04:00 is a real delay, and pretending otherwise would be the part of this page you should not believe.
Replication is asynchronous today, so the standby holds what it has managed to replay and no more: work committed in the last seconds before the failure may not have reached it. The operator reads how far the standby got, promotes it, the application is pointed at it, and sessions reconnect. Anything that did not reach the standby has to be re-entered, and work in flight at the moment of failure is retried by the user.
The promoted database is checked, the backup timers are re-pointed at it, and the failed machine is rebuilt and re-attached as the new standby so the pair is whole again. The 02:30 dump and the 03:30 off-site copy resume on their normal schedule, and the next weekly drill restores from the new primary.
A weekly timer is now scheduled, Sundays 03:30 for the database. Every row below is read from the published snapshot, so this list grows on its own and a failure appears here the same way a pass does — the first drill, on 24 July 2026, was started by hand. Nothing in this list has failed yet, which is a short history rather than a record.
| Run | Databases | Backup age | Tables | Rows sampled | Duration | Result |
|---|---|---|---|---|---|---|
| 2026-07-28T13:41:00Z | 16 | 11.1 h | 7855 | about 720937 | 86.0 s | pass |
| 2026-07-24T21:40:00Z | 1 | 19.2 h | 399 | about 25092 | 3.8 s | pass |
The drill above proves a database comes back. This one restores the whole cluster from the point-in-time repository, starts Postgres on it, opens a tenant and fetches a page over HTTP — and it is scheduled separately, Sundays 05:00. 10 runs have been recorded, of which 6 failed. The first scheduled run, on 26 July 2026, failed at the restore stage — the rows below are the attempts that followed, until it passed. We publish the attempts rather than only the outcome.
| Run | Duration | Failed at | Result |
|---|---|---|---|
| 2026-08-23T05:00:00Z | 123.0 s | — | pass |
| 2026-08-16T05:00:00Z | 103.0 s | database | fail |
| 2026-08-09T05:00:07Z | 112.0 s | — | pass |
| 2026-08-02T05:00:07Z | 87.0 s | — | pass |
| 2026-07-26T14:47:28Z | 93.0 s | — | pass |
| 2026-07-26T14:44:52Z | 117.0 s | database | fail |
Next scheduled drill: 2026-08-30T03:30:00Z.
Send an export of whatever you run today. It is restored on a throwaway database, read, and you get the log: what came through clean, what did not, and how old the copy you sent us really was. No charge, and no follow-up call unless you ask for one.