Esta página foi traduzida por máquina. Leia o original em inglês. English

Biblioteca IBSurgeon

Todas as versões de On-Disk-Structure (ODS) do Firebird e InterBase

Por Dmitry Kuzmenko, 24-Maio-2016

O que é o Número de Estrutura em Disco (ODS)

Em palavras simples, ODS (On-Disk Structure) é um número do formato de arquivo de banco de dados para uma versão específica do Firebird ou InterBase RDBMS.

Quase todas as versões usam a chamada “Y-valve” para suportar o ODS atual e alguns ODS antigos. Isso permite que o servidor trabalhe com arquivos de banco de dados de versões anteriores e simplifique a transição do servidor antigo para um novo. Mas existem algumas limitações, que serão descritas adiante.

Você pode descobrir o ODS do seu banco de dados executando o seguinte comando

Code
gstat -h nome_do_arquivo_do_banco

Usuário e senha aqui são desnecessários, porque o gstat com a opção -h apenas lê a parte física do banco de dados (página de cabeçalho, número 0).

Se o gstat não entender as informações lidas, ele mostrará uma mensagem correspondente - o que esperava e o que encontrou.

Por exemplo, se executarmos o gstat do InterBase 4 em um banco de dados do Firebird 2, ele mostrará

Code
Wrong ODS version, expected 8, encountered 32779?

Aqui, você vê o número ODS 32779 - isto é 11 codificado, com o bit alto adicionado desde o Firebird 2.0 (em hexadecimal será 800B, onde B = 11), para evitar confusão entre bancos de dados InterBase e Firebird, porque a partir de certo ponto eles tinham o mesmo número ODS, mas formatos de banco de dados muito diferentes. A exceção para obter uma mensagem compreensível é quando o gstat não consegue encontrar firebird.msg ou interbase.msg. Ele mostrará algo como

Code
can't format message 21:3 -- message file ...msg not found

Então, isso significa que você tem uma instalação incorreta do Firebird ou InterBase, e precisa corrigir isso.

Alguns exemplos:

Wrong ODS version, expected 8, encountered 32779? - InterBase 4.x tenta abrir banco de dados Firebird 2.x

Wrong ODS version, expected 8, encountered 13? - InterBase 4.x tenta abrir banco de dados InterBase 2009

Wrong ODS version, expected 15, encountered 32779 - InterBase XE/XE3 tenta abrir banco de dados Firebird 2.x

Wrong ODS version, expected 11, encountered 11 - Firebird 2.x tenta abrir banco de dados InterBase 7.x

Wrong ODS version, expected 11, encountered 15- Firebird 2.x tenta abrir banco de dados InterBase XE/XE3

Às vezes você pode obter outro tipo de mensagem, do servidor (não do gstat), mas com o mesmo significado.

Por exemplo, quando o servidor Firebird 1.5 tenta abrir um banco de dados Firebird 2.x:

Code
unsupported on-disk structure for file ...; found 32779, support 10

Aqui você pode ver a tabela de versões ODS, desde o InterBase 4.0 (1994).

