|PostgreSQL 8.1.23 Documentation
|Chapter 26. Reliability and the Write-Ahead Log
Write-Ahead Logging (WAL) is a standard approach to transaction logging. Its detailed description may be found in most (if not all) books about transaction processing. Briefly, WAL's central concept is that changes to data files (where tables and indexes reside) must be written only after those changes have been logged, that is, when log records describing the changes have been flushed to permanent storage. If we follow this procedure, we do not need to flush data pages to disk on every transaction commit, because we know that in the event of a crash we will be able to recover the database using the log: any changes that have not been applied to the data pages can be redone from the log records. (This is roll-forward recovery, also known as REDO.)
A major benefit of using WAL is a significantly reduced number of disk
writes, because only the log file needs to be flushed to disk at
the time of transaction commit, rather than every data file
changed by the transaction. In multiuser environments, commits of
many transactions may be accomplished with a single
fsync of the log file. Furthermore, the log
file is written sequentially, and so the cost of syncing the log
is much less than the cost of flushing the data pages. This is
especially true for servers handling many small transactions
touching different parts of the data store.
WAL also makes it possible to support on-line backup and point-in-time recovery, as described in Section 23.3. By archiving the WAL data we can support reverting to any time instant covered by the available WAL data: we simply install a prior physical backup of the database, and replay the WAL log just as far as the desired time. What's more, the physical backup doesn't have to be an instantaneous snapshot of the database state — if it is made over some period of time, then replaying the WAL log for that period will fix any internal inconsistencies.