Цю сторінку перекладено машинним перекладом. Читайте англійський оригінал. English

Бібліотека IBSurgeon

Швидке перетворення баз даних Firebird 2.5 у 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 ми використаємо стандартний архів.

Мінімальний набір (який не потребує середовища виконання VS2008/VS2010) містить такі файли:

Code
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 два рядки:

Code
MaxUnflushedWrites = -1
MaxUnflushedWriteTime = -1

Також добре встановити різні імена для параметра IpcName для Firebird 2.5 та Firebird 3.0.

Інші параметри, якщо бажаєте, можуть бути змінені з урахуванням того, що під час конвертації бази даних Firebird 2.5 читає дані, а Firebird 3 записує дані та створює індекси.

Щоб прискорити створення індексів, рекомендуємо збільшити параметр TempCacheLimit до ~40% доступної оперативної пам’яті (якщо це виділений комп’ютер або сервер).

Наприклад, якщо у вас 16 ГБ оперативної пам’яті, ви можете встановити

Code
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.

Потім запустіть командний рядок з підвищеними правами (Запуск від імені адміністратора):

Code
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 включно не було простого способу встановити 2 різні версії сервера. Опція «компіляція з вихідних кодів з префіксом» тут не розглядається.

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 (без мережевої частини), але права доступу перевірятимуться за допомогою бази даних користувачів, тому необхідно вказати не лише ім’я користувача-власника бази даних, але й пароль:

Code
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» є власником файлу бази даних.

Якщо ні, потрібно це виправити:

Code
chown firebird.firebird назва_бази

Підсумок

Потокова конвертація швидша за стандартний підхід (gbak -b, потім gbak -c), оскільки вона пропускає операції «запису в резервну копію» посередині - в результаті час потокової конвертації становить приблизно «час резервного копіювання плюс 10-15%» плюс «час створення індексів».

На нашій практиці потокова конвертація щонайменше на 25-30% швидша за традиційне «послідовне» резервне копіювання та відновлення.

Окрім економії часу та зменшення потреби у вільному дисковому просторі, потокова конвертація має ще одну перевагу - вона не потребує видалення наявного Firebird 2.5, що дозволяє швидко повернутися до 2.5 у разі помилки під час конвертації.

Контакти

Будь ласка, надсилайте відгуки та запити команді підтримки IBSurgeon.