Conversão rápida de bancos de dados Firebird 2.5 para Firebird 3.0
Basil Sidorov, 02-APR-2019, (c) IBSurgeon
Cada versão do Firebird tem seu próprio formato de banco de dados - O(n)D(isk)S(tructure). Até a versão 2.5, o mecanismo do banco de dados pode trabalhar com o ODS da versão anterior, mas o mecanismo do Firebird 3 trabalha apenas com seu próprio ODS (versão 12.0).
Para atualizar um banco de dados do Firebird 2.5 para o 3.0, é necessário fazer o backup do arquivo do banco de dados com a ferramenta gbak no 2.5 e, em seguida, restaurá-lo no 3.0.
Naturalmente, o banco de dados precisa ser preparado para a conversão - os metadados e as consultas precisam ser verificados quanto à compatibilidade com o Firebird 3.0, e após a restauração no Firebird 3, todos os objetos com BLR (triggers, procedimentos armazenados, etc.) devem ser recompilados.
Se usarmos a abordagem padrão, precisamos fazer o backup do banco de dados no 2.5 e, em seguida, instalar o Firebird 3 e restaurar o arquivo de backup.
Isso é aceitável se você tiver tempo suficiente. Mas quando seu banco de dados é grande, ou você tem dezenas de bancos de dados para migrar, e você está limitado em tempo, você pode usar a conversão por fluxo (stream), que é 25-30% mais rápida.
A ideia é usar o pipeline:
gbak -b … db25 stdout | gbak -c … stdin db30
O Gbak -b do 2.5 escreve o backup sequencialmente e o direciona para o fluxo stdout, que é imediatamente lido do stdin pelo gbak do 3.0 e cria um novo banco de dados.
Este pipeline precisa usar acesso local ao banco de dados (embutido), porque transferências de dados pela rede (mesmo em localhost) diminuirão significativamente o processo.
Abaixo, consideramos como realizar o backup por fluxo no Windows e no Linux.
Windows
É melhor criar um conjunto especial de arquivos do Firebird para Windows. Precisamos pegar o arquivo embutido do Firebird 2.5, renomear fbembed.dll para fbclient.dll, e adicionar gbak.exe e, opcionalmente, isql.exe.
Para o Firebird 3.0, usaremos o arquivo padrão.
O conjunto mínimo (que não requer o runtime de VS2008/VS2010) contém estes arquivos:
25/gbak.exe
25/fbclient.dll
25/firebird.conf
25/firebird.log
25/firebird.msg
25/ib_util.dll
25/icudt30.dll
25/icuin30.dll
25/icuuc30.dll
25/Microsoft.VC80.CRT.manifest
25/msvcp80.dll
25/msvcr80.dll
30/fbclient.dll
30/firebird.conf
30/firebird.msg
30/gbak.exe
30/ib_util.dll
30/icudt52.dll
30/icudt52l.dat
30/icuin52.dll
30/icuuc52.dll
30/msvcp100.dll
30/msvcr100.dll
30/intl/fbintl.conf
30/intl/fbintl.dll
30/plugins/engine12.dll
Administradores/desenvolvedores experientes podem notar que os arquivos 25/intl/fbintl.dll e 25/intl/fbintl.conf não estão incluídos. Isso é verdade, porque o gbak não usa o conjunto de caracteres para a conexão e não converte dados entre conjuntos de caracteres. Mas, no lado do receptor, Firebird 3.0, os arquivos icu* são necessários, porque os conjuntos de caracteres são usados durante a criação dos índices (a etapa final do backup/restauração).
É recomendado adicionar ao firebird.conf do Firebird 3 duas linhas:
MaxUnflushedWrites = -1
MaxUnflushedWriteTime = -1
Além disso, é bom definir nomes diferentes para o parâmetro IpcName para o Firebird 2.5 e o Firebird 3.0.
Outros parâmetros, se desejar, podem ser alterados considerando que durante a conversão do banco de dados o Firebird 2.5 lê dados, e o Firebird 3 escreve dados e cria índices.
Para acelerar a criação de índices, recomendamos aumentar o parâmetro TempCacheLimit para ~40% da RAM disponível (se for um computador ou servidor dedicado).
Por exemplo, se você tem 16 GB de RAM, você pode definir
TempCacheLimit=6G
Naturalmente, este valor só pode ser definido se você usar o Firebird 3 de 64 bits, porque qualquer processo de 32 bits não pode alocar mais de 2 gigabytes de RAM.
Você não precisa alterar este parâmetro para o 2.5, porque ele não afeta a velocidade do backup, e o Firebird 2.5 em si não pode usar mais de 2 gigabytes de RAM para este parâmetro, mesmo na versão de 64 bits.
Além disso, antes de começar, verifique se o valor de “page buffers” é 0 na página de cabeçalho do banco de dados (gstat -h nomedobanco).
Se o parâmetro “page buffers” estiver definido no cabeçalho do banco de dados, ele substitui as configurações do firebird.conf, e no caso de um valor grande pode resultar em consumo enorme de memória e degradação do desempenho do processo de conversão.
Em seguida, copie o conjunto preparado de arquivos para o sistema de destino.
Observe que você precisa parar o serviço regular do Firebird 2.5 antes da conversão.
Então, inicie o prompt de comando com elevação de direitos (Executar como Administrador):
set ISC_USER=<especifique_o_dono_do_seu_banco_ou_sysdba>
set ISC_PASSWORD=senha
"25/gbak" -z -b -g -v -st t -y 25.log db25 stdout|^
"30/gbak" -z -c -v -st t -y 30.log stdin db30
Aqui, a linha de comando completa está entre aspas duplas, o símbolo | é usado para concatenação, e o símbolo ^ é usado para escapar a quebra de linha (é útil no caso de linhas de comando longas).
A opção -st(atus) foi introduzida no Firebird 2.5.8 e permite escrever mais informações sobre o processo de backup no arquivo de log.
Linux
O Firebird 3 depende da biblioteca tommath no Linux. No CentOS (RHEL), esta biblioteca está localizada no repositório EPEL, no Ubuntu (Debian) no repositório do sistema.
No CentOS, você precisa primeiro habilitar o repositório EPEL e só então executar « yum install libtommath».
No Ubuntu, você não precisa anexar repositórios adicionais, mas o Ubuntu 16 e o Ubuntu 18 têm versões diferentes do pacote - libtommath0 e libtommath1, respectivamente.
O Firebird 3 procura por tommath.so.0, e para o Ubuntu 18 você precisa criar um link simbólico de tommath.so.0 para tommath.so.1. Para fazer isso, primeiro você precisa encontrar tommath.so.1. O caminho usual no Ubuntu - /usr/lib/x86.64- linux -gnu/, mas pode ser diferente em outras distribuições baseadas em Debian.
Outro problema é que até o Firebird 3.0.1, inclusive, não havia uma maneira simples de instalar 2 versões diferentes do servidor. A opção “compilar a partir dos fontes com um prefixo” não é considerada aqui.
O Firebird 3.0.2 tem a correção CORE‑5204: build com -enable-binreloc, (http://tracker.firebirdsql.org/browse/CORE-5204), e a opção separada do instalador -path.
Então, se a biblioteca tommath e, se necessário, o link simbólico tommath.so.0 foram instalados, você pode instalar a distribuição mais recente do Firebird 3.0.4 em /opt/fb3 com o seguinte comando: ./install.sh -path /opt/fb3
Depois disso, você pode parar o Firebird 2.5 existente e executar a conversão por fluxo.
Se você usa o Firebird 2.5 Classic, lembre-se de que o Classic geralmente é executado pelo xinetd - então, você precisa desabilitar o serviço firebird para o xinetd ou parar completamente o xinetd.
Você não precisa definir os parâmetros MaxUnflushed* no firebird.conf do Firebird 3 (porque eles funcionam apenas no Windows), ou alterar qualquer coisa no Firebird 2.5.
O acesso embutido no Firebird 2.5 no Linux não é como no Windows - o Firebird 2.5 funcionará dentro do processo gbak (sem a parte de rede), mas os direitos de acesso serão verificados com o banco de dados de usuários, então, é necessário especificar não apenas o nome de usuário do dono do banco de dados, mas também a senha:
export ISC_USER=nomedousuario ISC_PASSWORD=senha
/opt/firebird/bin/gbak -b … db25 stdout\
|/opt/fb3/bin/gbak -c … stdin db30
Após a conversão bem-sucedida, você precisa remover a “instância temporária” do Firebird 3, depois desinstalar o 2.5 original, e somente depois disso, você pode realizar a instalação limpa do Firebird 3.
É melhor instalar o Firebird 3 a partir do tar.gz, não dos repositórios, porque o tar.gz instala tudo no local conveniente /opt/ firebird , e também a versão do Firebird nos repositórios geralmente é mais antiga do que no tar.gz.
Após a conversão estar completa e o Firebird 3 instalado, você precisa verificar se o usuário “firebird” é o dono do arquivo do banco de dados.
Se não for, você precisa corrigir:
chown firebird.firebird nomedobanco
Resumo
A conversão por fluxo é mais rápida do que a abordagem padrão (gbak -b, depois gbak -c), porque ela pula as operações de “escrita no backup” no meio - como resultado, o tempo de conversão por fluxo é cerca de “tempo de backup mais 10-15%” mais “tempo para criar índices”.
Em nossa prática, a conversão por fluxo é pelo menos 25-30% mais rápida do que o backup e restauração tradicionais “sequenciais”.
Além de economizar tempo e reduzir a demanda de espaço livre em disco, a conversão por fluxo tem mais uma vantagem - ela não requer remover o Firebird 2.5 existente, o que permite reverter rapidamente para o 2.5 em caso de erro durante a conversão.
Contatos
Por favor, envie comentários e perguntas para a equipe de suporte do IBSurgeon.