Введение

JET Red – это механизм хранения данных ISAM (индексированный последовательный метод доступа) от Microsoft. Расширяемый механизм хранения (ESE), также известный как JET Blue, лежит в основе Microsoft Exchange Server, Active Directory и Windows Search. Он также используется во многих компонентах Windows, включая клиент Windows Update и Центр справки и поддержки. Его назначение – обеспечить приложениям возможность хранения и извлечения данных с использованием индексированного и последовательного доступа. ESE обеспечивает обновление и извлечение данных в рамках транзакций. Предусмотрен механизм восстановления после сбоев, обеспечивающий сохранение целостности данных даже в случае аварийного завершения работы системы. Транзакции в ESE отличаются высокой степенью параллельности, что делает ESE подходящим для серверных приложений. ESE интеллектуально кэширует данные для обеспечения быстрого доступа к ним. Кроме того, ESE отличается небольшим размером, что делает его подходящим для вспомогательных приложений. Среда выполнения ESE (ESENT.DLL) поставляется со всеми версиями Windows, начиная с Windows 2000, а 64-разрядная версия среды выполнения ESE поставляется с 64-разрядными версиями Windows XP и Windows Server 2003. Microsoft Exchange, вплоть до Exchange 2003, поставлялся только с 32-разрядной версией, поскольку это была единственная поддерживаемая платформа. Начиная с Exchange 2007, он поставляется с 64-разрядной версией.

Базы данных

База данных представляет собой как физическую, так и логическую группировку данных. База данных ESE выглядит как единый файл для Windows. Внутренне база данных представляет собой набор страниц размером 2, 4, 8, 16 или 32 КБ (опции страниц 16 и 32 КБ доступны только в Windows 7 и Exchange 2010), организованных в сбалансированную структуру B-дерева. Эти страницы содержат метаданные для описания данных, хранящихся в базе данных, сами данные, индексы для сохранения интересующих порядков данных и другую информацию. Эта информация перемешана в файле базы данных, но предпринимаются усилия для того, чтобы совместно используемые данные располагались близко друг к другу внутри базы данных. База данных ESE может содержать до 232 страниц, или 16 терабайт данных, при размере страниц 8 килобайт. Базы данных ESE организованы в группы, называемые экземплярами (инстанциями). Большинство приложений используют один экземпляр, но все приложения также могут использовать несколько экземпляров. Важность экземпляра заключается в том, что он связывает единую серию журналов восстановления с одной или несколькими базами данных. В настоящее время к экземпляру ESE можно подключить до 6 пользовательских баз данных одновременно. Каждый отдельный процесс, использующий ESE, может иметь до 1024 экземпляров ESE. База данных является переносимой, поскольку ее можно отсоединить от работающего экземпляра ESE и впоследствии подключить к тому же или другому работающему экземпляру. В отсоединенном состоянии базу данных можно копировать с помощью стандартных утилит Windows. Копирование базы данных невозможно во время ее активного использования, поскольку ESE открывает файлы базы данных в эксклюзивном режиме. База данных может физически располагаться на любом устройстве, поддерживающем напрямую адресуемые операции ввода-вывода в Windows.

Таблицы

Таблица представляет собой однородный набор записей, где каждая запись имеет одинаковый набор столбцов. Каждая таблица идентифицируется именем таблицы, область видимости которого локальна для базы данных, в которой она содержится. Объем дискового пространства, выделенного таблице в базе данных, определяется параметром, заданным при создании таблицы с помощью операции CreateTable. Таблицы автоматически увеличиваются по мере добавления данных. Таблицы имеют один или несколько индексов. Для данных таблицы должен быть как минимум один кластерный индекс. Если приложение не определяет кластерный индекс, используется искусственный индекс, который упорядочивает и кластеризует записи в хронологическом порядке их вставки. Индексы определяются для сохранения значимых порядков данных и обеспечивают как последовательный доступ к записям в порядке индекса, так и прямой доступ к записям по значениям столбцов индекса. Кластерные индексы в ESE также должны быть первичными, то есть ключ индекса должен быть уникальным. Кластерные и некластерные индексы представлены с использованием B+-деревьев. Если операция вставки или обновления приводит к переполнению страницы, страница разделяется: выделяется новая страница и логически вставляется между двумя ранее соседними страницами. Поскольку эта новая страница физически не соседствует со своими логическими соседями, доступ к ней менее эффективен. ESE имеет функцию онлайн-компактизации, которая переупаковывает данные. Если ожидается, что таблица будет часто обновляться, можно зарезервировать место для будущих вставок, указав подходящую плотность страниц при создании таблицы или индекса. Это позволяет избежать или отложить операции разделения.

