Cách giảm dung lượng Log file của SQL Server

SQL Server

Nếu bạn đang sử dụng một web-hosting và dùng SQL Server làm cơ sở dữ liệu, bạn sẽ gặp vấn đề về dung lượng khi sử dụng một thời gian dài. SQL Server sẽ ghi file LOG với dung lượng rất lớn, nếu bạn không biết điều này thì dù bạn có nâng dung lượng web-hosting lên bao nhiêu đi nữa cũng không thể ngăn tình trạng này về sau.

Dữ liệu SQL Server có thể chỉ vài chục hoặc vài trăm MB nhưng file LOG có thể lên đến hàng chục GB, nó sẽ lưu bất kỳ transaction nào vào LOG kể cả khi đã commit.

Có nhiều cách để giải quyết vấn đề này:

- Detach DB => Xóa file LOG => Sau đó Attach lại DB: Tuy nhiên CSDL đòi hỏi tính sẵn sàng cao thì cách này không khả thi khi buộc phải dừng lại mọi hoạt động đến DB.

- Backup LOG với OpTION là TRUNCATE_ONLY hoặc NO_LOG: Với phiên bản SQL Server 2008 thì đã bỏ Option này.

- Cách tối ưu nhất:

Gả sử DB của bạn là AGT gồm 2 file:

+ File Data: AGT_Data.MDF

+ File Log: AGT_Log.LDF

Bạn chỉ cần chạy câu truy vấn sau:

USE AGT;
GO 
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE AGT
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 Mb.
DBCC SHRINKFILE (AGT_Log, 1);
GO
-- Reset the database recovery model.
ALTER DATABASE AGT
SET RECOVERY FULL;
GO

Giải thích câu truy vấn:

- Có 3 chế độ Recovery trong SQL Server: FULL, BULK LOGGED và SIMPLE. Chế độ mặc định là FULL. Bạn có thể click chuột phải vào Database rồi chọn Properties, sau đó vào phần Option của database, xem trong Recovery Model. Khi ở chế độ FULL thì bất kì một transaction nào, kể cả khi đã commit cũng đều được lưu trong LOG, do đó có thể dựa vào những Transaction này để “quay lui (rollback)” DB về bất kì thời điểm nào. Vì thế với những DB có Transaction nhiều, DATA ít thì file LOG vẫn có thể rất lớn.

ALTER DATABASE AGT
SET RECOVERY SIMPLE;

- Câu truy vấn đầu tiên: SET RECOVERY của DB về SIMPLE, ở chế độ này sau khi Transaction được COMMIT, sẽ tự động xóa. Do vậy File LOG của database ở chế độ này thường rất nhỏ.

DBCC SHRINKFILE (AGT_Log, 1);

- Câu truy vấn thứ 2: Dùng DBCC SHRINKFILE để SHRINK file log xuống còn 1 Mb. Nếu không set Recovery về SIMPLE, thì sẽ không thể xóa bỏ hết các Transaction đã được COMMIT. SHRINKFILE chỉ thu dọn và sắp xếp và phân bố lại dữ liệu, bỏ các vùng trống để giải phóng bộ nhớ, chứ không phải xóa dữ liệu. Vì thế ở chế độ FULL, SHRINKFILE hầu như không tác dụng, hoặc nếu có thì file LOG dung lượng giảm đi không đáng kể.

ALTER DATABASE AGT
SET RECOVERY FULL;

- Câu truy vấn cuối: SET RECOVERY về lại FULL. Trên MSDN cũng khuyên nếu muốn Backup LOG, các bạn nên chuyển về chế độ SIMPLE, hơn là backup LOG với Truncate_OnlyNo_LOG.

Chú ý: Đối với những DB có dung lượng lớn bạn nên backup database trước và hỏi ý kiến bên nhà cung cấp web-hosting trước khi thực hiện vì LOG file rất cần thiết để khôi phục dữ liệu khi gặp vấn đề.