Цю сторінку перекладено машинним перекладом. Читайте англійський оригінал. English

Бібліотека IBSurgeon

Як "роздути" базу даних Firebird тимчасовими BLOB-даними

Це одна зі статей типу «не робіть так» - лише як приклад. Якщо ви зіткнулися з аномальним зростанням вашої бази даних Firebird, перевірте, чи не написали ви збережену процедуру, тригер або execute block, які використовують конкатенацію BLOB.

У деяких випадках Firebird зберігає тимчасові BLOB всередині файлу бази даних, тому він зростає дуже швидко.

Цю проблему виправлено в HQbird, де тимчасові BLOB можна надсилати до тимчасової папки замість самої бази даних.

Наступний приклад демонструє проблему: він створює багато маленьких тимчасових BLOB, які зберігаються у файлі бази даних, тому вона «роздується» приблизно на 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