このページは機械翻訳されています。英語の原文をお読みください。 English

IBSurgeon ライブラリ

Firebird 2.5データベースのFirebird 3.0への高速変換

Basil Sidorov, 2019年4月2日, (c) IBSurgeon

Firebirdの各バージョンには独自のデータベース形式(ODS: On-Disk Structure)があります。バージョン2.5までは、データベースエンジンは以前のバージョンのODSで動作できますが、Firebird 3エンジンは独自のODS(バージョン12.0)でのみ動作します。

データベースをFirebird 2.5から3.0にアップグレードするには、2.5でgbakツールを使用してデータベースファイルをバックアップし、3.0でリストアする必要があります。

もちろん、データベースは変換に備えて準備する必要があります。メタデータとクエリがFirebird 3.0と互換性があるかチェックし、Firebird 3でリストアした後、BLRを持つすべてのオブジェクト(トリガー、ストアドプロシージャなど)を再コンパイルする必要があります。

標準的なアプローチを使用する場合、2.5でデータベースバックアップを作成し、Firebird 3をインストールしてバックアップファイルをリストアする必要があります。

時間に余裕があればこれで問題ありません。しかし、データベースが大きい場合や、移行するデータベースが数十個あり、時間に制限がある場合は、25〜30%高速なストリーム変換を使用できます。

アイデアはコンベアを使用することです:

gbak -b … db25 stdout | gbak -c … stdin db30

2.5のgbak -bはバックアップを順次書き込み、stdoutストリームに出力します。これは3.0のgbakによってstdinから即座に読み取られ、新しいデータベースを作成します。

このコンベアはローカルデータベースアクセス(組み込み)を使用する必要があります。ネットワーク転送(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 3のfirebird.confに次の2行を追加することをお勧めします:

Code
MaxUnflushedWrites = -1
MaxUnflushedWriteTime = -1

また、Firebird 2.5とFirebird 3.0でIpcNameパラメータに異なる名前を設定することも良いでしょう。

その他のパラメータは、データベース変換中にFirebird 2.5がデータを読み取り、Firebird 3がデータを書き込んでインデックスを作成することを考慮して、必要に応じて変更できます。

インデックス作成を高速化するには、TempCacheLimitパラメータを利用可能なRAMの約40%に増やすことをお勧めします(専用コンピュータまたはサーバーの場合)。

たとえば、16GBのRAMがある場合、次のように設定できます:

Code
TempCacheLimit=6G

もちろん、この値は64ビットのFirebird 3を使用する場合にのみ設定できます。32ビットプロセスは2ギガバイトを超えるRAMを割り当てることができないためです。

2.5ではこのパラメータを変更する必要はありません。バックアップ速度に影響せず、Firebird 2.5自体がこのパラメータに2ギガバイトを超えるRAMを使用できないためです(64ビット版でも同様)。

また、開始前に、データベースヘッダーページの「page buffers」値が0であることを確認してください(gstat -h databasename)。

「page buffers」パラメータがデータベースヘッダーに設定されている場合、firebird.confの設定を上書きし、大きな値の場合はメモリ消費が膨大になり、変換プロセスのパフォーマンスが低下する可能性があります。

次に、準備したファイルセットをターゲットシステムにコピーします。

変換前に、通常のFirebird 2.5サービスを停止する必要があることに注意してください。

次に、権限昇格(管理者として実行)でコマンドプロンプトを起動します:

Code
set ISC_USER=<データベースの所有者またはsysdbaを指定>
set ISC_PASSWORD=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

Linuxでは、Firebird 3はtommathライブラリに依存しています。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ベースのディストリビューションでは異なる場合があります。

もう1つの問題は、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で実行されることを覚えておいてください。したがって、xinetdのfirebirdサービスを無効にするか、xinetdを完全に停止する必要があります。

Firebird 3のfirebird.confでMaxUnflushed*パラメータを設定する必要はありません(Windowsでのみ機能するため)。Firebird 2.5で何かを変更する必要もありません。

LinuxでのFirebird 2.5の組み込みアクセスはWindowsとは異なります。Firebird 2.5はgbakプロセス内で動作します(ネットワーキング部分なし)が、アクセス権はユーザーデータベースでチェックされるため、データベース所有者のユーザー名だけでなくパスワードも指定する必要があります:

Code
export ISC_USER=username ISC_PASSWORD=password
/opt/firebird/bin/gbak -b … db25 stdout\
|/opt/fb3/bin/gbak -c … stdin db30

変換が成功したら、Firebird 3の「一時インスタンス」を削除し、元の2.5をアンインストールしてから、Firebird 3のクリーンインストールを実行できます。

リポジトリからではなくtar.gzからFirebird 3をインストールすることをお勧めします。tar.gzは便利な場所/opt/ firebird にすべてをインストールし、リポジトリのFirebirdバージョンは通常tar.gzよりも古いためです。

変換が完了しFirebird 3がインストールされたら、「firebird」ユーザーがデータベースファイルの所有者であることを確認する必要があります。

そうでない場合は、修正する必要があります:

Code
chown firebird.firebird databasename

まとめ

ストリーム変換は標準的なアプローチ(gbak -b、次にgbak -c)よりも高速です。中間の「バックアップへの書き込み」操作をスキップするためです。その結果、ストリーム変換時間は「バックアップ時間プラス10〜15%」プラス「インデックス作成時間」程度になります。

私たちの実践では、ストリーム変換は従来の「順次」バックアップとリストアよりも少なくとも25〜30%高速です。

時間の節約と空きディスク容量の削減に加えて、ストリーム変換にはもう1つの利点があります。既存のFirebird 2.5を削除する必要がないため、変換中にエラーが発生した場合に2.5に迅速に戻すことができます。

お問い合わせ

ご意見やお問い合わせは、IBSurgeon サポートチームまでお送りください。