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

IBSurgeon ライブラリ

Firebirdデータベースを一時的なBLOBで「膨らませる」方法

これは「やってはいけない」系の記事の一つです - あくまで例として挙げています。Firebirdデータベースの異常な増大に遭遇した場合、BLOBの連結を使用するストアドプロシージャ、トリガー、またはexecute blockを書いていないか確認してください。

場合によっては、Firebirdは一時BLOBをデータベースファイル内に保存するため、データベースが非常に急速に増大します。

_この問題はHQbirdで修正されており、一時BLOBをデータベース自体ではなく一時フォルダに送信できます。 _

以下の例はこの問題を示しています。多数の小さな一時BLOBを作成し、それらがデータベースファイルに保存されるため、Firebirdデータベースが約2GB「膨張」します(本番環境や重要なデータベースでは実行しないよう注意してください!):

Code
execute block
returns (
    BLB blob)
as
declare BLB1 blob;
declare I integer;
begin
  I = 0;
  BLB = 'blabla';
  BLB1 = cast('blablablablablablablablablablablablablabla' as blob);
  while (I < 10000) do
  begin
    BLB = BLB || BLB1;
    I = I + 1;
  end
  suspend;
end

Firebirdはトランザクションのコミット(またはロールバック)まで一時BLOBを保持します。トランザクションをコミットしてからコードをもう一度実行すると、データベースファイルが増大しないことに気づくでしょう。これは、データベース内の一時BLOB用の領域が再利用されるためです。

Firebird Friday JokesはTelegramチャンネルでフォローしてください:https://t.me/firebirdsql