(Based on Paul S Randal articles)
Logging exists to support a variety of operations in SQL Server. It allows a backup copy of the transaction log to be taken so that a database can be restored and the transaction log backups replayed to bring the database to a specific point in time with transactional consistency. And it supports features that rely on reading the transaction log, such as replication, database mirroring, and change data capture.
Logging exists to support a variety of operations in SQL Server. It allows a backup copy of the transaction log to be taken so that a database can be restored and the transaction log backups replayed to bring the database to a specific point in time with transactional consistency. And it supports features that rely on reading the transaction log, such as replication, database mirroring, and change data capture.
The majority of uses of logging involve a mechanism called
recovery. Recovery is the process of having the changes described in log
records replayed or reverted in the database. Replaying log records is called
the REDO (or roll forward) phase of recovery. Reverting log records is called
the UNDO (or roll back) phase of recovery.
The
simple form of recovery is when a single transaction is canceled, in which case
it is undone and there is no net effect on the database. The most complex form
is crash recovery—when SQL Server crashes (for whatever reason) and the
transaction log must be recovered to bring the database to a transactionally
consistent point. This means that all transactions that were committed at the
time of the crash must be rolled forward to ensure their effects are persisted
in the database. And all in-flight transactions that had not committed at the
time of the crash must be rolled back to ensure their effects are not persisted
in the database.
So how
does recovery know what to do? All recovery processes depend on the fact that
each log record is stamped with a log sequence number (LSN). A log sequence
number is an ever-increasing, three-part number that uniquely defines the
position of a log record within the transaction log. Each log record in a
transaction is stored in sequential order within the transaction log and
contains the transaction ID and the LSN of the previous log record for the
transaction.
For the
simple case of a single transaction being rolled back, the recovery mechanism
can easily and quickly follow the chain of logged operations from the most
recent operation back to the first operation and undo the effects of the
operations in the opposite order from which they occurred. The database pages
that were affected by the transaction are either still in the buffer pool or on
disk. In either case, the image of the page that is available is guaranteed to
be one where the effect of the transaction is reflected on the page and must be
undone.
During
crash recovery, the mechanism is more complicated. The fact that database pages
are not written to disk when a transaction commits means that there is no
guarantee that the set of database pages on disk accurately reflects the set of
changes described in the transaction log—either for committed or uncommitted
transactions. However, all database pages have a field in their page header (a
96-byte portion of the 8192-byte page that contains metadata about the page)
that contains the LSN of the last log record that affected the page. This
allows the recovery system to decide what to do about a particular log record
that it must recover:
- For a log record from a committed transaction where the database
page has an LSN equal to or greater than the LSN of the log record,
nothing needs to be done. The effect of the log record has already been
persisted on the page on disk.
- For a log record from a committed transaction where the database
page has an LSN less than the LSN of the log record, the log record must
be redone to ensure the transaction effects are persisted.
- For a log record from an uncommitted transaction where the database
page has an LSN equal to or greater than the LSN of the log record, the
log record must be undone to ensure the transaction effects are not
persisted.
- For a log record from an uncommitted transaction where the database
page has an LSN less than the LSN of the log record, nothing needs to be
done. The effect of the log record was not persisted on the page on disk
and as such does not need to be undone.
Crash
recovery reads through the transaction log and ensures that all effects of all
committed transactions are persisted in the database, and all effects of all
uncommitted transactions are not persisted in the database.
One of the uses of a checkpoint operation is
to reduce the amount of time that crash recovery takes. By periodically
flushing out all dirty pages to disk, the number of pages that have changed
because of committed transactions but whose images are not on disk is reduced.
This, in turn, reduces the number of pages that need to have REDO recovery
applied during crash recovery.
No comments:
Post a Comment