Перейти к основному содержимому

Хранение журнала отката (undo)

примечание

Эта страница переведена при помощи нейросети GigaChat.

OrioleDB может хранить журнал отката (undo) в файлах, но также обеспечивает буферизацию в оперативной памяти. Буферизация предназначена для обеспечения наиболее быстрого доступа к самым последним записям отката. Общий размер буферов отката контролируется параметром GUC orioledb.undo_buffers. Данный размер разделяется на две половины: одна для кольцевого буфера, другая для блочных буферов.

OrioleDB сохраняет такое количество записей журнала отката, которое необходимо для выполнения следующих требований:

  • откат любых транзакций в процессе выполнения;
  • обслуживание любых существующих снимков;
  • откат любых транзакций во время создания контрольной точки.

На рисунке ниже показан процесс заполнения кольцевого буфера отката. Позиция удержания (retain location) — минимальная позиция, до которой необходимо сохранять записи отката для выполнения требований. Стрелки между записями отката иллюстрируют порядок вставки, а не фактические ссылки.

Кольцевой буфер отката

После достижения конца кольцевого буфера заполнение продолжается с начала, если позиция удержания позволяет это сделать без перезаписи необходимых записей отката. При условии, что не требуется удерживать слишком большое количество записей отката, все они могут храниться в кольцевом буфере.

Переполнение кольцевого буфера отката

При необходимости добавить новую запись отката, когда соответствующее место в буфере занято удерживаемыми записями отката, часть записей записывается в файлы отката. На рисунке ниже показано разделение журнала отката между кольцевым буфером и файлом отката. Записи до позиции записи (written location) сохраняются в файлах отката, а записи после позиции записи остаются в кольцевом буфере. Если нет необходимости удерживать значительную часть журнала отката (например, завершена длительная транзакция), возможно вернуться к хранению всего журнала отката в кольцевом буфере.

Разделение журнала отката

Два следующих рисунка поясняют процесс записи группы записей отката в файл данных. Сначала устанавливается позиция «запись в процессе» (write in-progress). Это означает, что записи отката в диапазоне [позиция записи; позиция записи в процессе) подлежат записи в файлы отката. В этот период записи отката из данного диапазона могут считываться из кольцевого буфера, но не могут изменяться (в некоторых ситуациях требуется обновление существующих записей отката).

Запись журнала отката в процессе

После завершения записи позиция записи сдвигается вперед, и весь диапазон отката становится доступен для чтения и записи.

Запись журнала отката завершена