Versões distintas do FirebirdSQL no mesmo Windows

A intenção deste artigo é permitir que um mesmo host tenha duas ou mais versões do Firebird. Você vai precisar disso em duas situações ao menos: (1) É um desenvolvedor e dá suporte a mais de uma versão do Firebird e (2) Está migrando de versão de banco de dados para outra mais recente.

REQUERIMENTOS

  1. Um bom editor de textos para editar arquivos de configuração, recomendo o notepad++.
  2. Instalador do Firebird 3
  3. Instalador do Firebird 4

INSTALANDO O FIREBIRD 3

1. Instale a versão FB3, use o instalador padrão.

2. Execute “services.msc” e então pare a instância padrão que chama-se “DefaultInstance”, depois vá ao cmd como administrador e posicione-se na pasta padrão de instalação:

cd "C:\Program Files\Firebird\Firebird_3_0"
instsvc.exe r -n "DefaultInstance"

Se deu certo aparecerá a mensagem “Service “Firebird Server – DefaultInstance” successfully deleted.” então a instância padrão deste Firebird foi corretamente removida.

3. Criando uma nova instância com outro nome para o Firebird 3.0:

instsvc.exe i -n "Firebird3"

O Firebird3 não estará operacional até que iniciemos o serviço via “services.msc”, mas não faremos isso ainda porque ainda teremos de instalar o FB4 e indicar as portas que cada instalação responderá.

4. Ainda como administrador no cmd, execute:

notepad++ "C:\Program Files\Firebird\Firebird_3_0\firebird.conf"

Ao invés de notepad++ pode usar um editor de sua preferência. Localizamos a linha:

#RemoteServicePort = 3050

Então após comentá-la usando “#” no inicio da linha, acrescentamos logo depois:

RemoteServicePort = 3060

O FirebirdSQL3 precisa de uma porta especifica para enviar eventos, um recurso pouco utilizado, mas muito interessante. Recomendo que estabeleça uma porta específica para ela, caso contrário, o FirebirdSQL3 irá escolher uma porta aleatória e isso é ruim, então localize a seguinte linha:

#RemoteAuxPort = 0

Então após comentá-la usando “#” no inicio da linha, acrescentamos logo depois:

RemoteAuxPort = 3061

INSTALAÇÃO DO FIREBIRD 4

1. Instale a versão FB4, use o instalador padrão.

2. Execute “services.msc” e então pare a instância padrão que chama-se “DefaultInstance” (igual ao FB3), depois vá ao cmd como administrador e posicione-se na pasta padrão de instalação:

cd "C:\Program Files\Firebird\Firebird_4_0"
instsvc.exe r -n "DefaultInstance"

Se deu certo aparecerá a mensagem “Service “Firebird Server – DefaultInstance” successfully deleted.” então a instância padrão deste Firebird foi corretamente removida.

3. Criando uma nova instância para o Firebird 4.0, ainda na pasta default do FB4:

instsvc.exe i -n "Firebird4"

4. Ainda como administrador no cmd, execute:

notepad++ "C:\Program Files\Firebird\Firebird_4_0\firebird.conf"

Ao invés de notepad++ pode usar um editor de sua preferência. Então novamente localizamos a linha:

#RemoteServicePort = 3050

Então após comentá-la usando “#” no inicio da linha, acrescentamos logo depois:

RemoteServicePort = 4060

Assim como na versão anterior, o Firebird4 precisa ter uma porta especifica para enviar eventos, se não for escolhida uma específica então uma porta aleatória será escolhida e isso é ruim, então localize a seguinte linha:

#RemoteAuxPort = 0

Então após comentá-la usando “#” no inicio da linha, acrescentamos logo depois:

RemoteAuxPort = 4061

INICIANDO OS SERVIÇOS

Execute “services.msc” e inicie os serviços:

Firebird3
Firebird4

Lembre-se de que cada conexão ao FirebirdSQL está em portas diferentes, e sob esta condição você não poderá usar conexão local, ou variações dela como “xnet” porque não saberá qual versão do FirebirdSQL instalada responderá, então precisará sempre usar uma conexão remota em sua string de conexão para dizer explicitamente qual das versões pretende que seja usada, ex:

localhost/3060:c:\caminho\ou\alias\para\banco.fdb
localhost/4060:c:\caminho\ou\alias\para\banco.fdb
User=SYSDBA;Password=masterkey;Database=c:\caminho\ou\alias\para\banco.fdb;DataSource=localhost;Port=3060;Dialect=3;Charset=ISO8859_1;Role=;Connection lifetime=15;Pooling=true;MinPoolSize=0;MaxPoolSize=50;Packet Size=8192;ServerType=0;
User=SYSDBA;Password=masterkey;Database=c:\caminho\ou\alias\para\banco.fdb;DataSource=localhost;Port=4060;Dialect=3;Charset=ISO8859_1;Role=;Connection lifetime=15;Pooling=true;MinPoolSize=0;MaxPoolSize=50;Packet Size=8192;ServerType=0;
inet://localhost:3060/c:\caminho\ou\alias\para\banco.fdb
inet://localhost:4060/c:\caminho\ou\alias\para\banco.fdb