Записи и столбцы

Запись – это набор связанных значений столбцов. Записи вставляются и обновляются посредством операций обновления и могут быть удалены с помощью операций удаления. Столбцы устанавливаются и извлекаются с помощью операций SetColumns и RetrieveColumns соответственно. Максимальный размер записи составляет 8110 байт для страниц размером 8 килобайт, за исключением столбцов с длинными значениями. Типы столбцов LongText и LongBinary не оказывают существенного влияния на это ограничение размера, и записи могут содержать данные, значительно превышающие размер страницы базы данных, когда данные хранятся в столбцах с длинными значениями. При хранении ссылки на длинное значение в записи требуется всего 9 байт данных в самой записи. Эти длинные значения могут достигать размера до 2 гигабайт (ГБ). Записи обычно однородны, то есть каждая запись содержит набор значений для одного и того же набора столбцов. В ESE также можно определить большое количество столбцов для таблицы, при этом любая конкретная запись может содержать лишь небольшое число столбцов, не имеющих значения NULL. В этом смысле таблица также может представлять собой коллекцию разнородных записей. ESE поддерживает широкий диапазон значений столбцов, размер которых варьируется от 1 бита до 2 ГБ. Выбор правильного типа столбца важен, поскольку тип столбца определяет многие его свойства, включая порядок сортировки для индексов. ESE поддерживает следующие типы данных:

Фиксированные, переменные и маркированные столбцы

Каждая таблица ESE может определять до 127 столбцов фиксированной длины, 128 столбцов переменной длины и 64 993 столбцов с тегами. Столбцы фиксированной длины – это, по сути, столбцы, занимающие одинаковый объем места в каждой записи, независимо от их значения. Столбцы фиксированной длины используют 1 бит для обозначения NULL-значения и фиксированный объем места в каждой записи, в которой этот столбец или последующий столбец фиксированной длины присутствует. Столбцы переменной длины – это, по сути, столбцы, занимающие переменный объем места в каждой записи, в которой они присутствуют, в зависимости от размера конкретного значения столбца. Столбцы переменной длины используют 2 байта для определения NULL-значения и размера, а также переменный объем места в каждой записи, в которой этот столбец присутствует. Столбцы с тегами – это столбцы, которые не занимают места, если они не установлены в записи. Они могут быть однозначными, но также могут быть многозначными. Один и тот же столбец с тегами может иметь несколько значений в одной записи. Когда столбцы с тегами установлены в записи, каждый экземпляр столбца с тегами занимает примерно 4 байта места, в дополнение к размеру значения экземпляра столбца с тегами. Когда количество экземпляров одного столбца с тегами велико, накладные расходы на каждый экземпляр составляют примерно 2 байта. Столбцы с тегами идеально подходят для разреженных столбцов, поскольку не занимают места, если они не установлены. Если многозначный столбец с тегами индексируется, индекс будет содержать одну запись для каждого значения этого столбца. Для данной таблицы столбцы относятся к одной из двух категорий: те, которые встречаются ровно один раз в каждой записи, возможно, с несколькими NULL-значениями; и те, которые встречаются редко или могут иметь несколько экземпляров в одной записи. Столбцы фиксированной и переменной длины относятся к первой категории, а столбцы с тегами – ко второй. Внутреннее представление этих двух категорий столбцов различно, и важно понимать компромиссы между ними. Столбцы фиксированной и переменной длины обычно представлены в каждой записи, даже если значение NULL. К этим столбцам можно быстро обратиться через таблицу смещений. Экземпляры столбцов с тегами предваряются идентификатором столбца, а поиск столбца осуществляется с помощью бинарного поиска в наборе столбцов с тегами.

