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!):
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