Для выполнения восстановления необходима дополнительная информация. Она поддерживается в виде журнала изменений БД. Общей целью журнализации является обеспечение возможности восстановления БД после любого сбоя.
Общие принципы восстановления следующие:
1. Результаты зафиксированных транзакций сохраняются.
2. Результаты незафиксированных транзакций отсутствуют.
В файл журнала может помещаться следующая информация – записи о транзакциях и записи о контрольных точках.
Основой восстановления является избыточное хранение данных. Эти данные хранятся в журнале и представляют собой последовательности записей об изменении БД. При этом иногда для каждой транзакции поддерживается отдельный локальный журнал изменений БД, и, кроме этого, поддерживается общий журнал изменений БД. Этот вариант позволяет быстро выполнить индивидуальные откаты транзакций, но информация дублируется в локальных и общих журналах.
Второй вариант поддерживает только общий журнал изменений БД. Он применяется чаще всего.
Для сведения к минимуму потерь времени на ведение журнала используются буферы процессора как более быстродействующие устройства внешней памяти. По мере наполнения буфера очередная страница «выталкивается» в файл журнала (во внешнюю память). В случае мягкого сбоя надо обязательно иметь некоторое согласованное состояние журнала и БД во внешней памяти для проведения процедуры восстановления. Поэтому существует специальный протокол журнализации WAL (Write Ahead Log) и состоит он в том, что при занесении во внешнюю память измененного объекта БД, перед этим нужно гарантированно вытолкнуть во внешнюю память журнала записи о его изменении. Дополнительное условие на выталкивание буферов накладывается требованием: каждая успешно завершенная транзакция должна быть зафиксирована во внешней памяти. Какой бы сбой не произошел, система должна восстановить БД таким образом, чтобы зафиксировать все результаты к моменту сбоя. Достаточным требованием для этого есть выталкивание при фиксации транзакций всех изменений, относящихся к этой транзакции, в файл журнала. Последняя запись в журнал о данной транзакции – запись о ее конце.
Все записи о данной транзакции связываются в стек. Началом списка является запись о последнем изменении БД, произведенном данной транзакцией.
Порядок отката:
1. Выбирается очередная запись из списка данной транзакции.
2. Выполняется противоположные по списку операции (например, вставка вместо удаления). Тем самым восстанавливается предыдущее состояние объекта БД.
3. Обратные операции журнализируются.
4. При успешном завершении отката в журнал заносится запись о конце транзакции. С точки зрения механизма журнализации такая запись является фиксированной.