Tato stránka byla strojově přeložena. Přečtěte si anglický originál. English

Knihovna IBSurgeon

Jak "nafouknout" databázi Firebird dočasnými bloby

Toto je jeden z článků typu „toto nedělejte“ - pouze jako příklad. Pokud narazíte na abnormální růst vaší databáze Firebird, zkontrolujte, zda jste nenapsali uloženou proceduru, trigger nebo execute block, který používá zřetězení BLOBů.

V některých případech Firebird ukládá dočasné BLOBy přímo do souboru databáze, takže ten roste velmi, velmi rychle.

Tento problém je vyřešen v HQbird, kde lze dočasné BLOBy posílat do dočasné složky místo do samotné databáze.

Následující příklad demonstruje problém: vytváří mnoho malých dočasných blobů, které jsou uloženy v souboru databáze, takže „nafouknou“ databázi Firebird o ~2 GB (Buďte opatrní a nespouštějte to na produkčních nebo důležitých databázích!):

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 uchovává dočasné BLOBy až do commitu (nebo rollbacku) transakce. Pokud transakci potvrdíte a poté kód spustíte znovu, zjistíte, že soubor databáze neporoste - je to způsobeno tím, že místo pro dočasné BLOBy uvnitř databáze je znovu použito.

Sledujte Firebird Friday Jokes na našem Telegram kanálu: https://t.me/firebirdsql