Làm cách nào để lưu trữ 'n' ngày của nhật ký máy chủ web trong Sql Server?


18

Để báo cáo nhanh hơn và phân tích hiệu suất, chúng tôi muốn chèn nhật ký máy chủ web của chúng tôi vào Sql Server. Điều này sẽ cho phép chúng ta thấy các mẫu lưu lượng truy cập, các vấn đề, sự chậm lại trong thời gian gần.

Chúng tôi có một trình nền lắng nghe các sự kiện yêu cầu / phản hồi từ bộ cân bằng tải của chúng tôi và chèn số lượng lớn vào cơ sở dữ liệu.

Tuy nhiên, chúng tôi nhận được khoảng 1 GB nhật ký mỗi ngày và chúng tôi chỉ cần giữ khoảng một tuần (ít nhất là ở dạng thô này).

Cách tốt nhất để lưu trữ dữ liệu này và cách tốt nhất để xóa các mục cũ là gì?

Chúng ta đã nói về việc lưu trữ dữ liệu mỗi ngày trong bảng riêng của mình, ví dụ: Log_2011_04_07sẽ có tất cả các mục nhập cho ngày hôm đó, và sau đó bỏ bảng cũ nhất. Một khung nhìn có thể được tạo để trải rộng tất cả các bảng ngày để truy vấn dễ dàng. Là khả thi?


Đây là một câu hỏi rất giống nhau nhưng đối với Oracle; cú pháp sẽ obv khác nhau nhưng đây là một ứng dụng phân vùng cổ điển theo ngày. Không cần phải phát minh lại bánh xe :-)
Gaius

Câu trả lời:


17

Bạn nên nhìn vào phân vùng.

http://technet.microsoft.com/en-us/l Library / dd578580% 28Query.100% 29.aspx

Điều thú vị về phân vùng là bạn chỉ có một tên bảng (trái ngược với cách tiếp cận nhiều bảng) để các câu lệnh chèn của bạn vẫn tĩnh. Nó hoạt động với mọi ứng dụng - nó hoàn toàn minh bạch đối với các truy vấn. Bạn không phải lo lắng về những gì sẽ xảy ra nếu bạn kết thúc với các chỉ mục hoặc số liệu thống kê khác nhau trên mỗi bảng.

Bạn tạo một hàm phân vùng quyết định cách chia bảng thành nhiều bảng phía sau cảnh. Hàm chỉ có thể lấy một tham số / trường đầu vào và trong trường hợp của bạn, nó sẽ là trường ngày. Hàm có thể chia bảng theo ngày, tuần, tháng hoặc năm - trong trường hợp của bạn, bạn muốn có ngày, khoảng thời gian 24 giờ.

Sau đó, xây dựng một công việc SQL Server Agent sử dụng T-SQL để trao đổi phân vùng cuối cùng mỗi ngày. Việc xóa trở thành một hoạt động siêu dữ liệu và nó rất nhanh. Trao đổi phân vùng, sau đó thả cái cũ ra.


Tôi sẽ xem xét điều đó - nó có cho phép loại bỏ các phân vùng riêng lẻ không, vì vậy việc xóa có thể diễn ra nhanh chóng?
Jarrod Dixon

3
Có, bạn nên xem xét cụ thể khái niệm "Phân vùng cửa sổ trượt tự động". Một loạt các bài viết hay mà bạn có thể tìm thấy trên SQLServerCentral: part1 , part2part3 .
Mary

7

Chúng tôi đã phát triển một sản phẩm ghi nhật ký webstatistic 6 năm trước cho phép chúng tôi theo dõi mọi nhấp chuột của người dùng truy cập.

Những gì chúng tôi đã làm là ghi lại mỗi lần truy cập khi bạn viết và trình nền được lên lịch phân tích các bản ghi và chuẩn hóa dữ liệu để tìm kiếm thêm sau này. Ngay khi dữ liệu / bản ghi được phân tích cú pháp, nó đã bị xóa để giữ cấu trúc dữ liệu ở mức thấp.

Đối với phiên bản tiếp theo của sản phẩm, chúng tôi sẽ phân phối các bộ sưu tập hàng loạt riêng biệt trên các trang web và sau đó sử dụng trình nền để thu thập dữ liệu và dọn sạch sau đó bằng cách ra lệnh cho dịch vụ hàng loạt.

Bằng cách này, chúng tôi có thể xử lý "bảo trì theo lịch trình" mà không mất dữ liệu.

Liên quan đến vấn đề dọn dẹp trên máy chủ trung tâm, kế hoạch hiện tại của chúng tôi là thêm "dấu thời gian" để có thể lưu trữ dữ liệu sau ví dụ. 3 tháng.

Chúng tôi đã nghĩ rằng điều này giống như kết cấu MIP-MAP trong trò chơi / kết xuất 3D. Càng đến gần, dữ liệu càng chi tiết, càng xa, càng "nhóm" và ít chi tiết hơn.

Vì vậy, trên cơ sở hàng ngày, chúng tôi có thể quan sát các mẫu của khách truy cập, nhưng sau 3 tháng, những dữ liệu đó không thực sự phù hợp và chúng tôi nén dữ liệu thành ít chi tiết hơn.

Chúng tôi chưa quyết định liệu chúng tôi sẽ chia cơ sở dữ liệu thành nhiều phần để giữ nguyên "mức độ chi tiết". cơ sở dữ liệu. Nhưng chúng ta chỉ có thể, vì có một số vấn đề về tên nếu chúng ta lưu trữ các cấp độ khác nhau trong cùng một cơ sở dữ liệu.

Hy vọng bạn có thể sử dụng điều này cho một cái gì đó? Tôi không thể cung cấp cho bạn mã ví dụ như là một phần của sản phẩm của công ty chúng tôi.


1

Tạo một bảng khác Daily_tables với hai cột: Table_name và Date_table_created. Trong mã của bạn tạo bảng hàng ngày mới (tải nhật ký web), hãy thêm một mục khác để điền vào bảng Daily_tables với tên của bảng được tạo và dấu thời gian (thời gian ngày hiện tại). Tạo một công việc tác nhân SQL sẽ chạy tập lệnh TSQL mỗi tuần. TSQL nên loại bỏ tất cả các tên bảng (Table_name) khỏi Daily_tables với dấu thời gian Date_table_created cũ hơn 7 ngày.

Mong rằng đây là thứ bạn tìm kiếm :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.