Длинные значения

Типы столбцов "Длинный текст" и "Длинные двоичные данные" являются большими двоичными объектами. Они хранятся в отдельном B-дереве, отличном от кластеризованного индекса, ключом для которого служат длинное значение id и смещение в байтах. ESE поддерживает добавление данных, перезапись диапазона байтов и изменение размера для этих столбцов. Кроме того, ESE имеет функцию хранения единичного экземпляра, при которой несколько записей могут ссылаться на один и тот же большой двоичный объект, как если бы каждая запись содержала собственную копию информации, то есть без конфликтов блокировки между записями. Максимальный размер значения столбца "Длинный текст" или "Длинные двоичные данные" составляет 2 ГБ.

Строка "версия", "автоматическое увеличение" и "эскроу"

Колонки версий автоматически увеличиваются ESE каждый раз, когда запись, содержащая эту колонку, изменяется посредством операции обновления. Эта колонка не может быть установлена приложением, а только прочитана. Области применения колонок версий включают использование для определения необходимости обновления копии записи в памяти. Если значение в записи таблицы больше, чем значение в кэшированной копии, то кэшированная копия считается устаревшей. Колонки версий должны быть типа Long. Колонки автоматического инкремента автоматически устанавливаются ESE таким образом, чтобы значение, содержащееся в колонке, было уникальным для каждой записи в таблице. Эти колонки, как и колонки версий, не могут быть установлены приложением. Колонки автоматического инкремента доступны только для чтения и автоматически устанавливаются при вставке новой записи в таблицу посредством операции обновления. Значение в колонке остается постоянным на протяжении всего срока службы записи, и в таблице допускается только одна колонка автоматического инкремента. Колонки автоматического инкремента могут быть типа Long или Currency. Эскроу-колонки могут быть изменены посредством операции EscrowUpdate. Обновления эскроу – это числовые дельта-операции. Эскроу-колонки должны быть типа Long. Примеры числовых дельта-операций включают добавление 2 к значению или вычитание 1 из значения. ESE отслеживает изменение значения, а не конечное значение обновления. В нескольких сеансах могут быть ожидающие изменения, внесенные посредством EscrowUpdate, к одному и тому же значению, поскольку ESE может определить фактическое конечное значение независимо от того, какие транзакции будут зафиксированы, а какие – отменены. Это позволяет нескольким пользователям одновременно обновлять колонку, внося числовые дельта-изменения. Опционально, движок базы данных может удалять записи с нулевым значением колонки. Распространенное применение такой эскроу-колонки – счетчик ссылок: множество потоков увеличивают/уменьшают значение без блокировок, и когда счетчик достигает нуля, запись автоматически удаляется.

Индексы

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

Кластерные индексы

Один индекс может быть указан как кластеризованный, или первичный. В ESE кластеризованный индекс должен быть уникальным и называется первичным индексом. Другие индексы описываются как некластеризованные, или вторичные. Первичные индексы отличаются от вторичных тем, что запись индекса является самой записью, а не логическим указателем на запись. Вторичные индексы содержат первичные ключи в своих листьях для логической связи с записью в первичном индексе. Иными словами, таблица физически упорядочена в соответствии с первичным индексом. Поиск неиндексированных данных в порядке первичного индекса обычно намного быстрее, чем в порядке вторичного индекса. Это происходит потому, что один доступ к диску может загрузить в память несколько записей, которые будут затребованы последовательно во времени. Таким образом, один доступ к диску удовлетворяет несколько операций доступа к записям. Однако вставка записи в середину индекса, определяемую порядком первичного индекса, может быть значительно медленнее, чем добавление ее в конец индекса. При проектировании таблицы необходимо тщательно учитывать частоту обновлений и шаблоны поиска. Если для таблицы не определен первичный индекс, создается неявный первичный индекс, называемый индексом ключа базы данных (DBK). DBK – это просто уникальное возрастающее число, которое увеличивается при каждой вставке записи. Следовательно, физический порядок записей в индексе DBK соответствует порядку хронологической вставки, и новые записи всегда добавляются в конец таблицы. Если приложению требуется кластеризовать данные по не уникальному индексу, это возможно путем добавления столбца с автоинкрементом в конец определения не уникального индекса.

