FirebirdSQL: внутренние файлы, временные файлы и переменные окружения
_by Vasily Sidorov, Sep 2, 2022, IBSurgeon
Опытные администраторы Firebird знают, что Firebird может требовать довольно большого объема дискового пространства для хранения внутренних и временных файлов. Рекомендуемый размер дискового пространства для временных файлов в производственной системе составляет 30-40 ГБ, но для систем с высокой нагрузкой он может быть больше.
В этой статье мы опишем типы внутренних и временных файлов Firebird, а также рассмотрим, как они хранятся и управляются через параметры конфигурации и переменные окружения ОС. Статья продолжает серию статей и материалов, посвященных освоению установки и настройки Firebird.
Важное уведомление от разработчиков ядра Firebird:
Никогда, никогда, НИКОГДА не устанавливайте\изменяйте переменную окружения FIREBIRD_LOCK - если вы ОЧЕНЬ ХОРОШО не знаете, что делаете.
Явная рекомендация от команды IBSurgeon:
Не изменяйте FIREBIRD_LOCK.
Для других временных файлов - см. эту статью.
Внутренние файлы в Firebird
Внутренние файлы - это файлы, используемые Firebird для выполнения внутренних операций. Эти файлы не должны изменяться или затрагиваться пользователями или сторонним программным обеспечением. Информация ниже приведена только для справки.
Общий шаблон именования внутренних файлов
Firebird использует префикс fbNN_, где NN может быть
- номером основной ODS (структуры на диске) (ODS 12 для Firebird 3.0, ODS 13 для Firebird 4.0), т.е. файл начинается с fb13.
- NN может быть сокращенным номером версии - например, файл может начинаться с fb50.
Также может использоваться префикс fb_, который также применяется для временных файлов.
Типы внутренних файлов в Firebird
Существуют следующие основные типы внутренних файлов в Firebird:
- fb_lock_ - файлы блокировок, используемые менеджером блокировок Firebird
- fbNN_monitor_ - файлы с данными таблиц мониторинга
- fbNN_trace_ - файлы с данными для сессий трассировки
- fb_event_ - файлы с сохраненными буферами событий
- fb_user_mapping - файлы с данными сопоставления пользователей
- файлы с внутренними данными для сессий трассировки
- файлы-флаги (нулевого размера)
- fb_repl_ - файлы репликации
Рассмотрим внутренние файлы Firebird подробнее.
Файлы блокировок
Файлы блокировок имеют префикс fb_lock_. Они используются менеджером блокировок Firebird для синхронизации доступа к объектам внутри базы данных Firebird и между экземплярами Firebird.
Файлы блокировок создаются при открытии файла базы данных и удаляются при его закрытии.
По умолчанию файл базы данных закрывается, когда последнее соединение отключается. Начиная с Firebird 3.0, можно оставить файл базы данных открытым в Firebird после отключения последнего соединения с помощью опции LINGER.
Начальный размер файла блокировок задается параметром LockMemSize в firebird.conf. Рабочий размер зависит от архитектуры: SuperServer использует файлы блокировок менее интенсивно, чем Classic и SuperClassic. Типичный размер таблицы блокировок составляет около 30-50 МБ, но для серверов с тысячами соединений в Classic/SuperClassic размер файлов блокировок может вырасти до 2 ГБ. 2 ГБ - это предел реализации для файлов блокировок в стандартном Firebird.
Файлы с данными таблиц мониторинга
Начиная с версии 2.1, Firebird имеет таблицы мониторинга. Эти таблицы не хранятся внутри базы данных, данные мониторинга собираются по запросу и хранятся во внутренних файлах с шаблоном имени fbNN_monitor_.
Размер файлов с данными таблиц мониторинга зависит от количества соединений и их активности (транзакции, операторы, хранимые процедуры и т.д.). Также количество и размер файлов fb_NN_monitor_ зависят от количества запросов к таблицам мониторинга из разных соединений (это одна из причин, почему не следует использовать таблицы MON$ для задач, не связанных с мониторингом).
Файлы с данными для сессий трассировки
Шаблон имени файла fbNN_trace_ хранит ссылку на файл активной сессии трассировки. Файлы с шаблоном имени fb_trace_ содержат информацию о сессии трассировки. Это своего рода буфер для данных трассировки. Максимальный размер файла fb_trace ограничен параметром MaxUserTraceLogSize в firebird.conf. Если этот буфер будет переполнен, трассировка автоматически приостановится.
Файлы для буферов событий
Файлы с шаблоном имени fb_event_ - это буферы, в которых Firebird хранит недоставленные события для клиентских приложений.
Файлы с данными сопоставления пользователей
Файлы fb_user_mapping используются для кэширования сопоставлений пользователей в экземплярах Firebird.
Файлы-флаги
В POSIX Firebird использует файлы-флаги нулевого размера - fb_guard, fb_init, fb_port_NUMBER. Эти файлы используются при запуске Firebird.
Файлы репликации
В Firebird 4 и HQbird файлы fb_repl_ содержат внутренние данные для процессов репликации.
Расположение внутренних файлов
По умолчанию все внутренние файлы Firebird хранятся в одной папке: в Windows это C:\ProgramData\firebird, в Linux - /tmp/firebird. Обратите внимание, что папка должна иметь достаточные права доступа, чтобы экземпляр Firebird мог создавать и работать с файлами в ней!
Можно изменить расположение папки с внутренними файлами Firebird, определив переменную окружения FIREBIRD_LOCK, но мы не рекомендуем этого делать.
ОБРАТИТЕ ВНИМАНИЕ: во избежание повреждения базы данных все процессы Firebird, которые открывают один и тот же файл базы данных, должны работать с одним и тем же FIREBIRD_LOCK. Пожалуйста, не создавайте эту переменную и используйте расположения по умолчанию.
Размер внутренних файлов
Практически общий размер внутренних файлов Firebird составляет около 100-200 МБ, максимум до 2 ГБ.
Временные файлы в Firebird
Временные файлы создаются движком Firebird для хранения временных данных, которые возникают в результате операций пользователей - например, запросов с DISTINCT. Временные файлы могут быть очень большими в производственных системах с высокой нагрузкой, поэтому опытному администратору необходимо уметь распознавать типы временных файлов и, при необходимости, настраивать конфигурацию Firebird или выделять дисковое пространство для хранения временных файлов.
Расположение временных файлов в Firebird
Firebird создает временные файлы в папке, указанной переменными окружения FIREBIRD_TMP, TEMP, TMP (в этом порядке). Если таких переменных нет, временные файлы будут создаваться в C:\Temp в Windows или /tmp в Linux.
На практике в Windows можно увидеть временные файлы Firebird в C:\Windows\Temp (соответствует переменной окружения TEMP), в Linux - в /tmp.
Типы временных файлов в Firebird
Существуют следующие временные файлы (все используют префикс fb_):
- fb_table_ - табличные объекты, включая, но не ограничиваясь, временными таблицами
- fb_blob_ - BLOB-объекты и автономные транзакции
- fb_undo_ - данные отката
- fb_recbuf_ - используется для хранения промежуточных данных в активных запросах, виртуальных таблицах и т.д.
- fb_merge_ - данные для хэш-соединений
- fb_sort_ - сортировки (для запросов с DISTINCT/ORDER BY/GROUP BY и для создания/пересоздания индексов)
- fb_tpc_ - данные (с v4) - список всех известных транзакций с соответствующими номерами фиксации
- fb_snap_ - данные (с v4) - список всех активных снимков базы данных
Как изменить расположение временных файлов?
Для версий Firebird до 4 можно указать конкретную папку для хранения временных файлов типов 4-8 с помощью параметра конфигурации Firebird TempDirectories.
Для Firebird 4 и выше новый параметр конфигурации TempTableDirectory позволяет указать папку для хранения временных таблиц типов 1-3. Его можно задать в firebird.conf и в databases.conf.
Переменные окружения для Firebird
Firebird может использовать следующие переменные окружения ОС (если они определены):
- FIREBIRD - папка с файлами конфигурации Firebird
- FIREBIRD_LOCK - папка с внутренними файлами
- FIREBIRD_MSG - папка с файлом сообщений (firebird.msg)
- FIREBIRD_TMP - папка для временных файлов
Практически, FIREBIRD_TMP - единственная переменная, которую имеет смысл определять, если у вас есть веская причина хранить временные файлы в конкретном нестандартном месте.
Обратите внимание, что если путь в FIREBIRD_TMP будет недействительным (не существует или недостаточно прав), это приведет к критическим ошибкам, которые помешают работе Firebird.
Важное уведомление от основных разработчиков Firebird:
Никогда, никогда, НИКОГДА не устанавливайте\не изменяйте переменную окружения FIREBIRD_LOCK - если вы ОЧЕНЬ ХОРОШО не знаете, что делаете.
Явная рекомендация от команды IBSurgeon:
Никогда не изменяйте FIREBIRD_LOCK. Эта информация приведена только для справки.
О других временных файлах - см. здесь.
Вместо резюме: ответ на очень частый вопрос
Многие администраторы БД спрашивают - следует ли использовать RAM-диск или tmpfs для хранения внутренних и/или временных файлов Firebird?
Краткий ответ: Нет, лучше настройте конфигурацию Firebird. Если у вас много памяти, вы можете увеличить значение DefaultDBCachePages (только для SuperServer) и увеличить TempCacheLimit (в версиях 3+ Firebird позволяет использовать TempCacheLimit более 2 ГБ).
Если вы не уверены, какие значения следует использовать, воспользуйтесь Калькулятором конфигурации Firebird, который создает оптимальные и безопасные конфигурации для конкретных параметров оборудования/ВМ.
Более подробный ответ: Firebird спроектирован так, чтобы хранить большую часть временных и внутренних файлов в памяти, но, поскольку на практике возникают ситуации, когда временные объекты становятся очень большими, он также имеет механизм для их хранения на диске. Firebird эффективно использует механизмы ОС (mmap, кэш файловой системы, временные файлы и т. д.) для кэширования временных и внутренних файлов в памяти, когда это возможно и целесообразно. Настройка Firebird должна выполняться в первую очередь через конфигурацию Firebird, а затем через ОС (указание расположения временных файлов, различные параметры настройки кэша файлов и т. д.).
Связанные ссылки
Видео:
- Использование памяти в Firebird. Часть 1: Понимание использования памяти
- Использование памяти в Firebird: Часть 2. Настройка использования памяти
Презентация о настройке использования памяти
Пожалуйста, не стесняйтесь задавать любые вопросы или отправлять отзывы на [email protected]