Conversione rapida dei database Firebird 2.5 a Firebird 3.0
Басил Сидоров, 02-АПР-2019, (c) IBSurgeon
Каждая версия Firebird имеет свой собственный формат базы данных - O(n)D(isk)S(tructure). До версии 2.5 движок базы данных может работать с ODS предыдущей версии, но движок Firebird 3 работает только со своим собственным ODS (версия 12.0).
Для обновления базы данных с Firebird 2.5 до 3.0 необходимо создать резервную копию файла базы данных с помощью инструмента gbak в 2.5, а затем восстановить её в 3.0.
Конечно, базу данных необходимо подготовить к конвертации - метаданные и запросы нужно проверить на совместимость с Firebird 3.0, а после восстановления в Firebird 3 все объекты с BLR (триггеры, хранимые процедуры и т.д.) должны быть перекомпилированы.
Если мы используем стандартный подход, нам нужно сделать резервную копию базы данных на 2.5, а затем установить Firebird 3 и восстановить файл резервной копии.
Это нормально, если у вас достаточно времени. Но когда ваша база данных большая, или у вас десятки баз данных для миграции, и вы ограничены во времени, вы можете использовать потоковую конвертацию, которая на 25-30% быстрее.
Идея заключается в использовании конвейера:
gbak -b … db25 stdout | gbak -c … stdin db30
Gbak -b из 2.5 записывает резервную копию последовательно и направляет её в поток stdout, который немедленно читается из stdin gbak’ом 3.0 и создаёт новую базу данных.
Этот конвейер должен использовать локальный доступ к базе данных (встроенный), потому что сетевые передачи данных (даже через localhost) значительно замедлят процесс.
Ниже мы рассмотрим, как выполнить потоковое резервное копирование на Windows и на Linux.
Windows
Для Windows лучше сделать специальный набор файлов Firebird. Нам нужно взять встроенный архив Firebird 2.5, переименовать fbembed.dll в fbclient.dll и добавить gbak.exe и, по желанию, isql.exe.
Для Firebird 3.0 мы будем использовать стандартный архив.
Минимальный набор (не требующий runtime VS2008/VS2010) содержит следующие файлы:
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
Опытный администратор/разработчик может заметить, что файлы 25/intl/fbintl.dll и 25/intl/fbintl.conf не включены. Это верно, потому что gbak не использует набор символов для соединения и не конвертирует данные между наборами символов. Но на принимающей стороне, Firebird 3.0, файлы icu* необходимы, потому что наборы символов используются при создании индексов (заключительный этап резервного копирования/восстановления).
Рекомендуется добавить в firebird.conf Firebird 3 две строки:
MaxUnflushedWrites = -1
MaxUnflushedWriteTime = -1
Также хорошо установить разные имена для параметра IpcName для Firebird 2.5 и Firebird 3.0.
Другие параметры, если хотите, могут быть изменены с учётом того, что во время конвертации базы данных Firebird 2.5 читает данные, а Firebird 3 записывает данные и создаёт индексы.
Для ускорения создания индексов рекомендуем увеличить параметр TempCacheLimit до ~40% доступной оперативной памяти (если это выделенный компьютер или сервер).
Например, если у вас 16 ГБ ОЗУ, вы можете установить
TempCacheLimit=6G
Конечно, это значение может быть установлено только если вы используете 64-битный Firebird 3, потому что любой 32-битный процесс не может выделить более 2 гигабайт оперативной памяти.
Вам не нужно изменять этот параметр для 2.5, потому что он не влияет на скорость резервного копирования, и Firebird 2.5 сам не может использовать более 2 гигабайт оперативной памяти для этого параметра, даже 64-битная версия.
Также перед началом проверьте, что значение «page buffers» равно 0 на странице заголовка базы данных (gstat -h имябазы).
Если параметр «page buffers» установлен в заголовке базы данных, он переопределяет настройки firebird.conf, и в случае большого значения может привести к огромному потреблению памяти и снижению производительности процесса конвертации.
Затем скопируйте подготовленный набор файлов в целевую систему.
Обратите внимание, что перед конвертацией необходимо остановить обычную службу Firebird 2.5.
Затем запустите командную строку с повышенными правами (Запуск от имени администратора):
set ISC_USER=<укажите_владельца_вашей_базы_данных_или_sysdba>
set ISC_PASSWORD=пароль
"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
Здесь полная командная строка заключена в двойные кавычки, символ | используется для конкатенации, а символ ^ используется для экранирования перевода строки (это полезно в случае длинных командных строк).
Опция -st(atus) была введена в Firebird 2.5.8 и позволяет записывать больше информации о процессе резервного копирования в файл журнала.
Linux
Firebird 3 зависит от библиотеки tommath на Linux. На CentOS (RHEL) эта библиотека находится в epel-репозитории, на Ubuntu (Debian) - в системном репозитории.
На CentOS сначала нужно включить EPEL-репозиторий и только затем выполнить « yum install libtommath».
На Ubuntu не нужно подключать дополнительные репозитории, но Ubuntu 16 и Ubuntu 18 имеют разные версии пакетов - libtommath0 и libtommath1 соответственно.
Firebird 3 ищет tommath.so.0, и для Ubuntu 18 нужно создать символическую ссылку с tommath.so.0 на tommath.so.1. Для этого сначала нужно найти tommath.so.1. Обычный путь на Ubuntu - /usr/lib/x86.64- linux -gnu/, но он может быть другим в других дистрибутивах на основе Debian.
Другая проблема заключается в том, что до Firebird 3.0.1 включительно не было простого способа установить две разные версии сервера. Вариант «компиляция из исходников с префиксом» здесь не рассматривается.
Firebird 3.0.2 содержит исправление CORE‑5204: сборка с -enable-binreloc, (http://tracker.firebirdsql.org/browse/CORE-5204), и отдельную опцию установщика -path.
Итак, если библиотека tommath и, при необходимости, символическая ссылка tommath.so.0 установлены, вы можете установить новейший дистрибутив Firebird 3.0.4 в /opt/fb3 следующей командой: ./install.sh -path /opt/fb3
После этого вы можете остановить существующий Firebird 2.5 и запустить потоковую конвертацию.
Если вы используете Firebird 2.5 Classic, помните, что Classic обычно запускается через xinetd - поэтому вам нужно отключить службу firebird для xinetd или полностью остановить xinetd.
Вам не нужно устанавливать параметры MaxUnflushed* в firebird.conf Firebird 3 (потому что они работают только на Windows) или изменять что-либо в Firebird 2.5.
Встроенный доступ в Firebird 2.5 на Linux не такой, как на Windows - Firebird 2.5 будет работать внутри процесса gbak (без сетевой части), но права доступа будут проверяться с помощью пользовательской базы данных, поэтому необходимо указать не только имя владельца базы данных, но и пароль:
export ISC_USER=имяпользователя ISC_PASSWORD=пароль
/opt/firebird/bin/gbak -b … db25 stdout\
|/opt/fb3/bin/gbak -c … stdin db30
После успешной конвертации необходимо удалить «временный экземпляр» Firebird 3, затем удалить оригинальный 2.5, и только после этого можно выполнить чистую установку Firebird 3.
Лучше устанавливать Firebird 3 из tar.gz, а не из репозиториев, потому что tar.gz устанавливает всё в удобное место /opt/ firebird , а также версия Firebird в репозиториях обычно старше, чем в tar.gz.
После завершения конвертации и установки Firebird 3 необходимо проверить, что пользователь «firebird» является владельцем файла базы данных.
Если нет, нужно это исправить:
chown firebird.firebird имябазы
Резюме
Потоковая конвертация быстрее стандартного подхода (gbak -b, затем gbak -c), потому что она пропускает операции «записи в резервную копию» в середине - в результате время потоковой конвертации составляет примерно «время резервного копирования плюс 10-15%» плюс «время создания индексов».
На нашей практике потоковая конвертация как минимум на 25-30% быстрее традиционного «последовательного» резервного копирования и восстановления.
Помимо экономии времени и снижения потребности в свободном дисковом пространстве, потоковая конвертация имеет ещё одно преимущество - она не требует удаления существующего Firebird 2.5, что позволяет быстро вернуться к 2.5 в случае ошибки во время конвертации.
Контакты
Пожалуйста, отправляйте отзывы и вопросы в службу поддержки IBSurgeon.