Hướng dẫn Shrink Log để giảm bớt dung lượng file log Database MSSQL

Nguyễn Thành Luân 4 phút đọc

Vào một ngày đẹp trời, bổng dưng bạn nhận thấy website của mình ngưng hoạt động (hoặc báo lỗi), sau một hồi kiểm tra hoặc liên hệ với nhà cung cấp Hosting thì được biết dung lượng Cloud Hosting/ Cloud Server đã bị đầy mà trong đó Database chiếm dung lượng đáng kể gây gián đoạn website.

Hay bạn tự nhận thấy Database của mình đã tăng dung lượng, trong khi dữ liệu của mình chỉ có vài MB (hoặc vài GB) nhưng LOG File lại chiếm đến tận hàng trăm GB. Vậy bạn phải làm sao để giải quyết vấn đề này?

Có rất nhiều cách để xử lý giảm dung lượng LOG của Database:

1. Detach DB, xóa file LOG, sau đó Attach lại Database. Với cách này bạn phải thực hiện thủ công và buộc phải gián đoạn các kết nối từ các ứng dụng đến Database của bạn, sẽ không khả thi nếu ứng dụng của bạn đòi hỏi tính liên tục.

2. Backup LOG với OPTION là TRUNCATE_ONLY hoặc NO_LOG. Tuy nhiên từ phiên bản SQL Server 2008 thì Option này đã lược bỏ.

3. Chúng tôi khuyến nghị bạn thực hiện theo cách sau đây, vừa thực hiện nhanh chóng, dễ dàng lại vừa đáp ứng được nhu cầu liên tục của ứng dụng. Đó là, SHRINK FILE.

Giả sử, bạn đang có các file database: MB_Data.MDF và file Log: MB_Log.LDF, bạn có thể Run đoạn query sau đây từ SQL Management Studio hoặc có thể tạo sẵn và Run 1 Stored Procedure.

USE MB;

GO

ALTER DATABASE MB SET RECOVERY SIMPLE;

GO

DBCC SHRINKFILE (MB_Log, 1);

GO

ALTER DATABASE MB SET RECOVERY FULL;

GO

Bạn có thể hiểu phương pháp này theo cách giải thích sau :

Có 3 chế độ Recovery trong SQL Server: FULL, SIMPLEBULK LOGGED. Chế độ mặc định là FULL. Bạn có thể vào phần Option của database, xem trong Recovery Model. Khi ở chế độ này, 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.

Đầ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ỏ.

Dùng DBCC SHRINKFILE để SHRINK file log xuống còn 1 Mb. Nếu không set Recovery về SIMPLE, thì sẽ ko 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ư ko tác dụng, hoặc nếu có thì file LOG dung lượng giảm đi ko đáng kể.

Sau đó 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_Only và No_LOG.

Chú ý: Với những database dung lượng lớn, bạn cần phải chủ động backup database trước và tham khảo ý kiến của lập trình website trước khi thực hiện.