Skip to content
About
Main content

Two liabilities: recovery and space

Which two liabilities does every commit build up, and what does recovery time really depend on?

Logs and undo and Group commit and fsync bought cheap commits by deferring work. The log lets you say "yes" after one force and settle up later. This article is the bill arriving.

Two different liabilities build up on every commit, and most explanations mix them up:

  • A recovery liability: the distance back to a point where you know how the on-disk state relates to the log. Measured in time to restart.
  • A space liability: how much log you must physically keep. Measured in bytes retained.

They have different collectors and different release conditions. The central mistake is to think one pays off the other:

The guiding question: since the log is an unbounded liability that grows at the write rate, what is the cheapest way to create a recent, trustworthy starting point, and who must agree before the past may be thrown away?

The log is the only part of the system that grows in proportion to your success. Every mechanism here is a negotiation with someone who has not finished reading it yet.

The equation this article optimizes

Recovery must replay the log from the oldest record whose effect might not be on disk. So:

RTO ≈ (checkpoint_interval × log_write_rate) / replay_rate

The term that people get wrong is replay_rate. Writing the log is sequential. is random reads, because each record must first fetch its page before it can be applied. On a cold buffer pool (memory just emptied by the restart), replay is limited by random page reads and can run slower than the workload that produced the log. This is the mechanism behind the old InnoDB advice that a large redo log means unusable recovery.

This asymmetry is also why recovery has three passes, not two:

  1. Analysis: read the log from the last and rebuild the table of (pages that were changed in memory but may not be on disk) and the list of transactions that were active.
  2. Redo: "repeat history": re-apply every logged change that the pages do not yet contain, for all transactions, even those that will be rolled back.
  3. Undo: roll back the transactions that had not committed ("the losers").

The exists so that the redo pass knows which pages it will need before it starts, and can prefetch them in batches, turning random reads into something organized. Recovery speed is bought with a pass that does no recovery. During , each reversal is itself logged (a compensation log record, ) so that a crash during recovery does not undo the same change twice, and the work stays bounded.

Why redo the losers at all, if undo is about to reverse them? Undo operations, especially "" ones on index pages, are defined relative to the exact state at the moment of the crash. Restoring that state first makes undo a well-defined inverse. You cannot skip redo selectively, because at redo time you do not yet know what undo will need to see. And because each CLR carries an undoNextLSN (the next record still to undo) and is never itself undone, a crash in the middle of a long rollback resumes where it stopped instead of starting over. , and ARIES is the standard demonstration of designing for that.

One practical correction to the equation above: ARIES checkpoints are fuzzy, so the real bound on redo distance is the oldest dirty page, set by how far behind the background page cleaner is, not by the checkpoint interval alone. This is why tuning the background writer can move recovery time more than tuning checkpoint timeouts, and why a system under heavy write load recovers more slowly than the same system idle.

Write the equation as a ratio: recovery costs write_rate / replay_rate seconds of downtime for each second of checkpoint interval.