Versão do servidor Número ODS principal Pode trabalhar com ODS Nota
InterBase 4.0/4.1 8.0
InterBase 4.2 8.2 8.2 InterBase 4.2 atualiza forçosamente ODS 8.0 para 8.2
InterBase 5.0/5.1 9.0 8.2 InterBase 5.x atualiza forçosamente ODS 8.0 para 8.2
InterBase 5.5/5.6 9.1 8.2
InterBase 6.0
Firebird 1.0
Yaffil 1.0
10.0 9.0/9.1 É perigoso trabalhar com ODS 9.x, porque novos InterBase e Firebird usam novo formato de metadados, que não é reconhecido pelo InterBase 5.x
Firebird 1.5 10.1 9.0/9.1/10.0 ODS 10.1 do Firebird 1.5 de 64 bits é incompatível com ODS 10.1 de 32 bits. Esta é a única incompatibilidade conhecida de formato de banco de dados entre versões 32/64 bits.
InterBase 7.0 11.0 10.0 Incompatível com ODS 11 do Firebird 2.x
InterBase 7.1 11.1 10.0 InterBase 7.5 atualizará InterBase ODS 11.0/11.1 para 11.2, que é incompatível para versões anteriores (7.0/7.1)
InterBase 7.5 11.2 10.0
Firebird 2.0 11.0 10.x ODS 11 do Firebird 2.0 é incompatível com InterBase 7.x
Firebird 2.1 11.1 10.x/11.0 ODS 11 do Firebird 2.0 é incompatível com InterBase 7.x
Firebird 2.5 11.2 10.x/11.x ODS 11.2 é incompatível com Firebird 2.0/2.1.
Firebird 3.0 12.0 Não suporta ODS anteriores, apenas 12.0
Firebird 4.0 13.0 13.0
Firebird 5.0 13.1 13.0, 13.1 O banco de dados pode ser atualizado de 13.0 para 13.1 com gfix -upgrade de 13.0, ou com backup/restore
InterBase 2007 12.0 11.x
InterBase 2009 13.1 12.0
InterBase XE, XE3 15.0 13.1 Onde está o ODS 14?
InterBase XE7 16.0 15, 13 O ODS “atual” pode ser configurado no IBCONFIG. Desta forma, o XE7 criará bancos de dados (incluindo restore) com o ODS especificado (13, 15, 16) como padrão.

Atualização de ODS

Cada versão do servidor sempre usa (exceto InterBase XE7) seu número ODS principal para o banco de dados criado ou restaurado. Se o ODS do banco de dados for menor que o ODS principal do servidor, o servidor pode trabalhar com esse banco de dados se suportar seu ODS.

Às vezes, o servidor pode atualizar um ODS antigo para um mais novo, sem notificação. Isso pode levar à impossibilidade de retornar à versão anterior. Por exemplo, se você abrir um banco de dados com ODS 8.0 com InterBase 4.2, ele atualizará o ODS para 8.2, que não é compreensível pelo InterBase 4.0/4.1. Assim, a atualização menor do ODS torna bancos de dados incompatíveis dentro da mesma versão principal do servidor. Isso também é verdade para Firebird 2.5 e InterBase 7.5.

Para evitar problemas de retorno à versão anterior, recomendamos fazer backups na versão atual do servidor, mesmo antes da atualização menor da versão do seu servidor.

A diferença entre ODS (principal ou menor) pode ser enorme ou pequena. Se você for curioso o suficiente, pode abrir jrd\ods.h (Firebird open source) e encontrar diferenças entre ODS. Por exemplo, ODS 9.0 comparado a 8.x tem integridade referencial declarativa, papéis SQL, coleta de lixo em índices. Mas ODS 9.1 difere de 9.0 apenas por um índice, adicionado a alguma tabela do sistema.

Observe que a versão principal do ODS não pode ser atualizada em tempo real. Você só pode atualizá-la por backup/restore.

Migração entre InterBase e Firebird

As últimas versões do Firebird (3.0) e InterBase (XE7) são muito diferentes, em recursos e ODS. Como foi dito antes, o último comum foi ODS 10, e desde então (Firebird 2.0 e InterBase 7.0) os bancos de dados são incompatíveis em seu formato.

Assim, a migração será mais fácil se você não usou recursos desde InterBase 7.x ou Firebird 1.5. Se sim - a complexidade da migração dependerá de quantos recursos você usou no banco de dados ou no processo de administração.

Atualmente, após muitos anos de desenvolvimento do Firebird e InterBase, a migração entre as versões mais recentes desses servidores é difícil.

De qualquer forma, se você tentar fazer isso, precisa extrair o script de metadados do banco de dados e, em seguida, tentar criar o novo banco de dados a partir desse script, usando o mesmo servidor.

