Esta página foi traduzida por máquina. Leia o original em inglês. English

Biblioteca IBSurgeon

Como "inflar" um banco de dados Firebird com blobs temporários

Este é um daqueles artigos do tipo “não faça isso” - apenas como exemplo. Se você encontrar um crescimento anormal do seu banco de dados Firebird, verifique se você não escreveu uma stored procedure, trigger ou execute block que usa concatenação de BLOBs.

Em alguns casos, o Firebird armazena BLOBs temporários dentro do arquivo do banco de dados, então ele cresce muito, muito rapidamente.

Este problema é corrigido no HQbird, onde BLOBs temporários podem ser enviados para uma pasta temporária em vez do próprio banco de dados.

O exemplo a seguir demonstra o problema: ele cria muitos BLOBs temporários pequenos, que são armazenados no arquivo do banco de dados, então isso “inflará” o banco de dados Firebird em ~2Gb (Tenha cuidado e não execute isso em bancos de dados de produção ou importantes!) :

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

O Firebird mantém os BLOBs temporários até o commit (ou rollback) da transação. Se você fizer o commit da transação e executar o código novamente, notará que o arquivo do banco de dados não crescerá - isso se deve ao fato de que o espaço para BLOBs temporários dentro do banco de dados é reutilizado.

Siga as piadas de sexta-feira do Firebird no nosso canal do Telegram: https://t.me/firebirdsql