Поделиться через


Поддержка архивации в CLFS

Общая файловая система журналов (CLFS) поддерживает архивацию выделенных журналов, поддерживая архивный хвост. При вызове ClfsCreateLogFile для создания выделенного журнала можно задать флаг FILE_ATTRIBUTE_ARCHIVE параметра fFlagsAndAttributes , чтобы указать, что CLFS должен поддерживать архивный хвост журнала. Журнал, для которого CLFS поддерживает архивный хвост, называется неэфемерным журналом.

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

В предыдущем абзаце описывается архивация записей базы данных, но в других сценариях может потребоваться архивировать записи журнала. В любом случае за архивацию отвечают клиенты (ваше программное обеспечение). Вы можете отслеживать выполненную архивацию, задав хвост архива журнала. Хвост архива — это номер журнала (LSN) самой старой записи, архивация которой еще не завершена.

Неэфемерный журнал фактически имеет два хвоста: один помечен базовым номером LSN, а второй — хвост архива. Вы можете расположить два хвоста по своему размеру, вызвав ClfsAdvanceLogBase (или ClfsWriteRestartArea) и ClfsSetArchiveTail. Как правило, базовый номер LSN указывает на старую запись, которая по-прежнему требуется для отката транзакций или восстановления перезапуска, а хвост архива указывает на старую запись, для которой архивация не выполнена. Обратите внимание, что архивный хвост может быть меньше базового номера LSN или больше базового номера LSN.

Базовый номер LSN и хвост архива важны при многократном вызове ClfsReadNextLogRecord для считывания цепочки записей, связанных с предыдущими номерами LSN, отменой следующего номера LSN или пользовательскими номерами LSN. ClfsReadNextLogRecord не считывает запись, номер LSN которой меньше, чем архивный и базовый номер LSN. Однако он будет считывать запись, номер LSN которой находится между хвостом архива и базовым номером LSN. Дополнительные сведения о следующих цепочках записей см. в разделе Чтение записей данных из потока CLFS.