Индексация в многозначных столбцах

Индексы могут быть созданы для многозначных столбцов. В таких индексах может существовать несколько записей для строк, содержащих несколько значений в индексируемом столбце. Многозначные столбцы могут индексироваться совместно с однозначными столбцами. При индексировании двух и более многозначных столбцов вместе, многозначность учитывается только для первого многозначного столбца в индексе. Столбцы с более низким приоритетом рассматриваются как однозначные.

Незначительные индексы

Индексы также могут быть определены как разреженные. Разреженные индексы не содержат записи для каждой строки в таблице. Существует несколько способов определения разреженного индекса. Можно исключать строки из индекса, если весь ключ индекса равен NULL, если какой-либо сегмент ключа равен NULL или если равен NULL только первый сегмент ключа. Индексы также могут содержать условные столбцы. Эти столбцы не включаются в индекс, но могут привести к тому, что строка не будет проиндексирована, если условный столбец равен NULL или не равен NULL.

Сделки

Транзакция — это логическая единица обработки, ограниченная операциями BeginTransaction и CommitTransaction или Rollback. Все обновления, выполняемые в рамках транзакции, являются атомарными: они либо все одновременно появляются в базе данных, либо не появляются вовсе. Любые последующие обновления от других транзакций не видны текущей транзакции. Однако транзакция может обновлять только те данные, которые не изменились с момента начала транзакции; в противном случае операция немедленно завершается с ошибкой, без ожидания. Транзакции, предназначенные только для чтения, никогда не должны ждать, а транзакции обновления могут конфликтовать только друг с другом. Транзакции, завершенные операцией Rollback или сбоем системы, не оставляют следов в базе данных. В общем случае, состояние данных при Rollback восстанавливается до состояния, существовавшего непосредственно перед BeginTransaction. Транзакции могут быть вложены до 7 уровней, при этом один дополнительный уровень зарезервирован для внутреннего использования ESE. Это означает, что часть транзакции может быть отменена без необходимости отката всей транзакции; CommitTransaction вложенной транзакции лишь подтверждает успешное завершение одной фазы обработки, а внешняя транзакция все еще может завершиться неудачей. Изменения фиксируются в базе данных только при фиксации самой внешней транзакции. Это называется фиксацией на уровне 0 транзакции. Когда транзакция фиксируется на уровне 0, данные, описывающие транзакцию, синхронно записываются в журнал, чтобы гарантировать завершение транзакции даже в случае последующего сбоя системы. Синхронная запись в журнал обеспечивает надежность транзакций ESE. Однако в некоторых случаях приложениям требуется упорядочить свои обновления, но не гарантировать их немедленное выполнение. В этом случае приложения могут фиксировать изменения с помощью JET bitIndexLazyFlush. ESE поддерживает механизм управления параллелизмом, называемый многоверсионностью. При многоверсионности каждая транзакция получает согласованное представление всей базы данных таким, каким оно было на момент начала транзакции. Транзакция видит только те изменения, которые она сама внесла. Таким образом, каждая транзакция работает так, как будто она является единственной активной транзакцией в системе, за исключением случаев конфликтов записи. Поскольку транзакция может вносить изменения на основе данных, которые уже были обновлены в другой транзакции, многоверсионность сама по себе не гарантирует сериализуемые транзакции. Однако сериализуемость может быть достигнута при необходимости путем использования явных блокировок чтения записей для блокировки данных, на основе которых выполняются обновления. Блокировки чтения и записи могут быть явно запрошены с помощью операции GetLock. Кроме того, ESE поддерживает расширенную функцию управления параллелизмом, известную как escrow-блокировка. Escrow-блокировка — это высокопараллельное обновление, при котором числовое значение изменяется относительно, то есть путем добавления или вычитания другого числового значения. Escrow-обновления не конфликтуют даже с другими одновременными escrow-обновлениями для одних и тех же данных. Это возможно, поскольку поддерживаемые операции коммутативны и могут быть независимо зафиксированы или отменены. В результате они не мешают параллельным транзакциям обновления. Эта функция часто используется для поддержания агрегированных данных. ESE также расширяет семантику транзакций с операций манипулирования данными на операции определения данных. Можно добавить индекс в таблицу и одновременно выполнять транзакции, обновляющие ту же таблицу, без каких-либо конфликтов блокировок транзакций. Позже, когда эти транзакции завершатся, вновь созданный индекс станет доступен для всех транзакций и будет содержать записи об обновлениях записей, сделанных другими транзакциями, которые не могли видеть наличие индекса во время выполнения обновлений. Операции определения данных могут выполняться со всеми функциями, ожидаемыми от механизма транзакций для обновления записей. Поддерживаемые таким образом операции определения данных включают AddColumn, DeleteColumn, CreateIndex, DeleteIndex, CreateTable и DeleteTable.

