При использовании СУБД Firebird 2.5 на сервере с ОС Windows Server 2012 R2 мы можем столкнуться с проблемой переполнения системного диска временными файлами, которые могут появляться в результате работы пользователей с базами данных Firebird. Анализ ситуации показывает, что появление временных файлов не связано с нехваткой ресурсов сервера, а может являться его типичным поведением. Чтобы избежать повторения возникновения подобной проблемы, мы можем изменить месторасположение каталога временных файлов Firebird, но для этого нам потребуется "объяснить" службе экземпляра Firebird то, где он впредь должен размещать такие временные файлы.
Проблема конфигурации экземпляра Firebird "по умолчанию"
Простым и понятным решением в описанной ситуации представляется настройка параметра TempDirectories в основном конфигурационном файле экземпляра Firebird - firebird.conf. Предполагается, что мы можем выделить под файлы Firebird отдельный дисковый том и/или подкаталог на диске, отличном от системного и разместить в этом месте временные файлы Firebird c помощью параметра TempDirectories. Приведу фрагмент конфигурации, предполагающий подобную настройку.
...
# ----------------------------
# Temporary directories
#
# Provide ';'-separated trees list, where temporary files are stored.
# Relative paths are treated relative to RootDirectory entry
# (see above). Default value is determined using FIREBIRD_TMP,
# TEMP or TMP environment options. Once the first specified
# directory has no available space, the engine will switch to the
# next one, and so on.
#
# E.g.:
# TempDirectories = c:\temp
# or
# TempDirectories = c:\temp;d:\temp
#
# Type: string (special format)
#
#TempDirectories =
TempDirectories = D:\FBInst1\Temp
...
Однако практика показывает, что служба экземпляра Firebird 2.5 на Windows Server упорно игнорирует этот параметр. То есть несмотря на настройку этого параметра, временные файлы, создаваемые Firebird, по-прежнему попадают в каталог, определяемый через переменную %TEMP%. По умолчанию такой путь будет определяться, как подкаталог \AppData\Local\Temp в профиле учётной записи пользователя, от имени которой выполняется служба экземпляра Firebird. Например, если служба Firebird работает от имени управляемой сервисной учётной записи gMSA с именем KOM\s-S11$, то временные файлы для такой службы будут попадать в каталог C:\Users\s-S11$\AppData\Local\Temp.
Информацию о проблеме с обработкой параметра TempDirectories в конфигурации Firebird 2 можно найти и относительно платформы Linux: TempDirectories parameter in firebird.conf ignored by global temporary tables
Проблема усугубляется ещё и тем, что по какой-то, пока невыясненной, причине Firebird не всегда удаляет за собой такие временные файлы и со временем это может опять-таки привести к переполнению системного диска сервера.
Ситуация с временными файлами может оказаться острей в случае, если на сервере выполняется несколько экземпляров Firebird и уже тем более, если сервер используется ещё под какие-либо задачи, кроме Firebird.
Альтернативным работающим решением, которое удалось проверить и реализовать на практике, является использование специальной переменной окружения %FIREBIRD_TMP%, в которой можно указать каталог временных файлов Firebird. Задавать эту переменную окружения лучше не в контексте всей системы, а в контексте той учётной записи, от имени которой работает служба экземпляра Firebird. Это может иметь важное значение на сервере, где запущено несколько экземпляров Firebird и для каждого необходимо использовать отдельный каталог временных файлов.
И тут опять может возникнуть резонный вопрос о том, как задать переменную окружения для конкретной учётной записи отдельно взятого экземпляра Firebird, если эта учётная запись gMSA. Рассмотрим такой пример далее.
Настраиваем переменную окружения для учётной записи gMSA
Откроем командную строку с правами Администратора и с помощью утилиты PsExec ы интерактивном режиме запустим редактор реестра regedit от имени учётной записи, в контексте которой выполняется служба экземпляра Firebird. В нашем примере служба экземпляра выполняется от имени управляемой учётной записи gMSA с именем KOM\s-S11$, поэтому вызов редактора реестра будет выглядеть следующим образом (в качестве пароля для учётной записи gMSA указываем знак тильды "~":):
PsExec64.exe -i -u KOM\s-S11$ -p ~ regedit
В ключ реестра HKEY_CURRENT_USER\Environment добавим нужную нам переменную окружения FIREBIRD_TMP и зададим ей интересующее нас значение, указывающее на каталог желаемого размещения временных файлов экземпляра Firebird.
Завершим работу с regedit, после чего автоматически закроется PsExec-сессия пользователя gMSA.
После этого, для проверки того, что у нас получилось, снова с помощью PsExec запустим от имени учётной записи gMSA интерпретатор командной строки cmd.exe
PsExec64.exe -i -u KOM\s-S11$ -p ~ cmd.exe
В командной строке выполним команду set, чтобы увидеть все переменные окружения, или с помощью утилиты findstr отфильтруем только интересующие нас переменные окружения:
set | findstr /ic:"username"
set | findstr /ic:"firebird"
Как видим, нужная нам переменная успешно загружается из пользовательского куста реестра при создании сеанса сервисной учётной записи gMSA.
По окончании проверки закрываем сессию интерпретатора cmd.exe, запущенную от имени gMSA, выполнив в консоли команду exit.
Для вступления изменений в силу перезапустим службу экземпляра Firebird.
С этого момента временные файлы, создаваемые экземпляром Firebird, должны будут попадать именно туда, куда мы запланировали.
Добавить комментарий