time between checkpoints
bytes of log written per second
bytes of log replayed per second on a cold pool
log 20 MB/s, replay 10 MB/slog 28 MB/s, replay 14 MB/slog 10 MB/s, replay 40 MB/s
Data table
Worst-case recovery time by checkpoint interval
Checkpoint interval τ (seconds)seriesRecovery time
30 slog 20 MB/s, replay 10 MB/s60 s
52.1 slog 20 MB/s, replay 10 MB/s104 s
74.3 slog 20 MB/s, replay 10 MB/s149 s
96.4 slog 20 MB/s, replay 10 MB/s193 s
119 slog 20 MB/s, replay 10 MB/s237 s
141 slog 20 MB/s, replay 10 MB/s281 s
163 slog 20 MB/s, replay 10 MB/s326 s
185 slog 20 MB/s, replay 10 MB/s370 s
207 slog 20 MB/s, replay 10 MB/s414 s
229 slog 20 MB/s, replay 10 MB/s458 s
251 slog 20 MB/s, replay 10 MB/s503 s
273 slog 20 MB/s, replay 10 MB/s547 s
296 slog 20 MB/s, replay 10 MB/s591 s
318 slog 20 MB/s, replay 10 MB/s635 s
340 slog 20 MB/s, replay 10 MB/s680 s
362 slog 20 MB/s, replay 10 MB/s724 s
384 slog 20 MB/s, replay 10 MB/s768 s
406 slog 20 MB/s, replay 10 MB/s812 s
428 slog 20 MB/s, replay 10 MB/s857 s
450 slog 20 MB/s, replay 10 MB/s901 s
473 slog 20 MB/s, replay 10 MB/s945 s
495 slog 20 MB/s, replay 10 MB/s989 s
517 slog 20 MB/s, replay 10 MB/s1,030 s
539 slog 20 MB/s, replay 10 MB/s1,080 s
561 slog 20 MB/s, replay 10 MB/s1,120 s
583 slog 20 MB/s, replay 10 MB/s1,170 s
605 slog 20 MB/s, replay 10 MB/s1,210 s
627 slog 20 MB/s, replay 10 MB/s1,250 s
650 slog 20 MB/s, replay 10 MB/s1,300 s
672 slog 20 MB/s, replay 10 MB/s1,340 s
694 slog 20 MB/s, replay 10 MB/s1,390 s
716 slog 20 MB/s, replay 10 MB/s1,430 s
738 slog 20 MB/s, replay 10 MB/s1,480 s
760 slog 20 MB/s, replay 10 MB/s1,520 s
782 slog 20 MB/s, replay 10 MB/s1,560 s
804 slog 20 MB/s, replay 10 MB/s1,610 s
827 slog 20 MB/s, replay 10 MB/s1,650 s
849 slog 20 MB/s, replay 10 MB/s1,700 s
871 slog 20 MB/s, replay 10 MB/s1,740 s
893 slog 20 MB/s, replay 10 MB/s1,790 s
915 slog 20 MB/s, replay 10 MB/s1,830 s
937 slog 20 MB/s, replay 10 MB/s1,870 s
959 slog 20 MB/s, replay 10 MB/s1,920 s
981 slog 20 MB/s, replay 10 MB/s1,960 s
1,000 slog 20 MB/s, replay 10 MB/s2,010 s
1,030 slog 20 MB/s, replay 10 MB/s2,050 s
1,050 slog 20 MB/s, replay 10 MB/s2,100 s
1,070 slog 20 MB/s, replay 10 MB/s2,140 s
1,090 slog 20 MB/s, replay 10 MB/s2,180 s
1,110 slog 20 MB/s, replay 10 MB/s2,230 s
1,140 slog 20 MB/s, replay 10 MB/s2,270 s
1,160 slog 20 MB/s, replay 10 MB/s2,320 s
1,180 slog 20 MB/s, replay 10 MB/s2,360 s
1,200 slog 20 MB/s, replay 10 MB/s2,410 s
1,220 slog 20 MB/s, replay 10 MB/s2,450 s
1,250 slog 20 MB/s, replay 10 MB/s2,490 s
1,270 slog 20 MB/s, replay 10 MB/s2,540 s
1,290 slog 20 MB/s, replay 10 MB/s2,580 s
1,310 slog 20 MB/s, replay 10 MB/s2,630 s
1,340 slog 20 MB/s, replay 10 MB/s2,670 s
1,360 slog 20 MB/s, replay 10 MB/s2,720 s
1,380 slog 20 MB/s, replay 10 MB/s2,760 s
1,400 slog 20 MB/s, replay 10 MB/s2,800 s
1,420 slog 20 MB/s, replay 10 MB/s2,850 s
1,450 slog 20 MB/s, replay 10 MB/s2,890 s
1,470 slog 20 MB/s, replay 10 MB/s2,940 s
1,490 slog 20 MB/s, replay 10 MB/s2,980 s
1,510 slog 20 MB/s, replay 10 MB/s3,020 s
1,530 slog 20 MB/s, replay 10 MB/s3,070 s
1,560 slog 20 MB/s, replay 10 MB/s3,110 s
1,580 slog 20 MB/s, replay 10 MB/s3,160 s
1,600 slog 20 MB/s, replay 10 MB/s3,200 s
1,620 slog 20 MB/s, replay 10 MB/s3,250 s
1,650 slog 20 MB/s, replay 10 MB/s3,290 s
1,670 slog 20 MB/s, replay 10 MB/s3,330 s
1,690 slog 20 MB/s, replay 10 MB/s3,380 s
1,710 slog 20 MB/s, replay 10 MB/s3,420 s
1,730 slog 20 MB/s, replay 10 MB/s3,470 s
1,760 slog 20 MB/s, replay 10 MB/s3,510 s
1,780 slog 20 MB/s, replay 10 MB/s3,560 s
1,800 slog 20 MB/s, replay 10 MB/s3,600 s
30 slog 28 MB/s, replay 14 MB/s60 s
52.1 slog 28 MB/s, replay 14 MB/s104 s
74.3 slog 28 MB/s, replay 14 MB/s149 s
96.4 slog 28 MB/s, replay 14 MB/s193 s
119 slog 28 MB/s, replay 14 MB/s237 s
141 slog 28 MB/s, replay 14 MB/s281 s
163 slog 28 MB/s, replay 14 MB/s326 s
185 slog 28 MB/s, replay 14 MB/s370 s
207 slog 28 MB/s, replay 14 MB/s414 s
229 slog 28 MB/s, replay 14 MB/s458 s
251 slog 28 MB/s, replay 14 MB/s503 s
273 slog 28 MB/s, replay 14 MB/s547 s
296 slog 28 MB/s, replay 14 MB/s591 s
318 slog 28 MB/s, replay 14 MB/s635 s
340 slog 28 MB/s, replay 14 MB/s680 s
362 slog 28 MB/s, replay 14 MB/s724 s
384 slog 28 MB/s, replay 14 MB/s768 s
406 slog 28 MB/s, replay 14 MB/s812 s
428 slog 28 MB/s, replay 14 MB/s857 s
450 slog 28 MB/s, replay 14 MB/s901 s
473 slog 28 MB/s, replay 14 MB/s945 s
495 slog 28 MB/s, replay 14 MB/s989 s
517 slog 28 MB/s, replay 14 MB/s1,030 s
539 slog 28 MB/s, replay 14 MB/s1,080 s
561 slog 28 MB/s, replay 14 MB/s1,120 s
583 slog 28 MB/s, replay 14 MB/s1,170 s
605 slog 28 MB/s, replay 14 MB/s1,210 s
627 slog 28 MB/s, replay 14 MB/s1,250 s
650 slog 28 MB/s, replay 14 MB/s1,300 s
672 slog 28 MB/s, replay 14 MB/s1,340 s
694 slog 28 MB/s, replay 14 MB/s1,390 s
716 slog 28 MB/s, replay 14 MB/s1,430 s
738 slog 28 MB/s, replay 14 MB/s1,480 s
760 slog 28 MB/s, replay 14 MB/s1,520 s
782 slog 28 MB/s, replay 14 MB/s1,560 s
804 slog 28 MB/s, replay 14 MB/s1,610 s
827 slog 28 MB/s, replay 14 MB/s1,650 s
849 slog 28 MB/s, replay 14 MB/s1,700 s
871 slog 28 MB/s, replay 14 MB/s1,740 s
893 slog 28 MB/s, replay 14 MB/s1,790 s
915 slog 28 MB/s, replay 14 MB/s1,830 s
937 slog 28 MB/s, replay 14 MB/s1,870 s
959 slog 28 MB/s, replay 14 MB/s1,920 s
981 slog 28 MB/s, replay 14 MB/s1,960 s
1,000 slog 28 MB/s, replay 14 MB/s2,010 s
1,030 slog 28 MB/s, replay 14 MB/s2,050 s
1,050 slog 28 MB/s, replay 14 MB/s2,100 s
1,070 slog 28 MB/s, replay 14 MB/s2,140 s
1,090 slog 28 MB/s, replay 14 MB/s2,180 s
1,110 slog 28 MB/s, replay 14 MB/s2,230 s
1,140 slog 28 MB/s, replay 14 MB/s2,270 s
1,160 slog 28 MB/s, replay 14 MB/s2,320 s
1,180 slog 28 MB/s, replay 14 MB/s2,360 s
1,200 slog 28 MB/s, replay 14 MB/s2,410 s
1,220 slog 28 MB/s, replay 14 MB/s2,450 s
1,250 slog 28 MB/s, replay 14 MB/s2,490 s
1,270 slog 28 MB/s, replay 14 MB/s2,540 s
1,290 slog 28 MB/s, replay 14 MB/s2,580 s
1,310 slog 28 MB/s, replay 14 MB/s2,630 s
1,340 slog 28 MB/s, replay 14 MB/s2,670 s
1,360 slog 28 MB/s, replay 14 MB/s2,720 s
1,380 slog 28 MB/s, replay 14 MB/s2,760 s
1,400 slog 28 MB/s, replay 14 MB/s2,800 s
1,420 slog 28 MB/s, replay 14 MB/s2,850 s
1,450 slog 28 MB/s, replay 14 MB/s2,890 s
1,470 slog 28 MB/s, replay 14 MB/s2,940 s
1,490 slog 28 MB/s, replay 14 MB/s2,980 s
1,510 slog 28 MB/s, replay 14 MB/s3,020 s
1,530 slog 28 MB/s, replay 14 MB/s3,070 s
1,560 slog 28 MB/s, replay 14 MB/s3,110 s
1,580 slog 28 MB/s, replay 14 MB/s3,160 s
1,600 slog 28 MB/s, replay 14 MB/s3,200 s
1,620 slog 28 MB/s, replay 14 MB/s3,250 s
1,650 slog 28 MB/s, replay 14 MB/s3,290 s
1,670 slog 28 MB/s, replay 14 MB/s3,330 s
1,690 slog 28 MB/s, replay 14 MB/s3,380 s
1,710 slog 28 MB/s, replay 14 MB/s3,420 s
1,730 slog 28 MB/s, replay 14 MB/s3,470 s
1,760 slog 28 MB/s, replay 14 MB/s3,510 s
1,780 slog 28 MB/s, replay 14 MB/s3,560 s
1,800 slog 28 MB/s, replay 14 MB/s3,600 s
30 slog 10 MB/s, replay 40 MB/s7.5 s
52.1 slog 10 MB/s, replay 40 MB/s13 s
74.3 slog 10 MB/s, replay 40 MB/s18.6 s
96.4 slog 10 MB/s, replay 40 MB/s24.1 s
119 slog 10 MB/s, replay 40 MB/s29.6 s
141 slog 10 MB/s, replay 40 MB/s35.2 s
163 slog 10 MB/s, replay 40 MB/s40.7 s
185 slog 10 MB/s, replay 40 MB/s46.2 s
207 slog 10 MB/s, replay 40 MB/s51.8 s
229 slog 10 MB/s, replay 40 MB/s57.3 s
251 slog 10 MB/s, replay 40 MB/s62.8 s
273 slog 10 MB/s, replay 40 MB/s68.3 s
296 slog 10 MB/s, replay 40 MB/s73.9 s
318 slog 10 MB/s, replay 40 MB/s79.4 s
340 slog 10 MB/s, replay 40 MB/s84.9 s
362 slog 10 MB/s, replay 40 MB/s90.5 s
384 slog 10 MB/s, replay 40 MB/s96 s
406 slog 10 MB/s, replay 40 MB/s102 s
428 slog 10 MB/s, replay 40 MB/s107 s
450 slog 10 MB/s, replay 40 MB/s113 s
473 slog 10 MB/s, replay 40 MB/s118 s
495 slog 10 MB/s, replay 40 MB/s124 s
517 slog 10 MB/s, replay 40 MB/s129 s
539 slog 10 MB/s, replay 40 MB/s135 s
561 slog 10 MB/s, replay 40 MB/s140 s
583 slog 10 MB/s, replay 40 MB/s146 s
605 slog 10 MB/s, replay 40 MB/s151 s
627 slog 10 MB/s, replay 40 MB/s157 s
650 slog 10 MB/s, replay 40 MB/s162 s
672 slog 10 MB/s, replay 40 MB/s168 s
694 slog 10 MB/s, replay 40 MB/s173 s
716 slog 10 MB/s, replay 40 MB/s179 s
738 slog 10 MB/s, replay 40 MB/s185 s
760 slog 10 MB/s, replay 40 MB/s190 s
782 slog 10 MB/s, replay 40 MB/s196 s
804 slog 10 MB/s, replay 40 MB/s201 s
827 slog 10 MB/s, replay 40 MB/s207 s
849 slog 10 MB/s, replay 40 MB/s212 s
871 slog 10 MB/s, replay 40 MB/s218 s
893 slog 10 MB/s, replay 40 MB/s223 s
915 slog 10 MB/s, replay 40 MB/s229 s
937 slog 10 MB/s, replay 40 MB/s234 s
959 slog 10 MB/s, replay 40 MB/s240 s
981 slog 10 MB/s, replay 40 MB/s245 s
1,000 slog 10 MB/s, replay 40 MB/s251 s
1,030 slog 10 MB/s, replay 40 MB/s256 s
1,050 slog 10 MB/s, replay 40 MB/s262 s
1,070 slog 10 MB/s, replay 40 MB/s267 s
1,090 slog 10 MB/s, replay 40 MB/s273 s
1,110 slog 10 MB/s, replay 40 MB/s279 s
1,140 slog 10 MB/s, replay 40 MB/s284 s
1,160 slog 10 MB/s, replay 40 MB/s290 s
1,180 slog 10 MB/s, replay 40 MB/s295 s
1,200 slog 10 MB/s, replay 40 MB/s301 s
1,220 slog 10 MB/s, replay 40 MB/s306 s
1,250 slog 10 MB/s, replay 40 MB/s312 s
1,270 slog 10 MB/s, replay 40 MB/s317 s
1,290 slog 10 MB/s, replay 40 MB/s323 s
1,310 slog 10 MB/s, replay 40 MB/s328 s
1,340 slog 10 MB/s, replay 40 MB/s334 s
1,360 slog 10 MB/s, replay 40 MB/s339 s
1,380 slog 10 MB/s, replay 40 MB/s345 s
1,400 slog 10 MB/s, replay 40 MB/s350 s
1,420 slog 10 MB/s, replay 40 MB/s356 s
1,450 slog 10 MB/s, replay 40 MB/s362 s
1,470 slog 10 MB/s, replay 40 MB/s367 s
1,490 slog 10 MB/s, replay 40 MB/s373 s
1,510 slog 10 MB/s, replay 40 MB/s378 s
1,530 slog 10 MB/s, replay 40 MB/s384 s
1,560 slog 10 MB/s, replay 40 MB/s389 s
1,580 slog 10 MB/s, replay 40 MB/s395 s
1,600 slog 10 MB/s, replay 40 MB/s400 s
1,620 slog 10 MB/s, replay 40 MB/s406 s
1,650 slog 10 MB/s, replay 40 MB/s411 s
1,670 slog 10 MB/s, replay 40 MB/s417 s
1,690 slog 10 MB/s, replay 40 MB/s422 s
1,710 slog 10 MB/s, replay 40 MB/s428 s
1,730 slog 10 MB/s, replay 40 MB/s433 s
1,760 slog 10 MB/s, replay 40 MB/s439 s
1,780 slog 10 MB/s, replay 40 MB/s444 s
1,800 slog 10 MB/s, replay 40 MB/s450 s