Hoe een Firebird-database met tijdelijke blobs "opblazen"
Dit is een van de “doe-dit-niet”-artikelen - slechts als voorbeeld. Als u een abnormale groei van uw Firebird-database tegenkomt, controleer dan of u geen opgeslagen procedure, trigger of execute block hebt geschreven die gebruikmaakt van BLOB-concatenatie.
In sommige gevallen slaat Firebird tijdelijke BLOBs op in het databasebestand, waardoor het zeer snel groeit.
Dit probleem is opgelost in HQbird, waar tijdelijke BLOBs naar een tijdelijke map kunnen worden gestuurd in plaats van naar de database zelf.
Het volgende voorbeeld demonstreert het probleem: het creëert veel kleine tijdelijke blobs, die in het databasebestand worden opgeslagen, waardoor de Firebird-database met ~2Gb wordt “opgeblazen” (Wees voorzichtig en voer dit niet uit op productie- of belangrijke databases!):
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 bewaart tijdelijke blobs tot de commit (of rollback) van de transactie. Als u de transactie commit en de code vervolgens opnieuw uitvoert, zult u merken dat het databasebestand niet groeit - dit komt doordat de ruimte voor tijdelijke BLOBs in de database opnieuw wordt gebruikt.
Volg Firebird Friday Jokes op ons Telegram-kanaal: https://t.me/firebirdsql