Эта страница переведена машинным переводом. Читайте английский оригинал. English

Библиотека IBSurgeon

Как «раздуть» базу данных Firebird временными BLOB-полями

Это одна из статей из серии «так делать нельзя» - просто как пример. Если вы столкнулись с аномальным ростом вашей базы данных Firebird, проверьте, не написали ли вы хранимую процедуру, триггер или execute block, в которых используется конкатенация BLOB-полей.

В некоторых случаях Firebird хранит временные BLOB-объекты внутри файла базы данных, поэтому он растёт очень и очень быстро.

Эта проблема исправлена в HQbird, где временные BLOB-объекты могут отправляться во временную папку вместо самой базы данных.

Следующий пример демонстрирует проблему: он создаёт множество маленьких временных BLOB-объектов, которые хранятся в файле базы данных, из-за чего база данных Firebird «раздувается» примерно на 2 ГБ (Будьте осторожны и не запускайте это на рабочей или важной базе данных!):

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-объекты до фиксации (commit) или отката (rollback) транзакции. Если вы зафиксируете транзакцию и затем запустите код ещё раз, вы заметите, что файл базы данных больше не растёт - это связано с тем, что место для временных BLOB-объектов внутри базы данных используется повторно.

Следите за Firebird Friday Jokes в нашем Telegram-канале: https://t.me/firebirdsql