Резервное копирование баз данных BDE

Архитектура механизма резервирования через BDE API
В основе штатного резервирования BDE-ресурсов лежит работа с алиасом через низкоуровневые вызовы DbiBackup и DbiRestore. Эти функции оперируют не непосредственно файлами таблиц (Paradox, dBase или DB2), а логическими сессиями, что позволяет выполнять копирование без прямого доступа к файловой системе. Ключевое отличие от альтернативных методов, таких как пакетное копирование через TTable или прямые file I/O операции — сохранение целостности блокировок и транзакций. При вызове DbiBackup BDE автоматически устанавливает эксклюзивную блокировку на все таблицы алиаса, предотвращая запись со стороны сторонних соединений. Без использования штатного API разработчику пришлось бы самостоятельно реализовывать протокол типа «отложенной записи» (lazy write) через обработчики OnBackupProgress, что кратно увеличивает риск повреждения индексов.
Спецификация BCD-файлов и параметры производительности
Результатом работы DbiBackup (объявлена в модуле BDE) является бинарный архив с расширением .BCD (BDE Compressed Data). Формат внутреннего хранения — собственная разработка Borland, основанная на блочном сжатии LZ77 с фиксированным окном 4096 байт. Качество сжатия для таблиц Paradox (.DB) достигает 40–60% исходного объема, однако для BLOB-полей памяти (MEMO, .MB) этот алгоритм неэффективен — сжатие составляет не более 5%. Производительность копирования напрямую зависит от параметра BDE_SESSION.DATABASEDRIVER и размера буфера ввода-вывода. В отличие от альтернативных утилит вроде TBackupService (сторонние решения, реализованные через TDatabase.Session.GetTableNames и последовательное чтение RecordSet), штатный BDE-метод использует системный кеш драйвера Paradox: буфер записи фиксирован и составляет 32 КБ на один файл данных. Увеличение буфера через DbiSetProp(hDb, dbBACKUP_BUFFER_SIZE, 65536) возможно только для драйвера SQL-типов, для локальных Paradox и dBASE спецификация требует шага в 1024 байта.
Качество восстановления и проверка целостности
Функция DbiRestore выполняет восстановление с обязательной валидацией заголовков блоков. Каждый блок BCD-файла содержит CRC32-сумму (полином 0x04C11DB7 — стандарт IEEE 802.3). Если хотя бы один блок поврежден, функция возвращает код ошибки DBIERR_CORRUPT, а не частично распакованные данные. Это кардинальное отличие от копирования «как есть» через ShellAPI (CopyFile) — файл Paradox с поврежденным заголовком при прямом копировании не вызовет ошибки, но при открытии через BDE приведет к access violation. Техническое ограничение: DbiBackup не поддерживает потоковое архивирование — весь архив формируется в оперативной памяти, и при превышении лимита в 2 ГБ (ограничение файловой системы FAT32 на уровне BDE-драйвера) корректная запись прерывается. Для баз с общим объемом более 1,8 ГБ разработчикам рекомендуется сегментировать резервирование по алиасам.
Программная настройка через TBackupService и ручная реализация
Компонент TBackupService (поставлялся в BDE Administrator до версии 5.2) предоставляет обертки над DbiBackup с поддержкой событий OnBackupTableA и OnBackupTableZ. Для инициализации сессии резервирования достаточно вызвать:
with TBackupService.Create(nil) do
begin
SessionName := 'BackupSession';
DatabaseName := 'MyAlias';
BackupFile := 'D:\tmp\backup.bcd';
BackupType := btAll;
Execute(True);
Free;
end;При этом TBackupService автоматически переключает драйвер BDE в режим монопольного доступа (свойство Exclusive := True для всех TTable внутри). Альтернативный подход — самостоятельный вызов DbiBackup через DBIProcs. Этот метод требует ручного возврата буфера ошибок (TDBIErr) и управления контекстом транзакции, но дает контроль над размером буфера через DbiSetProp. Качество такого подхода выше за счет возможности тонкой настройки приоритета потока резервирования (SetPriorityClass в сочетании с DbiBackup не отдает блокировку сессии, если поток переведен в IDLE). Ни один сторонний инструмент не предоставляет такого уровня интеграции с менеджером транзакций BDE.
Ограничения и совместимость со стандартами
Спецификация BCD-файлов не имеет альтернативных реализаций — ни FireDAC, ни ODBC-мосты не умеют читать/писать этот формат. Это накладывает жёсткое требование на среду восстановления: клиентское ПО должно работать под управлением BDE версии не ниже 5.01 (сборка 2013, последняя с LZ77-блоком). Качество инсталляции оценивается по метрике dbiBDEVerCheck(verMajor, verMinor): если версия ядра < 5.0 — восстановление гарантирует только частичный дамп без BLOB. Для пользователей Delphi 2007+ рекомендуется проверять наличие библиотеки idapi32.dll от 2004 года выпуска. В противном случае резервирование должно быть заменено на TFileStream-копирование таблиц с предварительной проверкой блокировок через DbiLockTable и собственную реализацию байт-контроля заголовков Paradox (заголовок .DB содержит сигнатуру 0x00 0x00 0x10 0x06 для версии таблицы 7).
Добавлено: 27.04.2026
