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
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á
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
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:
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.
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:
- Pegue o utilitário gbak do servidor X-1 e faça o backup usando-o no servidor X
- Transfira o backup para o servidor X-1 e restaure-o
Se houver alguns problemas no passo 1, você pode tentar
- Faça o backup no servidor X, usando seu gbak
- Copie o utilitário gbak de X para X-1
- 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:
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]