Навигация курсором и буфер копирования

Курсор — это логический указатель в индексе таблицы. Курсор может быть позиционирован на записи, перед первой записью, после последней записи или даже между записями. Если курсор расположен перед или после записи, текущей записи не существует. В одном индексе таблицы может быть несколько курсоров. Многие операции с записями и столбцами основаны на положении курсора. Положение курсора может быть перемещено последовательно с помощью операций Move или напрямую, используя индексные ключи с операциями Seek. Курсоры также могут быть перемещены в дробную позицию внутри индекса. Таким образом, курсор может быть быстро перемещен в позицию ползунка. Эта операция выполняется с той же скоростью, что и операция Seek. Доступ к промежуточным данным не требуется. Каждый курсор имеет буфер копирования для создания новой записи или изменения существующей записи по столбцам. Это внутренний буфер, содержимое которого можно изменить с помощью операций SetColumns. Изменения буфера копирования не приводят к автоматическому изменению сохраненных данных. Содержимое текущей записи может быть скопировано в буфер копирования с помощью операции PrepareUpdate, а операции Update сохраняют содержимое буфера копирования как запись. Буфер копирования неявно очищается при фиксации или откате транзакции, а также при операциях навигации. RetrieveColumns может использоваться для извлечения данных столбцов либо из записи, либо из буфера копирования, если он существует.

Обработка запросов

Приложения ESE всегда выполняют запросы к своим данным. В этом разделе документа описываются функции и методы, позволяющие приложениям реализовывать логику обработки запросов в ESE.

Сортировки и временные таблицы

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

Покрывающие индексы

Получение данных столбцов непосредственно из вторичных индексов — важная оптимизация производительности. Столбцы могут быть получены непосредственно из вторичных индексов, без доступа к записям данных, с помощью флага RetrieveFromIndex в операции RetrieveColumns. Получение столбцов из вторичного индекса гораздо эффективнее, чем из записи, при навигации по индексу. Если данные столбца извлекаются из записи, требуется дополнительная навигация для поиска записи по первичному ключу. Это может привести к дополнительным обращениям к диску. Индекс, содержащий все необходимые столбцы, называется покрывающим индексом. Следует отметить, что столбцы, определенные в первичном индексе таблицы, также присутствуют во вторичных индексах и могут быть аналогичным образом получены с помощью JET bitRetrieveFromPrimaryBookmark. Ключи индекса хранятся в нормализованном виде, который во многих случаях можно денормализовать до исходного значения столбца. Денормализация не всегда обратима. Например, типы столбцов "Текст" и "Длинный текст" нельзя денормализовать. Кроме того, ключи индекса могут быть усечены, если данные столбца очень длинные. В случаях, когда столбцы нельзя получить непосредственно из вторичных индексов, запись всегда можно использовать для получения необходимых данных.

