quinta-feira, 8 de abril de 2010

Migrando BD para o FB 2.1

Migrando um BD para o FB 2.1

O PROBLEMA

As versões anteriores ao Firebird 2.1 tem problemas relacionados com a extração de charsets e metadata:
  1. Durante a criação/alteração de objetos, não havia a conversão do código textual da metadata (procedures/triggers sources, descriptions, constraints/defaults texts, etc) do charset utilizado no cliente para o charset do sistema (UNICODE_FSS), inserindo bytes "não traduzidos" nas colunas de charset UNICODE_FSS.
  2. Quando lendo BLOBs textuais, não havia tradução do charset definido no BLOB para o charset do cliente.
Note que mesmo na versão 2.1, o item 1 acima poderá ocorrer caso você crie ou altere objetos no banco de dados utilizando uma conexão com charset NONE ou UNICODE_FSS, onde os dados contenham caracteres fora do padrão UNICODE_FSS.
Caso seu banco de dados tenha objetos definidos com caracteres fora do padrão ASCII, você deve repara-lo para que possa ser lido após a migração para o Firebird 2.1.
Abaixo estão descritos dois métodos para corrigir o problema. Escolha o que for melhor para o seu caso.
MÉTODO "A"
Para os passos a seguir, o banco de dados já deve estar na ODS 11.1 (significando que, caso seu banco tenha sido criado em uma versão anterior do FB, você deve fazer um backup e restaura-lo no FB 2.1).
Antes de começar, faça uma cópia do seu banco de dados.
Para cada um dos passos descritos a seguir, é aconselhável que você reconecte no banco de dados.
Passo 1. Criando as procedures no banco de dados
  1. isql database.fdb
  2. SQL> input 'misc/upgrade/metadata/metadata_charset_create.sql';
Passo 2. Verificando o banco de dados
  1. isql database.fdb
  2. SQL> select * from rdb$check_metadata;
A procedure rdb$check_metadata vai retornar todos os objetos que foram afetados por ela.
Caso não retorne um erro/exceção, significa que sua metadata está OK e você pode ir direto para o passo 4 (abaixo). Caso contrário, o primeiro objeto com problemas é o último listado antes de ocorrer a exceção.
Para corrigir a metadata, é necessário saber com qual charset o objeto foi criado. O script de upgrade funcionará corretamente apenas se toda a metadata foi criada com o mesmo charset.
Passo 3. Corrigindo a metadata
  1. isql database.fdb
  2. SQL> input 'misc/upgrade/metadata/metadata_charset_create.sql';
  3. SQL> select * from rdb$fix_metadata('WIN1252');  -- troque WIN1252 pelo charset apropriado
  4. SQL> commit;
A procedure rdb$fix_metadata retornará os mesmos dados que a procedure rdb$check_metadata, mas irá alterar o texto da metadata.
A procedure deve ser executada apenas uma vez! Depois disso, poderá ser apagada.
Passo 4. Removendo as procedures de atualização
  1. isql database.fdb
  2. SQL> input 'misc/upgrade/metadata/metadata_charset_drop.sql';

MÉTODO "B"

Este método tem a vantagem de criar um banco de dados com estrutura 100% válida, visto que qualquer problema no código de procedures, triggers, etc., como por exemplo o uso de palavras que passaram a ser reservadas, acusará erros durante a execução do script, que deverá ser corrigido a fim de deixar o banco de dados com uma metadata perfeita.
  1. Sempre trabalhe com uma cópia da base de dados original, para evitar qualquer tipo de problema.
  2. Antes de migrar para o FB 2.1, extraia o script de criação do banco de dados que será migrado.
  3. Crie um novo banco de dados já no Firebird 2.1, utilizando o script gerado anteriormente. Caso ocorram erros durante a execução do script, corrija os problemas reportados.
  4. Através de uma ferramenta de PUMP (exemplo: IB DataPump), copie os dados da base antiga para o novo banco de dados.
Autor: Carlos Henrique Cantu - Método "A" traduzido e adaptado do arquivo metadata_charset.txt que acompanha o FB 2.1

Nenhum comentário: