Szybka konwersja baz danych Firebird 2.5 do Firebird 3.0
Basil Sidorov, 02-APR-2019, (c) IBSurgeon
Każda wersja Firebird ma swój własny format bazy danych - O(n)D(isk)S(tructure). Do wersji 2.5 silnik bazy danych może pracować z ODS poprzedniej wersji, ale silnik Firebird 3 działa tylko z własnym ODS (wersja 12.0).
Aby uaktualnić bazę danych z Firebird 2.5 do 3.0, konieczne jest wykonanie kopii zapasowej pliku bazy danych narzędziem gbak w wersji 2.5, a następnie przywrócenie jej w wersji 3.0.
Oczywiście baza danych musi być przygotowana do konwersji - metadane i zapytania należy sprawdzić pod kątem zgodności z Firebird 3.0, a po przywróceniu w Firebird 3 wszystkie obiekty z BLR (wyzwalacze, procedury składowane itp.) muszą zostać ponownie skompilowane.
Jeśli zastosujemy standardowe podejście, musimy wykonać kopię zapasową bazy danych w wersji 2.5, a następnie zainstalować Firebird 3 i przywrócić plik kopii zapasowej.
To jest w porządku, jeśli masz wystarczająco dużo czasu. Ale gdy Twoja baza danych jest duża, lub masz dziesiątki baz do migracji, a czas jest ograniczony, możesz użyć konwersji strumieniowej, która jest o 25-30% szybsza.
Pomysł polega na użyciu przenośnika:
gbak -b … db25 stdout | gbak -c … stdin db30
Gbak -b z wersji 2.5 zapisuje kopię zapasową sekwencyjnie i kieruje ją do strumienia stdout, który jest natychmiast odczytywany ze strumienia stdin przez gbak w wersji 3.0 i tworzy nową bazę danych.
Ten przenośnik wymaga użycia lokalnego dostępu do bazy danych (embedded), ponieważ transfer danych przez sieć (nawet przez localhost) znacznie spowolni proces.
Poniżej rozważymy, jak wykonać kopię zapasową strumieniową w systemie Windows i Linux.
Windows
Lepiej jest przygotować specjalny zestaw plików Firebird dla systemu Windows. Musimy pobrać archiwum embedded Firebird 2.5, zmienić nazwę fbembed.dll na fbclient.dll oraz dodać gbak.exe i opcjonalnie isql.exe.
Dla Firebird 3.0 użyjemy standardowego archiwum.
Minimalny zestaw (który nie wymaga środowiska uruchomieniowego VS2008/VS2010) zawiera następujące pliki:
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
Doświadczony administrator/programista może zauważyć, że pliki 25/intl/fbintl.dll i 25/intl/fbintl.conf nie są uwzględnione. To prawda, ponieważ gbak nie używa zestawu znaków dla połączenia i nie konwertuje danych między zestawami znaków. Jednak po stronie odbiorcy, Firebird 3.0, pliki icu* są potrzebne, ponieważ zestawy znaków są używane podczas tworzenia indeksów (ostatni etap kopii/przywracania).
Zaleca się dodanie do firebird.conf Firebird 3 dwóch linii:
MaxUnflushedWrites = -1
MaxUnflushedWriteTime = -1
Dobrze jest również ustawić różne nazwy parametru IpcName dla Firebird 2.5 i Firebird 3.0.
Inne parametry, jeśli chcesz, mogą być zmienione, biorąc pod uwagę, że podczas konwersji bazy danych Firebird 2.5 odczytuje dane, a Firebird 3 zapisuje dane i tworzy indeksy.
Aby przyspieszyć tworzenie indeksów, zalecamy zwiększenie parametru TempCacheLimit do około 40% dostępnej pamięci RAM (jeśli jest to dedykowany komputer lub serwer).
Na przykład, jeśli masz 16 GB RAM, możesz ustawić
TempCacheLimit=6G
Oczywiście ta wartość może być ustawiona tylko w przypadku korzystania z 64-bitowego Firebird 3, ponieważ każdy proces 32-bitowy nie może przydzielić więcej niż 2 gigabajty pamięci RAM.
Nie musisz zmieniać tego parametru dla wersji 2.5, ponieważ nie wpływa on na szybkość tworzenia kopii zapasowej, a sam Firebird 2.5 nie może użyć więcej niż 2 gigabajty pamięci RAM dla tego parametru, nawet w wersji 64-bitowej.
Przed rozpoczęciem sprawdź również, czy wartość „page buffers” wynosi 0 na stronie nagłówka bazy danych (gstat -h nazwabazy).
Jeśli parametr „page buffers” jest ustawiony w nagłówku bazy danych, zastępuje on ustawienia firebird.conf, a w przypadku dużej wartości może skutkować ogromnym zużyciem pamięci i pogorszeniem wydajności procesu konwersji.
Następnie skopiuj przygotowany zestaw plików do systemu docelowego.
Należy pamiętać, że przed konwersją należy zatrzymać regularną usługę Firebird 2.5.
Następnie uruchom wiersz polecenia z podniesionymi uprawnieniami (Uruchom jako administrator):
set ISC_USER=<podaj_właściciela_bazy_lub_sysdba>
set ISC_PASSWORD=hasło
"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
Tutaj pełna linia polecenia jest ujęta w cudzysłowy, symbol | służy do łączenia, a symbol ^ służy do escapowania znaku nowej linii (jest to przydatne w przypadku długich linii poleceń).
Opcja -st(atus) została wprowadzona w Firebird 2.5.8 i pozwala zapisywać więcej informacji o procesie tworzenia kopii zapasowej do pliku dziennika.
Linux
Firebird 3 zależy od biblioteki tommath w systemie Linux. Na CentOS (RHEL) biblioteka ta znajduje się w repozytorium EPEL, na Ubuntu (Debian) w repozytorium systemowym.
Na CentOS należy najpierw włączyć repozytorium EPEL, a dopiero potem uruchomić « yum install libtommath».
Na Ubuntu nie trzeba dołączać dodatkowych repozytoriów, ale Ubuntu 16 i Ubuntu 18 mają różne wersje pakietów - odpowiednio libtommath0 i libtommath1.
Firebird 3 szuka tommath.so.0, a dla Ubuntu 18 należy utworzyć dowiązanie symboliczne z tommath.so.0 do tommath.so.1. Aby to zrobić, najpierw musisz znaleźć tommath.so.1. Zwykła ścieżka na Ubuntu - /usr/lib/x86.64- linux -gnu/, ale może być inna w innych dystrybucjach opartych na Debianie.
Kolejnym problemem jest to, że do Firebird 3.0.1 włącznie nie było prostego sposobu na zainstalowanie dwóch różnych wersji serwera. Opcja „kompilacja ze źródeł z prefiksem” nie jest tutaj rozważana.
Firebird 3.0.2 zawiera poprawkę CORE‑5204: kompilacja z -enable-binreloc, (http://tracker.firebirdsql.org/browse/CORE-5204) oraz osobną opcję instalatora -path.
Tak więc, jeśli biblioteka tommath i, w razie potrzeby, dowiązanie symboliczne tommath.so.0 zostały zainstalowane, możesz zainstalować najnowszą dystrybucję Firebird 3.0.4 do /opt/fb3 za pomocą następującego polecenia: ./install.sh -path /opt/fb3
Następnie możesz zatrzymać istniejący Firebird 2.5 i uruchomić konwersję strumieniową.
Jeśli używasz Firebird 2.5 Classic, pamiętaj, że Classic zwykle jest uruchamiany przez xinetd - musisz więc wyłączyć usługę firebird dla xinetd lub całkowicie zatrzymać xinetd.
Nie musisz ustawiać parametrów MaxUnflushed* w firebird.conf Firebird 3 (ponieważ działają one tylko w systemie Windows) ani zmieniać czegokolwiek w Firebird 2.5.
Dostęp embedded w Firebird 2.5 w systemie Linux nie jest taki jak w Windows - Firebird 2.5 będzie działał wewnątrz procesu gbak (bez części sieciowej), ale prawa dostępu będą sprawdzane z bazą danych użytkowników, dlatego konieczne jest podanie nie tylko nazwy użytkownika właściciela bazy danych, ale także hasła:
export ISC_USER=nazwaużytkownika ISC_PASSWORD=hasło
/opt/firebird/bin/gbak -b … db25 stdout\
|/opt/fb3/bin/gbak -c … stdin db30
Po pomyślnej konwersji należy usunąć „tymczasową instancję” Firebird 3, następnie odinstalować oryginalny 2.5, a dopiero potem można przeprowadzić czystą instalację Firebird 3.
Lepiej jest zainstalować Firebird 3 z tar.gz, a nie z repozytoriów, ponieważ tar.gz instaluje wszystko w dogodnej lokalizacji /opt/ firebird , a także wersja Firebird w repozytoriach jest zwykle starsza niż w tar.gz.
Po zakończeniu konwersji i zainstalowaniu Firebird 3 należy sprawdzić, czy użytkownik „firebird” jest właścicielem pliku bazy danych.
Jeśli nie, należy to naprawić:
chown firebird.firebird nazwabazy
Podsumowanie
Konwersja strumieniowa jest szybsza niż standardowe podejście (gbak -b, następnie gbak -c), ponieważ pomija operacje „zapisu do kopii zapasowej” w środku - w rezultacie czas konwersji strumieniowej wynosi około „czasu tworzenia kopii zapasowej plus 10-15%” plus „czas tworzenia indeksów”.
W naszej praktyce konwersja strumieniowa jest co najmniej 25-30% szybsza niż tradycyjne „sekwencyjne” tworzenie kopii zapasowej i przywracanie.
Oprócz oszczędności czasu i zmniejszenia zapotrzebowania na wolne miejsce na dysku, konwersja strumieniowa ma jeszcze jedną zaletę - nie wymaga usuwania istniejącego Firebird 2.5, co pozwala szybko wrócić do wersji 2.5 w przypadku błędu podczas konwersji.
Kontakt
Prosimy o przesyłanie opinii i zapytań do zespołu wsparcia IBSurgeon.