Индексный пересечение

Запросы часто включают в себя комбинацию ограничений на данные. Эффективным способом обработки ограничения является использование доступного индекса. Однако, если запрос содержит несколько ограничений, приложения часто обрабатывают их, последовательно просматривая весь диапазон индекса для наиболее ограничительного предиката, который может быть обработан одним индексом. Любой оставшийся предикат, называемый остаточным, обрабатывается путем применения его непосредственно к записи. Этот метод прост, но имеет недостаток: для применения остаточного предиката может потребоваться множество обращений к диску для загрузки записей в память. Пересечение индексов – важный механизм запросов, позволяющий использовать несколько индексов совместно для более эффективной обработки сложных ограничений. Вместо использования только одного индекса, диапазоны индексов по нескольким индексам объединяются, что позволяет значительно сократить количество записей, к которым необходимо применить остаточный предикат. ESE упрощает эту задачу, предоставляя операцию IntersectIndexes. Эта операция принимает последовательность диапазонов индексов для индексов одной и той же таблицы и возвращает временную таблицу первичных ключей, которая может быть использована для доступа к записям базовой таблицы, удовлетворяющим всем предикатам индексов.

Заранее соединенные таблицы

Объединение — распространенная операция в нормализованной схеме таблиц, при которой логически связанные данные собираются вместе для использования в приложении. Объединения могут быть ресурсоемкими, поскольку для извлечения связанных данных в память может потребоваться множество обращений к данным. В некоторых случаях это можно оптимизировать, определив единую базовую таблицу, содержащую данные для двух или более логических таблиц. Набор столбцов базовой таблицы представляет собой объединение наборов столбцов этих логических таблиц. Использование помеченных столбцов делает это возможным благодаря их эффективной обработке многозначных и разреженных данных. Поскольку связанные данные хранятся вместе в одной записи, они извлекаются одновременно, что минимизирует количество обращений к диску, необходимых для выполнения объединения. Этот процесс можно расширить на большое количество логических таблиц, поскольку ESE поддерживает до 64 993 помеченных столбцов. Поскольку индексы можно определять для многозначных столбцов, все еще возможно индексировать "внутренние" таблицы. Однако существуют определенные ограничения, и приложениям следует тщательно рассмотреть возможность предварительного объединения, прежде чем использовать эту технику.

Регистрация и восстановление при аварии

Функция ведения журнала и восстановления ESE обеспечивает гарантированную целостность и согласованность данных в случае сбоя системы. Ведение журнала – это процесс избыточной записи операций обновления базы данных в файл журнала. Структура файла журнала обладает высокой устойчивостью к сбоям системы. Восстановление – это процесс использования этого журнала для приведения баз данных в согласованное состояние после сбоя системы. Операции транзакций записываются в журнал, и журнал сбрасывается на диск при каждом подтверждении на уровне транзакции 0. Это позволяет процессу восстановления повторно применить обновления, выполненные транзакциями, подтвержденными на уровне транзакции 0, и отменить изменения, внесенные транзакциями, которые не были подтверждены на уровне транзакции 0. Такая схема восстановления часто называется схемой восстановления "перемотка вперед/откат назад". Журналы могут сохраняться до тех пор, пока данные не будут безопасно скопированы с помощью процесса резервного копирования, описанного ниже, или журналы могут использоваться повторно в циклическом режиме, как только они перестанут быть необходимыми для восстановления после сбоя системы. Циклическое ведение журнала минимизирует объем дискового пространства, необходимого для журнала, но влияет на возможность восстановления состояния данных в случае сбоя носителя информации.

Резервное копирование и восстановление

Регистрация и восстановление также играют роль в защите данных от сбоев носителей. ESE поддерживает онлайн-резервное копирование, при котором одна или несколько баз данных копируются вместе с файлами журналов таким образом, чтобы это не влияло на работу с базой данных. Базы данных могут продолжать запрашиваться и обновляться во время создания резервной копии. Резервная копия называется «неполным резервным копированием», поскольку для восстановления согласованного набора баз данных необходимо выполнить процесс восстановления в рамках восстановления резервной копии. Поддерживаются как потоковое, так и теневое копирование. Потоковое резервное копирование – это метод, при котором копии всех необходимых файлов базы данных и файлов журналов создаются в процессе резервного копирования. Копии файлов могут быть сохранены непосредственно на ленту или на любое другое устройство хранения. Для потокового резервного копирования не требуется приостановка какой-либо активности. Как база данных, так и файлы журналов проверяются контрольными суммами, чтобы гарантировать отсутствие повреждений данных в наборе данных во время процесса резервного копирования. Потоковое резервное копирование может быть также инкрементным. Инкрементное резервное копирование предполагает копирование только файлов журналов, которые могут быть восстановлены вместе с предыдущей полной резервной копией для приведения всех баз данных к последнему состоянию. Теневое копирование – это новый высокоскоростной метод резервного копирования. Теневое копирование значительно быстрее, поскольку копия создается практически мгновенно после кратковременной приостановки работы приложения. По мере внесения последующих изменений в данные виртуальная копия материализуется. В некоторых случаях аппаратная поддержка теневого копирования означает, что фактическое сохранение виртуальных копий не требуется. Теневые копии всегда являются полными. Восстановление можно использовать для применения одной резервной копии или для применения комбинации одной полной резервной копии с одной или несколькими инкрементными резервными копиями. Кроме того, любые существующие файлы журналов могут быть повторно применены для воссоздания всего набора данных вплоть до последней зафиксированной транзакции уровня 0. Восстановление резервной копии можно выполнить на любой системе, способной поддерживать исходное приложение. Это не обязательно должна быть та же машина или даже та же конфигурация машины. Расположение файлов может быть изменено в процессе восстановления.

Резервное копирование и восстановление на другом оборудовании

Когда создается база данных ESENT, размер физического сектора диска сохраняется вместе с базой данных. Предполагается, что размер физического сектора останется постоянным между сеансами, иначе будет сообщено об ошибке. При клонировании физического диска или восстановлении из образа диска на диск с другим размером физического сектора (диски Advanced Format), ESENT будет сообщать об ошибках. Это известная проблема, и Microsoft предоставляет экспресс-исправления. Для Windows Vista или Windows Server 2008 обратитесь к KB2470478. Для Windows 7 или Windows Server 2008 R2 обратитесь к KB982018.

Сравнение с JET Red

Хотя они имеют общие корни, между JET Red и ESE существуют значительные различия. JET Red – это технология для обмена файлами, а ESE разработана для встраивания в серверное приложение и не предназначена для обмена файлами. JET Red обеспечивает восстановление файлов по принципу наилучших усилий, в то время как ESE использует предварительную запись в журнал и изоляцию снимков для гарантированного восстановления после сбоев. JET Red до версии 4.0 поддерживает только блокировку на уровне страниц, тогда как ESE и JET Red версии 4.0 поддерживают блокировку на уровне записей. JET Red поддерживает широкий спектр интерфейсов запросов, включая ODBC и OLE DB. ESE не поставляется с механизмом обработки запросов, а вместо этого требует от приложений самостоятельной реализации запросов в виде кода C ISAM. Максимальный размер файла базы данных JET Red составляет 2 ГиБ, в то время как ESE поддерживает максимальный размер файла базы данных 8 ТиБ при размере страниц 4 КиБ и 16 ТиБ при размере страниц 8 КиБ.