Code
isql -x db.gdb …
isql -i script.ddl …

Isso precisa ser feito para verificar se há metadados antigos ruins em seu banco de dados ou bugs de extração de script no servidor que você usa. InterBase e Firebird armazenam procedures, triggers e views (e alguns outros objetos) em forma compilada (BLR - Binary Language Representation), e durante backup/restore os metadados não são recompilados (de SQL para BLR).

Nesse caso, se um banco de dados foi criado há muito tempo e constantemente modificado, pode haver BLR incorreto (antigo) para alguns objetos. Esses objetos ainda podem funcionar, mas tentar recriá-los (ALTER) pode gerar erro de sintaxe (ou outro).

Então você pode tentar criar um banco de dados a partir do script corrigido no novo servidor. Depois de corrigir todas as incompatibilidades neste script, você pode transferir dados do banco de dados antigo para o novo banco de dados.

Mesmo se você tentou fazer backup no servidor antigo e restaurar no novo, e funcionou - nunca confie nisso. Se seu banco de dados contém muitos objetos, você não pode verificar todos de uma vez no novo servidor, então o erro aparecerá algum tempo depois.

Como retornar à versão anterior do Firebird ou InterBase

Às vezes, você pode precisar fazer um downgrade e voltar do novo servidor. As razões podem variar - bug repentino no servidor, problemas de desempenho, e assim por diante.

Se você fez o backup antes da atualização do servidor, não haverá problemas para retornar. Mas se não, você enfrentará o problema de retornar do novo ODS para o ODS antigo.

Para fazer isso, você precisará de 2 computadores com o novo servidor e o antigo. Se você não usou nenhum recurso novo do servidor X (versão do InterBase ou Firebird), então você pode retornar ao X-1 seguindo estes passos:

  1. Pegue o utilitário gbak do servidor X-1 e faça o backup usando-o no servidor X
  2. Transfira o backup para o servidor X-1 e restaure-o

Se houver alguns problemas no passo 1, você pode tentar

  1. Faça o backup no servidor X, usando seu gbak
  2. Copie o utilitário gbak de X para X-1
  3. Restaure o backup no X-1 usando o gbak de X

Observe que o protocolo local entre servidores X e X-1 pode ser incompatível, então é melhor especificar o nome do servidor:

Code
gbak -b localhost:c:\dir\data.gdb

O resultado será bem-sucedido apenas com a condição de que você não tenha alterado nenhum dos objetos do banco de dados no servidor X desde que atualizou do X-1.

Aqui estão exemplos:

  • De 5.x para 4.2 - nenhum papel e nova integridade referencial declarativa deve ser usada
  • De 6.x para 5.x - nenhuma alteração de metadados, porque 6.x usa novo formato BLR
  • De InterBase 7.x para Firebird - nenhuma coluna booleana e nomes de objetos com mais de 31 caracteres.
  • De Firebird 1.5 para InterBase - sem colunas BIGINT e novas extensões SQL em triggers e procedures
  • De Firebird 2.0 para Firebird 1.5 - nenhuma das novas funcionalidades do Firebird 2.0.
  • E assim por diante

Se ainda houver erros que não podem ser corrigidos, a única maneira é criar o banco de dados no servidor X-1 a partir do script SQL e transferir dados.

Serviço de Migração Firebird

Frequentemente, a migração é uma tarefa complexa, especialmente para bancos de dados Firebird legados, que foram abandonados pelos desenvolvedores originais. Nossa empresa oferece o serviço abrangente de migração para bancos de dados Firebird complexos. A taxa regular é de USD$2900.

Por exemplo, migramos um banco de dados cujo script SQL tinha 55 Megabytes, com mais de 5000 stored procedures, 1000 tabelas e vários milhares de consultas SQL ad hoc, em menos de 3 meses.

Se você tiver alguma dúvida, entre em contato conosco [email protected]