Функция JetReadFile
Применимо к: Windows | Windows Server
Функция JetReadFile
Функция JetReadFile извлекает содержимое файла, открытого с помощью JetOpenFile.
JET_ERR JET_API JetReadFile(
__in JET_HANDLE hfFile,
__out void* pv,
__in unsigned long cb,
__out_opt unsigned long* pcbActual
);
Параметры
hfFile
Дескриптор считываемого файла.
Pv
Выходной буфер, который будет получать данные файла.
Cb
Максимальный размер выходного буфера в байтах.
pcbActual
Получает фактический объем полученных данных о файлах.
Возвращаемое значение
Эта функция возвращает тип данных JET_ERR с одним из следующих кодов возврата. Дополнительные сведения о возможных ошибках ESE см. в разделах Ошибки подсистемы расширяемого хранилища и Параметры обработки ошибок.
Код возврата |
Описание |
---|---|
JET_errSuccess |
Операция выполнена успешно. |
JET_errBackupAbortByServer |
Операция завершилась сбоем, так как текущая внешняя резервная копия была прервана вызовом JetStopService. Эта ошибка будет возвращена только в Windows XP и более поздних выпусках. |
JET_errClientRequestToStopJetService |
Невозможно выполнить операцию, так как все действия экземпляра, связанного с сеансом, прекратились в результате вызова JetStopService. |
JET_errInstanceUnavailable |
Невозможно выполнить операцию, так как экземпляр, связанный с сеансом, столкнулся с неустранимой ошибкой, требующей отмены доступа ко всем данным для защиты целостности этих данных. Эта ошибка будет возвращена только в Windows XP и более поздних выпусках. |
JET_errInvalidParameter |
Один из предоставленных параметров содержал непредвиденное значение или значение, которое не имело смысла в сочетании со значением другого параметра. Это может произойти для JetReadFile , если:
|
JET_errNoBackup |
Операция завершилась сбоем, так как внешнее резервное копирование не выполняется. |
JET_errNotInitialized |
Невозможно выполнить операцию, так как экземпляр, связанный с сеансом, еще не инициализирован. |
JET_errReadVerifyFailure |
Операция завершилась сбоем, так как при чтении страницы базы данных из файла базы данных или файла исправлений базы данных обнаружено повреждение невосстановимых данных. |
JET_errLogReadVerifyFailure |
Операция завершилась сбоем, так как при чтении файла журнала транзакций было обнаружено повреждение невосстановимых данных. Эта ошибка будет возвращена только в Windows XP и более поздних выпусках. |
JET_errRestoreInProgress |
Невозможно выполнить операцию, так как операция восстановления выполняется в экземпляре, связанном с сеансом. |
JET_errRunningInMultiInstanceMode |
Операция завершилась сбоем, так как была предпринята попытка использовать подсистему в устаревшем режиме (режим совместимости с Windows 2000), где поддерживается только один экземпляр, если на самом деле уже существует несколько экземпляров. |
JET_errTermInProgress |
Невозможно выполнить операцию, так как экземпляр, связанный с сеансом, завершает работу. |
При успешном выполнении следующий фрагмент данных из файла будет считываться в выходной буфер. Также будет возвращено фактическое количество извлеченных байтов. Смещение файла, при котором будет выполняться следующее чтение, будет расширено на этот объем.
При сбое состояние выходного буфера не определено. Сбой приведет к отмене всего процесса резервного копирования экземпляра. В Windows XP и более поздних выпусках резервное копирование не будет отменено, если произошла ошибка при чтении файла базы данных. Однако резервная копия этого файла базы данных по-прежнему будет отменена, а соответствующий дескриптор будет автоматически закрыт.
Комментарии
Любой вызов JetReadFile с помощью дескриптора, который уже вернул все данные в базовом файле (например, предыдущий вызов вернул меньше байтов, чем размер выходного буфера), всегда будет успешным, но возвращает ноль байт данных.
Для максимальной производительности резервного копирования следует использовать большой выходной буфер. Для поиска правильного компромисса между потреблением ресурсов и пропускной способностью для конкретной ситуации может потребоваться некоторое экспериментирование. Размер выходного буфера в любом случае не должен превышать 64 КБ.
Несколько одновременных вызовов JetReadFile с использованием одного дескриптора файла не поддерживаются. Это означает, что невозможно ставить в очередь несколько буферов для чтения одновременно с тем же файлом, чтобы обеспечить высокую последовательную пропускную способность. Вместо этого следует использовать один большой буфер.
Если экземпляр настроен таким образом, что включена очистка страниц базы данных (см. JET_paramZeroDatabaseDuringBackup в системных параметрах), удаленные данные будут удалены из базы данных в качестве побочного эффекта вызова JetReadFile к файлу базы данных.
Очень важно понимать, как взаимодействуют резервные копии и повреждение данных. Если ядро СУБД обнаруживает повреждение данных во время резервного копирования, это приведет к сбою резервного копирования затронутой базы данных или всего экземпляра. Это сознательное проектное решение, предназначенное для защиты от потери данных. Если ядро СУБД позволило успешно выполнить резервное копирование при повреждении данных, то в результате этого может быть удалена более старая, некорруцированная резервная копия. Это было бы неудачно, так как можно было бы исправить повреждение данных в динамическом экземпляре, восстановив эту резервную копию и повторно создав все файлы журнала транзакций в этой базе данных. Этот сценарий нулевой потери данных предполагает, что циклическое ведение журнала не включено (см . JET_paramCircularLog в системных параметрах).
Также важно понимать, что при наличии повреждения данных потоковая архивация будет наиболее вероятным местом, где она будет обнаружена. Это связано с тем, что потоковая архивация является единственным процессом, который регулярно сканирует каждую страницу файла базы данных. Кроме того, вероятно, что потоковое резервное копирование будет первым процессом для обнаружения ранних признаков сбоя оборудования, что проявляется периодическими ошибками повреждения данных. Это связано с объемом данных, извлекаемых резервным копированием, а также скоростью, с которой они извлекаются.
Повреждение данных обнаруживается ядром СУБД с помощью контрольных сумм блоков. Эти контрольные суммы устанавливаются непосредственно перед записью страницы базы данных и проверяются на чтение страницы базы данных. Эта схема позволяет ядру СУБД определить, что данные были повреждены в какой-то момент, но не позволяет ядру СУБД определить источник этого повреждения. Исторически сложилось так, что основной причиной такого повреждения были источники, отличные от самого ядра СУБД.
Требования
Требование | Значение |
---|---|
Клиент |
Требуется Windows Vista, Windows XP или Windows 2000 Профессиональная. |
Сервер |
Требуется Windows Server 2008, Windows Server 2003 или Windows 2000 Server. |
Верхняя часть |
Объявлено в Esent.h. |
Библиотека |
Используйте ESENT.lib. |
DLL |
Требуется ESENT.dll. |
См. также:
JET_ERR
JET_HANDLE
JET_INSTANCE
JetOpenFile
JetStopService
Системные параметры