четверг, 8 сентября 2011 г.

Миграция с FireBird 1.5 на FireBird 2.1


Данная статья - есть вольный перевод статьи misc/upgrade/metadata/metadata_charset.txt с собственными комментариями и дополнениями

В версиях Firebird до версии 2.1 были две проблемы связанные с наборами символов и извлечением метаданных:
  1. При создании/изменении объектов, никогда не транслитерировался (перекодировался) текст метаданных  (текст процедур/триггеров, описания (rdb$description), ограничений (constraints)/значений по-умолчанию, и т.д.), из клиентского набора символов в системный (UNICODE_FSS). То есть, исходный текст просто помещался в столбец с кодировкой UNICODE_FSS.
  2. При чтении текстовых BLOB`в, они не перекодировались из набора символов BLOB`а в клиентский набор символов
Даже в версии 2.1, проблема 1 может возникнуть если вы создаете или изменяете объекты с клиентской кодировкой NONE или UNICODE_FSS, но с текстом в кодировке не UNICODE_FSS.

Если вы создаете или создавали метаданные с не ASCII символами (любые национальные символы, например WIN1251 и т.д.), то вам нужно "отремонтировать" вашу базу данных чтобы метаданные корректно читались после обновления на 2.1.

Чтобы проделать эту операцию, база данных должна быть в формате ODS11.1 (backup, и затем restore в FB 2.1). Перед этим сделайте копию базы данных.

Также рекомендуется делать реконнект перед выполнением каждого действия, приведенного ниже.

Создаем процедуры перекодировки метаданных в базе данных:
$isql-fb database.fdb
SQL> input '/usr/lib/Firebird/2.1/misc/upgrade/metadata/metadata_charset_create.sql';
SQL> quit;

Проверьте базу данных:
$isql-fb database.fdb
SQL> select * from rdb$check_metadata;
SQL> quit;

Процедура rdb$check_metadata вернет список объектов, которые будут обработаны.
Если ошибок не происходит, то ваши метаданные в порядке, и можно переходить к разделу "Удаление процедур обновления метаданных".
Иначе, первый "плохой" объект является последним в списке перед возникновением ошибки.
Для исправления метаданных, вам нужно знать, в каком наборе символов были созданы эти метаданные. Скрипт обновления метаданных будет работать корректно только если все метаданные были созданы в одном и том же наборе символов.


Исправление метаданных:
$isql-fb database.fdb
SQL> input '/usr/lib/Firebird/2.1/misc/upgrade/metadata/metadata_charset_create.sql';
SQL> select * from rdb$fix_metadata('WIN1252'); -- replace WIN1252 by your DB charset
SQL> commit;
SQL> quit;

Процедура rdb$fix_metadata возвращает те же данные, что и rdb$check_metadata, но с исправлением текста метаданных.
Запускать эту процедуру можно только один раз!
Если это действие не помогло и при проверке базы данных возникают ошибки - необходимо проверить все метаданные (процедуры, триггеры и т.д.) на наличие в коде "плохих" символов (например, русскоязычные комментарии) и удалить их вручную.

После этого можно удалить процедуры обновления метаданных.


Удаление процедур обновления метаданных:

$isql-fb database.fdb
SQL> input '/usr/lib/Firebird/2.1/misc/upgrade/metadata/metadata_charset_drop.sql';
SQL> quit;

Жопиздан:)