Autor: Carlos H. Cantu - Extraído do meu livro Firebird 2 e revisado em 15/06/2022
Colocar um banco de dados em modo de shutdown significa que, por alguma razão, você deseja restringir as conexões a ele. Um dos usos mais comum para essa situação é impedir que usuários se conectem ao banco de dados, durante uma operação de atualização de estrutura (metadata).
Até o Firebird 1.5, a tarefa de impedir que mais de um (ou nenhum) usuário se conectasse ao banco de dados era praticamente impossível, pelo fato de que o modo de shutdown do Firebird 1.x não impedia as conexões do SYSDBA ou do dono (owner) do banco.
O Firebird 2.0 introduziu novos modos de shutdown, sendo possível colocar o banco em um estado onde nem mesmo o SYSDBA possa conectá-lo.
Usando o gfix para efetuar um shutdown
O gfix é o utilitário responsável pela mudança de status do banco de dados, nos diferentes modos de shutdown disponíveis. Vejamos a sintaxe envolvida nos procedimentos de shutdown:
gfix <comando> [<estado>] [<opções>]
<comando> ::= {-shut | -online}
<estado> ::= {normal | multi | single | full}
<opções> ::= {-force <timeout> | -tran | -attach}
Comandos:
-shut: Coloca o banco de dados em modo de shutdown
-online: Ativa um banco que está em modo shutdown
Estados:
- normal: O banco está no seu estado normal (ativo).
- multi: O banco está em modo de shutdown, mas dependendo do caso, poderá haver conexões do SYSDBA ou do dono do banco de dados (ver observações). Esse é o modo padrão nas versões 1.x do Firebird.
- single: O banco está em modo de shutdown, onde apenas uma conexão do SYSDBA é aceita.
- full: O banco está totalmente inoperante. Nenhuma conexão será aceita, nem mesmo a do SYSDBA.
Opções:
- -force <timeout>: Faz com que o servidor espere o número de segundos determinados por timeout, antes de derrubar as conexões ativas e colocar o banco em modo de shutdown. Use com cuidado, pois os usuários ativos no momento em que o banco entrar em estado de shutdown poderão perder o trabalho que estavam fazendo.
- -attach x: Impede que novas conexões sejam feitas ao banco, mas não derruba as conexões já existentes. Ao se passar o número de segundos determinados por “x”, se ainda houver conexões ativas no banco, o shutdown será cancelado, caso contrário, o banco de dados será colocado em modo de shutdown.
- -tran x: Impede que novas transações sejam iniciadas no banco, mas não derruba as conexões existentes. Ao se passar o número de segundos determinados por “x”, se ainda houver transações ativas no banco, o shutdown será cancelado, caso contrário, o banco de dados será colocado em modo de shutdown.
Modo multi – padrão do Firebird 1.x
O comportamento apresentado no Firebird 1.x quando um banco de dados era colocado em modo de shutdown está representado abaixo:
- Se o SYSBDA ou o dono do banco de dados estiver logado no momento em que o banco entrar em modo de shutdown, o servidor não impedirá que o outro estabeleça uma conexão com o banco, mesmo ele estando em modo de shutdown.
- Se o SYSDBA ou o dono do banco de dados se logar no BD após ele ter entrado em modo de shutdown, o servidor não permitirá que o outro usuário faça uma conexão no banco, mas não impedirá que o mesmo usuário faça uma nova conexão.
Esse comportamento padrão do FB 1.x foi mantido no Firebird 2.0, através do modo “multi”.
O modo full é especialmente interessante quando se deseja bloquear as conexões no BD para realizar uma cópia física do arquivo do banco de dados, ou mesmo movê-lo para outro diretório, etc. Vale lembrar que através do nbackup é possível fazer uma cópia física do arquivo do BD – para efeito de backup – sem ter que derrubar as conexões ativas.
Alterando o modo de shutdown
Os modos de shutdown podem ser alternados entre si:
Escala:
[mais online.......menos online]
normal ? multi ? single ? full
No entanto, você deve atentar para como alternar entre esses modos usando o –shut e o –online. Se um banco está em modo full de shutdown, para passá-lo ao modo single, não usamos –shut single e sim –online single. Imagine como se houvesse uma “escala” onde o modo normal seria o modo “mais online” que um BD pode ficar, e que o full seja o modo “mais offline”. Para passar de um modo “mais online” para um “menos online”, usamos o –shut, e para o contrário, usamos o –online.
Pensando assim, os exemplos abaixo seriam inválidos:
Tarefa |
Forma incorreta |
Forma correta |
Banco em modo full, passar para modo single |
gfix -shut full
gfix -shut single |
gfix -shut full
gfix -online single |
Banco em modo multi, passar para modo full |
gfix -shut [multi]
gfix -online full |
gfix -shut [multi]
gfix -shut full |
Ativando um banco de dados
Para trazer um banco de dados de volta “a vida”, devemos tirá-lo do status de shutdown, independente de qual modo esteja utilizando. Isso é feito através do comando –online, como no exemplo abaixo:
gfix –online [normal]
Acesso exclusivo ao banco de dados
Para obter acesso exclusivo a um banco de dados, devemos utilizar o modo single de shutdown. Esse modo permitirá que apenas uma única conexão seja efetuada no banco de dados. Abaixo está representado o “fluxo” adequado para a realização de atualizações de metadata no banco, garantindo que a conexão seja exclusiva.
Comandos |
Comentários |
gfix -shut single -force 0 banco.fdb |
Forçar que o banco entre imediatamente em modo single de shutdown. |
Connect...
Alter...
Commit... |
Conectar ao banco para fazer as alterações de estrutura. |
gfix -online banco.fdb |
Ativar o banco para que aceite conexões normalmente. |
O modo padrão para o comando online é o normal. Para o comando –shut é o multi. Nesse caso, não é necessário indicar o modo na linha de comando. Isso garante a compatibilidade com o Firebird 1.x.
Atenção
Não estranhe se ao colocar o banco em modo single de shutdown, ao observar o número de conexões ativas no banco (pela applet do Firebird no painel de controle do Windows, ou via API), você obtiver um número maior que um. Se houver conexões do SYSDBA/Owner no momento que o BD entrar em modo single de shutdown, o Firebird não derrubará essas conexões, no entanto, elas estarão bloqueadas, ou seja, não poderão fazer mais nada a não ser a desconexão.
Shutdown e Linger
O Firebird 3 introduziu o parâmetro linger que permite definir um tempo pelo qual o Firebird manterá a a base de dados “aberta” mesmo após a última desconexão. Isso possibilita manter o cache da base de dados quente por um determinado período, mesmo após a desconexão do último usuário, o que pode ser interessante em ambientes com grande número de conexões curtas (ex: uso em web, etc.).
O gfix ganhou um novo parâmetro chamado -nolinger que faz com que o Firebird não aguarde o tempo definido pelo linger quando a última desconexão acontecer, possibilitando que a base de dados entre em shutdown sem ter que aguardar o tempo do linger e sem que haja necessidade de desligar o linger.
Conclusão
Os modos de shutdown trazidos no Firebird 2.0 finalmente trouxeram a possibilidade de obter conexões exclusivas aos bancos de dados, ou mesmo deixá-lo totalmente indisponível. Isso, com certeza, facilita a vida de muitos programadores.