FirebirdSQL: arquivos internos, arquivos temporários e variáveis de ambiente
by Vasily Sidorov, 2 de setembro de 2022, IBSurgeon
DBAs experientes em Firebird sabem que o Firebird pode exigir uma quantidade considerável de espaço em disco para armazenar arquivos internos e temporários. O tamanho recomendado de espaço em disco para arquivos temporários em sistemas de produção é de 30-40 GB, mas para sistemas de alta carga pode ser maior.
Neste artigo, descreveremos os tipos de arquivos internos e temporários do Firebird e também consideraremos como eles são armazenados e gerenciados por meio de parâmetros de configuração e variáveis de ambiente do SO. O artigo dá continuidade à série de artigos e materiais dedicados ao domínio da instalação e configuração do Firebird.
Aviso importante dos desenvolvedores principais do Firebird:
Nunca, nunca, NUNCA defina/altere a variável de ambiente FIREBIRD_LOCK - a menos que você saiba MUITO BEM o que está fazendo.
Sugestão explícita da equipe IBSurgeon:
Não altere o FIREBIRD_LOCK.
Para outros arquivos temporários - veja isto.
Arquivos internos no Firebird
Arquivos internos são arquivos usados pelo Firebird para realizar suas operações internas. Esses arquivos não devem ser alterados ou tocados por usuários ou softwares de terceiros. As informações abaixo são apenas para referência.
O padrão comum de nomenclatura de arquivos internos
O Firebird usa internamente o prefixo fbNN_, onde NN pode ser
- o número principal do ODS (Estrutura em Disco) (ODS 12 para Firebird 3.0, ODS 13 para Firebird 4.0), ou seja, o arquivo começa com fb13.
- NN pode ser o número de versão abreviado - por exemplo, o arquivo pode começar com fb50.
Além disso, pode haver o prefixo fb_, que também é usado para arquivos temporários.
Tipos de arquivos internos no Firebird
Existem os seguintes tipos principais de arquivos internos no Firebird:
- fb_lock_ - arquivos de bloqueio usados pelo gerenciador de bloqueios do Firebird
- fbNN_monitor_ - arquivos com dados das tabelas de monitoramento
- fbNN_trace_ - arquivo com dados para sessões de rastreamento
- fb_event_ - arquivo com buffers armazenados de eventos
- fb_user_mapping - arquivos com dados de mapeamento de usuários
- arquivos com dados internos para sessões de rastreamento
- arquivos de sinalização (tamanho zero)
- fb_repl_ - arquivos de replicação
Vamos considerar os arquivos internos do Firebird em detalhes.
Arquivos de bloqueio
Os arquivos de bloqueio têm o prefixo fb_lock_. Eles são usados pelo gerenciador de bloqueios do Firebird para sincronizar o acesso aos objetos dentro do banco de dados Firebird e entre instâncias do Firebird.
Os arquivos de bloqueio são criados na abertura de um arquivo de banco de dados e excluídos quando fechados.
Por padrão, o arquivo de banco de dados é fechado quando a última conexão é desconectada. A partir do Firebird 3.0, é possível manter um arquivo de banco de dados aberto no Firebird após a desconexão da última conexão usando a opção LINGER.
O tamanho inicial do arquivo de bloqueio é definido pelo parâmetro LockMemSize no firebird.conf. O tamanho de trabalho varia conforme a arquitetura: o SuperServer usa arquivos de bloqueio de forma menos intensiva que o Classic e o SuperClassic. O tamanho típico da tabela de bloqueio é de cerca de 30-50 MB, mas para servidores com milhares de conexões no Classic/SuperClassic, o tamanho dos arquivos de bloqueio pode crescer até 2 GB. 2 GB é o limite de implementação para arquivos de bloqueio no Firebird padrão.
Arquivos com dados das tabelas de monitoramento
A partir da versão 2.1, o Firebird possui tabelas de monitoramento. Essas tabelas não são armazenadas dentro do banco de dados; os dados de monitoramento são coletados sob demanda e mantidos em arquivos internos com o padrão de nome fbNN_monitor_.
O tamanho dos arquivos com dados das tabelas de monitoramento depende do número de conexões e de sua atividade (transações, statements, procedimentos armazenados, etc.). Além disso, a quantidade e o tamanho dos arquivos fb_NN_monitor_ dependem do número de solicitações às tabelas de monitoramento de diferentes conexões (esta é uma das razões pelas quais você não deve usar tabelas MON$ para tarefas que não sejam de monitoramento).
Arquivos com dados para sessões de rastreamento
O padrão de nome de arquivo fbNN_trace_ mantém o link para o arquivo de sessão de rastreamento ativo. Arquivos com o padrão de nome fb_trace_ contêm informações sobre a sessão de rastreamento. É uma espécie de buffer para dados de rastreamento. O tamanho máximo do arquivo fb_trace é limitado pelo parâmetro MaxUserTraceLogSize no firebird.conf. Se esse buffer for preenchido, o rastreamento será suspenso automaticamente.
Arquivo para buffers de eventos
Arquivos com o padrão de nome fb_event_ são buffers onde o Firebird armazena eventos não entregues aos aplicativos clientes.
Arquivos com dados de mapeamento de usuários
Os arquivos fb_user_mapping são usados para armazenar em cache os mapeamentos de usuários nas instâncias do Firebird.
Arquivos de sinalização
No POSIX, o Firebird usa arquivos de sinalização com tamanho zero - fb_guard, fb_init, fb_port_NUMBER. Esses arquivos são usados na inicialização do Firebird.
Arquivos de replicação
No Firebird 4 e no HQbird, os arquivos fb_repl_ contêm os dados internos para os processos de replicação.
Localização dos arquivos internos
Por padrão, todos os arquivos internos do Firebird são armazenados na mesma pasta: no Windows, é C:\ProgramData\firebird; no Linux, /tmp/firebird. Observe que a pasta deve ter permissões suficientes para que a instância do Firebird possa criar e trabalhar com arquivos nela!
É possível alterar a localização da pasta com arquivos internos do Firebird definindo a variável de ambiente FIREBIRD_LOCK, mas não recomendamos isso.
OBSERVAÇÃO IMPORTANTE: para evitar corrupção do banco de dados, todos os processos do Firebird que abrem o mesmo arquivo de banco de dados devem trabalhar com o mesmo FIREBIRD_LOCK. Por favor, não crie esta variável e use os locais padrão.
Tamanho dos arquivos internos
Na prática, o tamanho total dos arquivos internos do Firebird é de cerca de 100-200 MB, até 2 GB como máximo conhecido.
Arquivos temporários no Firebird
Os arquivos temporários são criados pelo mecanismo do Firebird para armazenar dados temporários que surgem como resultado das operações dos usuários - consultas com DISTINCT, por exemplo. Os arquivos temporários podem ser muito grandes em sistemas de produção de alta carga, por isso é necessário que um DBA experiente seja capaz de reconhecer os tipos de arquivos temporários e, se necessário, ajustar a configuração do Firebird ou alocar espaço em disco para armazenar arquivos temporários.
Localização dos arquivos temporários no Firebird
O Firebird cria arquivos temporários na pasta especificada pelas variáveis de ambiente FIREBIRD_TMP, TEMP, TMP (nesta ordem). Se não houver tais variáveis, os arquivos temporários serão criados em C:\Temp no Windows ou /tmp no Linux.
Na prática, no Windows podemos ver os arquivos temporários do Firebird em C:\Windows\Temp (corresponde à variável de ambiente TEMP), no Linux em /tmp.
Tipos de arquivos temporários no Firebird
Existem os seguintes arquivos temporários (todos usam o prefixo fb_):
- fb_table_ - objetos de tabela, incluindo, mas não se limitando a, tabelas temporárias
- fb_blob_ - blobs e transações autônomas
- fb_undo_ - dados de undo
- fb_recbuf_ - usado para manter dados intermediários em consultas ativas, tabelas virtuais, etc.
- fb_merge_ - dados para hash joins
- fb_sort_ - ordenações (para consultas com DISTINCT/ORDER BY/GROUP BY e para criar/recriar índices)
- fb_tpc_ - dados do fb_tpc_ - a partir da v4, lista de todas as transações conhecidas com números de commit associados
- fb_snap_ - dados para - a partir da v4, lista de todos os snapshots de banco de dados ativos
Como alterar a localização dos arquivos temporários?
Para versões do Firebird anteriores à 4, é possível definir uma pasta específica para armazenar arquivos temporários dos tipos 4-8 com o parâmetro de configuração TempDirectories do Firebird.
Para o Firebird 4 e superiores, o novo parâmetro de configuração TempTableDirectory permite especificar a pasta para armazenar tabelas temporárias dos tipos 1-3. Ele pode ser definido no firebird.conf e no databases.conf.
Variáveis de ambiente para o Firebird
O Firebird pode usar as seguintes variáveis de ambiente do SO (se estiverem definidas):
- FIREBIRD - pasta com os arquivos de configuração do Firebird
- FIREBIRD_LOCK - pasta com arquivos internos
- FIREBIRD_MSG - pasta com o arquivo de mensagens (firebird.msg)
- FIREBIRD_TMP - pasta para arquivos temporários
Na prática, FIREBIRD_TMP é a única variável que faz sentido definir se você tiver um motivo forte para armazenar arquivos temporários em um local específico fora do padrão.
Observe que se o caminho em FIREBIRD_TMP for inválido (não existir ou não tiver permissões suficientes), isso levará a erros críticos que impedem o funcionamento do Firebird.
Aviso importante dos desenvolvedores principais do Firebird:
Nunca, nunca, NUNCA defina/altere a variável de ambiente FIREBIRD_LOCK - a menos que você saiba MUITO BEM o que está fazendo.
Sugestão explícita da equipe IBSurgeon:
Nunca altere o FIREBIRD_LOCK. Esta informação é apenas para referência.
Para outros arquivos temporários - veja isto.
Em vez de Resumo: resposta para a pergunta muito frequente
Muitos DBAs perguntam - devemos usar RAM-drive ou tmpfs para armazenar arquivos internos e/ou temporários do Firebird?
A resposta curta é: Não, é melhor ajustar a configuração do Firebird. Se você tiver muita memória, pode aumentar o valor de DefaultDBCachePages (apenas para SuperServer) e aumentar TempCacheLimit (nas versões 3+, o Firebird permite usar TempCacheLimit acima de 2 GB).
Se você não tiver certeza de quais valores devem ser usados, use a Calculadora de Configuração do Firebird, que cria configurações ideais e seguras para parâmetros específicos de hardware/VM.
A resposta mais longa: o Firebird é projetado para manter a maior parte dos arquivos temporários e internos na memória, mas, como na prática há situações em que objetos temporários se tornam muito grandes, ele também possui o mecanismo para armazená-los no disco. O Firebird usa efetivamente os mecanismos do SO (mmap, cache do sistema de arquivos, arquivos temporários, etc.) para armazenar em cache arquivos temporários e internos na memória quando possível e razoável. O ajuste do Firebird deve ser feito primeiro através da configuração do Firebird e depois do SO (definir localização dos arquivos temporários, várias opções para ajuste de cache de arquivos, etc.).
Links relacionados
Vídeos:
- Uso de memória no Firebird. Parte 1: Entendendo o uso de memória
- Uso de memória no Firebird: Parte 2. Ajustando o uso de memória
Apresentação sobre ajuste de uso de memória
Sinta-se à vontade para fazer perguntas ou enviar feedback para [email protected]