Wie speichere ich "n" Tage an Webserver-Protokollen in Sql Server?

18

Zur schnelleren Berichterstellung und Leistungsanalyse möchten wir unsere Webserver-Protokolle in Sql Server einfügen. Auf diese Weise können wir Verkehrsmuster, Probleme und Verlangsamungen nahezu in Echtzeit erkennen.

Wir haben einen Daemon, der auf Anforderungs- / Antwortereignisse von unserem Load Balancer und Masseneinfügungen in die Datenbank wartet.

Wir erhalten jedoch ungefähr 1 GB Protokolle pro Tag und brauchen nur ungefähr eine Woche (zumindest in dieser Rohform).

Wie können diese Daten am besten gespeichert und alte Einträge am besten gelöscht werden?

Wir haben darüber gesprochen, die Daten jedes Tages in einer eigenen Tabelle zu speichern, z. B. Log_2011_04_07alle Einträge für diesen Tag zu haben und dann die älteste Tabelle zu löschen. Es könnte eine Ansicht erstellt werden, die alle Tagestabellen umfasst, um die Abfrage zu vereinfachen. Ist das machbar?

Jarrod Dixon
quelle
Dies ist eine sehr ähnliche Frage, aber für Oracle; Die Syntax unterscheidet sich zwar, dies ist jedoch eine klassische Anwendung für die Partitionierung nach Datum. Das Rad muss nicht neu erfunden werden :-)
Gaius

Antworten:

17

Sie sollten sich mit Partitionierung befassen.

http://technet.microsoft.com/en-us/library/dd578580%28SQL.100%29.aspx

Das Coole an der Partitionierung ist, dass Sie nur einen Tabellennamen haben (im Gegensatz zum Ansatz mit mehreren Tabellen), sodass Ihre Einfügeanweisungen statisch bleiben. Es funktioniert mit jeder Anwendung - es ist für Abfragen völlig transparent. Sie müssen sich keine Gedanken darüber machen, was passiert, wenn Sie unterschiedliche Indizes oder Statistiken für jede der Tabellen erhalten.

Sie erstellen eine Partitionsfunktion, die entscheidet, wie die Tabelle im Hintergrund in mehrere Tabellen aufgeteilt wird. Die Funktion kann nur einen Eingabeparameter / ein Eingabefeld annehmen, und in Ihrem Fall wäre es ein Datumsfeld. Die Funktion kann die Tabelle nach Datum, Woche, Monat oder Jahr aufteilen - in Ihrem Fall möchten Sie ein Datum innerhalb von 24 Stunden.

Erstellen Sie dann einen SQL Server-Agent-Job, der T-SQL verwendet, um die letzte Partition jeden Tag auszutauschen. Der Löschvorgang wird zu einer Metadatenoperation und ist blitzschnell. Tauschen Sie die Partition aus und lassen Sie die alte herausfallen.

SQLRockstar
quelle
Ich werde das untersuchen. Ermöglicht es das Löschen einzelner Partitionen, sodass das Löschen schnell gehen kann?
Jarrod Dixon
3
Ja, Sie sollten sich speziell mit dem Konzept "Automatische Schiebefensteraufteilung" befassen. Eine schöne Artikelserie finden Sie auf SQLServerCentral: Teil1 , Teil2 und Teil3 .
Marian
7

Wir haben vor 6 Jahren ein Webstatistik-Protokollierungsprodukt entwickelt, mit dem wir jeden Klick eines Besuchs eines Benutzers verfolgen können.

Was wir getan haben, war, jeden Besuch aufzuzeichnen, wie Sie geschrieben haben, und den geplanten Daemon die Protokolle analysieren zu lassen und die Daten für eine spätere weitere Suche zu normalisieren. Sobald der Datensatz analysiert wurde, wurde er entfernt, um die Datenstruktur niedrig zu halten.

Für unsere nächste Version des Produkts werden wir die Bulksammler separat auf den Websites verteilen und dann den Dämon verwenden, um die Daten zu sammeln und anschließend zu bereinigen, indem wir Befehle an den Bulkservice senden.

Auf diese Weise können wir eine "geplante Wartung" durchführen, ohne Daten zu verlieren.

In Bezug auf das Bereinigungsproblem auf dem Center-Server ist unser aktueller Plan, "Zeitstempel" hinzuzufügen, um Daten nach z. 3 Monate.

Wir haben dies genauso gedacht wie MIP-MAP-Texturen in 3D-Spielen / Rendering. Je näher Sie kommen, desto detaillierter die Daten, desto weiter entfernt, desto "gruppierter" und weniger detailliert.

Von Tag zu Tag können wir also Besuchermuster beobachten, aber nach 3 Monaten sind diese Daten nicht mehr wirklich relevant und wir komprimieren die Daten in weniger Details.

Wir haben nicht entschieden, ob wir die Datenbank in Blöcke aufteilen wollen, um die "Detailebene" des PR zu erhalten. Datenbank. Dies ist jedoch möglich, da es einige Probleme bei der Benennung gibt, wenn wir verschiedene Ebenen in derselben Datenbank speichern.

Hoffe, Sie können dies für etwas verwenden? Ich kann Ihnen keinen Beispielcode als Teil des Produkts unseres Unternehmens zur Verfügung stellen.

BerggreenDK
quelle
1

Erstellen Sie eine weitere Tabelle Daily_tables mit zwei Spalten: Table_name und Date_table_created. Fügen Sie in Ihrem Code, der eine neue tägliche Tabelle erstellt (die die Webprotokolle lädt), einen weiteren Eintrag hinzu, um die Tabelle Daily_tables mit dem Namen der erstellten Tabelle und dem Zeitstempel (aktuelles Datum und Uhrzeit) zu füllen. Erstellen Sie einen SQL-Agent-Job, der jede Woche ein TSQL-Skript ausführt. Die TSQL sollte alle Tabellennamen (Tabellenname) aus den Daily_tables mit einem Date_table_created-Zeitstempel löschen, der älter als 7 Tage ist.

Hoffe das ist was du gesucht hast :)

StanleyJohns
quelle