Под надежностью хранения понимается то, что СУБД должна быть в состоянии восстановить последнее согласованное состояние БД после любого аппаратного или программного сбоя.
Два возможных вида аппаратных сбоев:
- мягкие сбои (внезапная остановка работы компьютера или аварийное выключение питания)
- жесткие сбои (потерей информации на носителях внешней памяти)
Примеры программных сбоев:
- аварийное завершение работы СУБД (по причине ошибки в программе или в результате некоторого аппаратного сбоя). Можно рассматривать как особый вид мягкого аппаратного сбоя (требуется ликвидировать последствия только одной транзакции).
- аварийное завершение пользовательской программы, в результате чего некоторая транзакция остается незавершенной.
Для поддержания надежности хранения данных в БД требуется избыточность хранения данных. Наиболее распространенным методом поддержания такой избыточной информации является ведение журнала изменений БД.
Журнал - это особая часть БД, недоступная пользователям СУБД и поддерживаемая с особой тщательностью, в которую поступают записи обо всех изменениях основной части БД.
В разных СУБД изменения БД журнализуются на разных уровнях, при этом запись в журнале соответствует:
- некоторой логической операции изменения БД
- минимальной внутренней операции модификации страницы внешней памяти;
В некоторых системах одновременно используются оба подхода.
Во всех случаях придерживаются стратегии "упреждающей" записи в журнал (протокол Write Ahead Log - WAL). Эта стратегия заключается в том, что запись об изменении любого объекта БД должна попасть во внешнюю память журнала раньше, чем измененный объект попадет во внешнюю память основной части БД. Если в СУБД корректно соблюдается протокол WAL, то с помощью журнала можно решить все проблемы восстановления БД после любого сбоя.
Типичные схемы использования журнала:
- индивидуальный откат транзакции
журнал сканируется в обратном направлении, и все записи отменяемой транзакции извлекаются из журнала вплоть до отметки начала транзакции. Согласно извлеченной информации выполняются действия, отменяющие действия транзакции, а в журнал записываются компенсирующие записи. Этот процесс называется откат (rollback).
- восстановления БД при мягком сбое
Сначала производится откат незавершенных транзакций (undo), а потом повторно воспроизводят (redo) те операции завершенных транзакций, результаты которых не отображены во внешней памяти.
- восстановления БД при жестком сбое
Используется журнал и архивная копия БД. Восстановление БД состоит в том, что исходя из архивной копии по журналу, воспроизводится работа всех транзакций, которые закончились к моменту сбоя.