FirebirdSQL: 内部ファイル、一時ファイル、および環境変数
_by Vasily Sidorov, Sep 2, 2022, IBSurgeon
経験豊富なFirebird DBAは、Firebirdが内部ファイルや一時ファイルを保存するためにかなり大量のディスク容量を必要とすることを知っています。本番システムの一時ファイルに推奨されるディスク容量は30〜40GBですが、高負荷システムではそれ以上になることもあります。
この記事では、Firebirdの内部ファイルと一時ファイルの種類について説明し、設定パラメータやOSの環境変数を通じてそれらがどのように保存・管理されるかについても考察します。この記事は、Firebirdのインストールと設定の習得に特化した記事と資料のシリーズを継続するものです。
Firebirdコア開発者からの重要な注意事項:
絶対に、絶対に、絶対にFIREBIRD_LOCK環境変数を設定・変更しないでください - 自分が何をしているかを非常に良く理解している場合を除きます。
IBSurgeonチームからの明示的な提案:
FIREBIRD_LOCKを変更しないでください。
他の一時ファイルについては - こちらを参照してください。
Firebirdの内部ファイル
内部ファイルとは、Firebirdが内部操作を実行するために使用するファイルです。これらのファイルは、ユーザーやサードパーティ製ソフトウェアによって変更されたり触られたりしてはいけません。以下の情報は参考用です。
内部ファイルの一般的な命名パターン
Firebirdの内部使用では接頭辞fbNN_が使用され、NNは以下のいずれかになります:
- 主要なODS(オンディスク構造)番号(Firebird 3.0ではODS 12、Firebird 4.0ではODS 13)、つまりファイルはfb13で始まります。
- NNは短縮版のバージョン番号の場合もあります - 例えば、ファイルはfb50で始まることがあります。
また、一時ファイルにも使用される接頭辞fb_もあります。
Firebirdの内部ファイルの種類
Firebirdには以下の主要な内部ファイルの種類があります:
- fb_lock_ ロックファイル - Firebirdロックマネージャーが使用するファイル
- fbNN_monitor_ モニタリングテーブルのデータを含むファイル
- fbNN_trace_ トレースセッションのデータを含むファイル
- fb_event_ イベントの保存バッファを含むファイル
- fb_user_mapping ユーザーマッピングデータを含むファイル
- トレースセッションの内部データを含むファイル
- フラグファイル(サイズゼロ)
- fb_repl_ レプリケーションファイル
Firebirdの内部ファイルについて詳しく見ていきましょう。
ロックファイル
ロックファイルには接頭辞fb_lock_が付いています。これらはFirebirdのロックマネージャーがFirebirdデータベース内のオブジェクトへのアクセスを同期し、Firebirdインスタンス間で同期するために使用されます。
ロックファイルはデータベースファイルのオープン時に作成され、クローズ時に削除されます。
デフォルトでは、データベースファイルは最後の接続が切断されたときにクローズされます。Firebird 3.0以降では、LINGERオプションを使用して、最後の接続の切断後もFirebirdでデータベースファイルを開いたままにすることが可能です。
ロックファイルの初期サイズはfirebird.confのLockMemSizeパラメータで設定されます。動作サイズはアーキテクチャによって異なります:SuperServerはClassicやSuperClassicよりもロックファイルを集中的に使用しません。典型的なロックテーブルサイズは約30〜50MBですが、Classic/SuperClassicで数千の接続があるサーバーの場合、ロックファイルのサイズは2GBまで成長することがあります。2GBはバニラFirebirdにおけるロックファイルの実装上の制限です。
モニタリングテーブルのデータを含むファイル
バージョン2.1以降、Firebirdにはモニタリングテーブルがあります。これらのテーブルはデータベース内に保存されず、モニタリングデータは要求に応じて収集され、fbNN_monitor_という名前パターンの内部ファイルに保持されます。
モニタリングテーブルのデータを含むファイルのサイズは、接続数とそのアクティビティ(トランザクション、ステートメント、ストアドプロシージャなど)によって異なります。また、fb_NN_monitor_ファイルの数とサイズは、異なる接続からのモニタリングテーブルへのリクエスト数に依存します(これは、MON$テーブルをモニタリング以外のタスクに使用すべきではない理由の1つです)。
トレースセッションのデータを含むファイル
ファイル名パターンfbNN_trace_は、アクティブなトレースセッションファイルへのリンクを保持します。fb_trace_という名前パターンのファイルには、トレースセッションに関する情報が含まれています。これはトレースデータのバッファのようなものです。fb_traceファイルの最大サイズはfirebird.confのMaxUserTraceLogSizeパラメータによって制限されます。このバッファがオーバーフィルされると、トレースは自動的に一時停止されます。
イベントバッファ用ファイル
fb_event_という名前パターンのファイルは、Firebirdがクライアントアプリケーションに配信されていないイベントを保存するバッファです。
ユーザーマッピングデータを含むファイル
fb_user_mappingファイルは、Firebirdインスタンス内のユーザーマッピングをキャッシュするために使用されます。
フラグファイル
POSIXでは、Firebirdはサイズゼロのフラグファイル - fb_guard、fb_init、fb_port_NUMBERを使用します。これらのファイルはFirebirdの起動時に使用されます。
レプリケーションファイル
Firebird 4およびHQbirdでは、fb_repl_ファイルにレプリケーションプロセスの内部データが含まれています。
内部ファイルの場所
デフォルトでは、すべてのFirebird内部ファイルは同じフォルダに保存されます:WindowsではC:\ProgramData\firebird、Linuxでは/tmp/firebirdです。フォルダには十分な権限が必要であることに注意してください。Firebirdインスタンスがそこでファイルを作成して作業できるようにする必要があります!
FIREBIRD_LOCK環境変数を定義することで、Firebird内部ファイルのあるフォルダの場所を変更することは可能ですが、お勧めしません。
注意:データベースの破損を避けるために、同じデータベースファイルを開くすべてのFirebirdプロセスは、同じFIREBIRD_LOCKで動作する必要があります。この変数を作成せず、デフォルトの場所を使用してください。
内部ファイルのサイズ
実際には、Firebird内部ファイルの合計サイズは約100〜200MBで、最大で2GBまで知られています。
Firebirdの一時ファイル
一時ファイルは、ユーザーの操作(例えばDISTINCTを含むクエリ)の結果として発生する一時データを保存するためにFirebirdエンジンによって作成されます。高負荷の本番システムでは一時ファイルが非常に大きくなることがあるため、経験豊富なDBAは一時ファイルの種類を認識し、必要に応じてFirebird設定を調整したり、一時ファイルを保存するためのディスク容量を割り当てたりできることが必要です。
Firebirdの一時ファイルの場所
Firebirdは、環境変数FIREBIRD_TMP、TEMP、TMP(この順序で)で指定されたフォルダに一時ファイルを作成します。そのような変数がない場合、一時ファイルはWindowsではC:\Temp、Linuxでは/tmpに作成されます。
実際には、WindowsではFirebirdの一時ファイルをC:\Windows\Temp(環境変数TEMPに対応)で確認でき、Linuxでは/tmpで確認できます。
Firebirdの一時ファイルの種類
以下の一時ファイルがあります(すべて接頭辞fb_を使用):
- fb_table_ テーブルオブジェクト(一時テーブルを含みますがこれに限定されません)
- fb_blob_ BLOBおよび自律型トランザクション
- fb_undo_ アンドゥデータ
- fb_recbuf_ アクティブなクエリ、仮想テーブルなどの中間データを保持するために使用
- fb_merge_ ハッシュ結合のデータ
- fb_sort_ ソート(DISTINCT/ORDER BY/GROUP BYを含むクエリ、およびインデックスの作成/再作成用)
- fb_tpc_ fb_tpc_データ - v4以降、関連するコミット番号を持つすべての既知のトランザクションのリスト
- fb_snap_ データ - v4以降、すべてのアクティブなデータベーススナップショットのリスト
一時ファイルの場所を変更するには?
Firebird 4より前のバージョンでは、Firebird設定パラメータTempDirectoriesを使用して、タイプ4〜8の一時ファイルを保存する特定のフォルダを定義することが可能です。
Firebird 4以降では、新しいconfパラメータTempTableDirectoryを使用して、タイプ1〜3の一時テーブルを保存するフォルダを指定できます。これはfirebird.confとdatabases.confで設定できます。
Firebirdの環境変数
Firebirdは、以下のOS環境変数を使用できます(定義されている場合):
- FIREBIRD Firebird設定ファイルのあるフォルダ
- FIREBIRD_LOCK 内部ファイルのあるフォルダ
- FIREBIRD_MSG メッセージファイル(firebird.msg)のあるフォルダ
- FIREBIRD_TMP 一時ファイル用フォルダ
実際には、一時ファイルを特定の非デフォルトの場所に保存する大きな理由がある場合、FIREBIRD_TMPが意味を持つ唯一の変数です。
FIREBIRD_TMPのパスが無効な場合(存在しない、または十分な権限がない)、Firebirdが動作できなくなる重大なエラーが発生することに注意してください。
Firebirdコア開発者からの重要な通知:
決して、決して、絶対に FIREBIRD_LOCK 環境変数を設定・変更しないでください - 自分が何をしているのかを非常によく理解している場合を除きます。
IBSurgeonチームからの明示的な提案:
FIREBIRD_LOCK を変更しないでください。この情報は参考用のみです。
その他の一時ファイルについては - こちらを参照。
まとめの代わりに:よくある質問への回答
多くのDBAが質問します - Firebirdの内部ファイルや一時ファイルを保存するためにRAMドライブやtmpfsを使用すべきでしょうか?
簡単な答えは:いいえ、Firebirdの設定を調整する方が良いです。メモリが十分にある場合は、DefaultDBCachePagesの値を増やし(SuperServerのみ)、TempCacheLimitを増やすことができます(バージョン3以降のFirebirdではTempCacheLimitを2Gb以上に設定できます)。
どの値を使用すべきか不明な場合は、Firebird Configuration Calculator を使用してください。特定のハードウェア/VMパラメータに対して最適で安全な設定を作成します。
より詳しい答え:Firebirdは一時ファイルと内部ファイルの大部分をメモリに保持するように設計されていますが、実際には一時オブジェクトが非常に大きくなる状況があるため、ディスクに保存するメカニズムも備えています。FirebirdはOSのメカニズム(mmap、ファイルシステムキャッシュ、一時ファイルなど)を効果的に使用して、可能かつ合理的な場合に一時ファイルと内部ファイルをメモリにキャッシュします。Firebirdのチューニングは、まずFirebirdの設定を通じて行い、その後OS(一時ファイルの場所の設定、ファイルキャッシュチューニングの各種オプションなど)で行うべきです。
関連リンク
ビデオ:
メモリ使用量のチューニングに関するプレゼンテーション
ご質問やフィードバックがございましたら、お気軽に [email protected] までお送りください。