Os exemplos acima são usados de diferentes formas em diferentes linguagens e programas, adapte-a a sua situação.

FIREBIRD 4 COM COMPATIBILIDADE DE TIPOS DE VERSÕES ANTERIORES?

Algumas pessoas que estejam migrando de uma versão anterior para versão 4 do Firebird podem ter problemas com tipos novos, em especial, time e timestamp, pois estes novos tipos agora carregam a informação GMT e isso pode fazer a aplicação quebrar. Para solucionar este problema, vá ao arquivo firebird.conf que está no diretório do Firebird4 e acrescente a seguinte linha:

DataTypeCompatibility = 3.0

Você pode trocar 3.0 por 2.5 também.

BACKUP DE CONTAS

Nos casos em que estamos migrando uma base de dados para outra versão, geralmente nos preocupamos em copiar as contas de usuários e suas senhas. Se este for o seu caso, isso é fácil, no exemplo abaixo vamos simular que estamos migrando estas contas do FB3 para o FB4:

No ambiente de produção, realize o backup de “security3.fdb” gerando um arquivo “c:\temp\security3.fbk”:

cd “C:\Program Files\Firebird\Firebird_3_0”

cd "C:\Program Files\Firebird\Firebird_3_0"
gbak -v -b -t -user sysdba -password SENHAFB3 "security3.fdb" c:\temp\security3.fbk

Agora temos o arquivo “c:\temp\security3.fbk” que é o backup das contas contidas no FB3, vamos restaurá-lo no FB4:

cd "C:\Program Files\Firebird\Firebird_4_0"
ren security4.fdb security4.fdb.ori
gbak -v -r -user sysdba c:\temp\security3.fbk security4.fdb

Dica: Não é preciso o parâmetro “-password” nos casos de restauração.

Se a restauração tiver tido êxito, a partir de agora, a senha do SYSDBA no FB4 é aquela que estava no FB3. Eu recomendo que não mantenha a mesma senha em ambos os serviços, faça a troca para impedir você mesmo ou outra pessoa que tenha acesso a base de produção achar que está acessando um servidor quando na realidade está acessando outro. Não mude apenas a senha do SYSDBA, mas de todos aqueles que fazem o acesso interativo ou administram a base de dados.

FIREWALL

Contando todos os Firebirds que instalamos, creio que usaremos as portas 3060 e 3061 (para o FB3) e 4060 e 4061 (para o FB4) então configure seu firewall para que o mesmo não obstrua a comunicação entre estes serviços e você ou outras estações de trabalho. Se usa o Firewall do Windows, geralmente a comunicação com localhost já é liberado, então não precisaria de nenhum ajuste para seu host acessar tais serviços.

Dica: As numerações das portas foi intencional, veja novamente os note que apenas olhando para eles saberemos qual versão de Firebird estaremos acessando. Recomendo que siga a mesma orientação para outras versões de Firebird para outras portas que também seja semelhante.

EVITAR A PORTA 3050?

A porta 3050 é a padrão do Firebird, isto é, se você não indicar a porta numa string de conexão, o driver ou framework de acesso de seu programa assumirá o padrão que é 3050.

Daí você deve pensar se isso é uma boa ideia, pois se eu estivesse migrando de uma versão para outra, provavelmente deixaria a porta 3050 para a versão mais recente que quero migrar e então faz sentido usar a porta 3050, mas se eu estivesse tendo que dar manutenção em multiplas versões do Firebird na minha máquina de desenvolvimento eu evitaria usar a porta 3050 para impedir acessos acidentais a base por programas que esqueceram de espeficar a porta.

CONCLUSÃO

Por favor, não use este artigo como método para colocar dois serviços Firebird em produção e economizar dinheiro com compra de máquinas, isso não é recomendável. Assim como não juntamos um cavalo e um boi para levar uma carroça, também não juntamos serviços que competem por CPU e DISCO no mesmo host. Essa é uma regra que não deveria ser discutida em empresas que valorizam qualidade dos serviços.

Claro que toda regra tem sua exceção, você pode juntar dois serviços no ambiente de produção no mesmo host quando sua inteção é atualizar ou migrar de uma versão para outra e quer fazer isso de maneira cautelosa, afinal, se a migração não der certo então ficará mais fácil retornar a versão anterior. Salvo essa exceção, este artigo é para desenvolvedores que dão manutenção nas duas (ou mais) versões de FirebirdSQL.