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 đề.

ReportViewer - object datasource, nested objects return #Error

Nếu bạn đang sử dụng Visual Studio 2012 và Trình xem báo cáo, bạn có thể đã gặp sự cố với việc sử dụng Thuộc tính lồng nhau trên báo cáo với các trường trả về lỗi #Error.

Cách khắc phục:
Bạn phải đảm bảo tất cả các lớp được tham chiếu trong báo cáo đều có thuộc tính [Serializable] cho MỌI thuộc tính, và phải được khai báo các lớp dạng Public.

để sử dụng các thuộc tính lồng vào nhau trên báo cáo,  cần điền vào biểu thức sao:
=Fields!SanPham.Value.DonViTinh.Ten

Biểu thức này thêm một trường vào báo cáo là ba thuộc tính nằm sâu trong đối tượng mà báo cáo ràng buộc.

Nguồn dữ liệu báo cáo liên kết với lớp Sản Phẩm, lớp Sản Phẩm chứa thuộc tính Đơn Vị Tính, lớp Đơn Vị Tính có chứa thuộc tính Tên.

Các lớp Sản Phẩm, Đơn Vị Tính, Tên phải được sắp xếp theo thứ tự và phải có thuộc tính [Serializable].
Vd: lớp Sản Phẩm

Lớp Đơn Vị Tính

Và kết quả sẽ được :