Trang này được dịch bằng máy. Đọc bản gốc tiếng Anh. English

Thư viện IBSurgeon

Làm thế nào để "làm phình" cơ sở dữ liệu Firebird bằng các blob tạm thời

Đây là một trong những bài viết kiểu “đừng làm điều này” - chỉ để làm ví dụ. Nếu bạn gặp phải tình trạng tăng trưởng bất thường của cơ sở dữ liệu Firebird, hãy kiểm tra xem bạn có viết stored procedure, trigger hoặc execute block nào sử dụng phép nối BLOB hay không.

Trong một số trường hợp, Firebird lưu trữ các BLOB tạm thời bên trong tệp cơ sở dữ liệu, vì vậy nó tăng lên rất rất nhanh.

Vấn đề này đã được khắc phục trong HQbird, nơi các BLOB tạm thời có thể được gửi đến thư mục tạm thay vì chính cơ sở dữ liệu.

Ví dụ sau đây minh họa vấn đề: nó tạo ra rất nhiều BLOB tạm thời nhỏ, được lưu trữ trong tệp cơ sở dữ liệu, do đó nó sẽ “làm phồng” cơ sở dữ liệu Firebird lên khoảng 2Gb (Hãy cẩn thận và đừng chạy nó trên cơ sở dữ liệu sản xuất hoặc quan trọng!):

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 giữ các BLOB tạm thời cho đến khi commit (hoặc rollback) giao dịch. Nếu bạn commit giao dịch và sau đó chạy mã một lần nữa, bạn sẽ nhận thấy rằng tệp cơ sở dữ liệu sẽ không tăng lên - điều này là do không gian cho các BLOB tạm thời bên trong cơ sở dữ liệu được tái sử dụng.

Theo dõi Firebird Friday Jokes trên kênh Telegram của chúng tôi: https://t.me/firebirdsql