Frage

Für eine schnellere Berichterstattung und Leistungsanalyse möchten wir unsere Webserver -Protokolle in SQL Server einfügen. Auf diese Weise können wir Verkehrsmuster, Probleme und Verlangsamungen in nahezu Echtzeit sehen.

Wir haben einen Daemon, der auf Anfrage-/Antwortereignisse von unseren Lastauslagerungen und Bulk -Einfügen in die Datenbank hört.

Wir erhalten jedoch ungefähr 1 GB Protokolle pro Tag und müssen nur etwa eine Woche in der Nähe halten (zumindest in dieser rohen Form).

Was ist der beste Weg, um diese Daten zu speichern und die beste Möglichkeit, alte Einträge zu löschen?

Wir haben darüber gesprochen, die Daten jedes Tages in seiner eigenen Tabelle zu speichern, z. B. Log_2011_04_07 hätte alle Einträge für diesen Tag und dann den ältesten Tisch fallen. Es könnte eine Ansicht erstellt werden, um alle Tagestische für einfache Abfragen zu überspannen. Ist das machbare?

War es hilfreich?

Lösung

Sie sollten in die Partitionierung suchen.

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 mehrfachen Tabellenansatz), sodass Ihre Einfügungsanweisungen statisch bleiben. Es funktioniert mit jeder Anwendung - es ist für Fragen völlig transparent. Sie müssen sich keine Sorgen darüber machen, was passiert, wenn Sie auch unterschiedliche Indizes oder Statistiken in den einzelnen Tabellen haben.

Sie erstellen eine Partitionsfunktion, die entscheidet, wie Sie den Tisch in mehrere Tische hinter der Szene zerlegen. Die Funktion kann nur einen Eingangsparameter/ein Eingabe -Feld aufnehmen, und in Ihrem Fall wäre es ein Datumsfeld. Die Funktion kann die Tabelle nach Datum, Woche, Monat oder Jahr aufbrechen - in Ihrem Fall möchten Sie Datum, 24 -Stunden -Zeitraum.

Erstellen Sie dann einen SQL Server Agent-Job, der T-SQL verwendet, um die letzte Partition jeden Tag auszutauschen. Das Löschen wird zu einer Metadatenoperation und leuchtet schnell. Tauschen Sie die Partition aus und lassen Sie dann den alten aus.

Andere Tipps

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

Was wir gemacht haben, war, jeden Besuch aufzuzeichnen, während Sie geschrieben haben, und die geplanten Daemon analysieren die Protokolle und normalisieren die Daten für weitere Suche später. Sobald die Daten/Datensatz analysiert wurden, wurde sie entfernt, um die Datenstruktur niedrig zu halten.

Für unsere nächste Version des Produkts verteilen wir die Bulk-Sammeln separat auf den Websites und verwenden dann den Daemon, um die Daten zu sammeln und danach zu bereinigen, indem sie Befehle an den Bulk-Service ausgeben.

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

In Bezug auf das Aufräumproblem auf dem Center Server besteht unser aktueller Plan darin, "Zeitstempel" hinzuzufügen, um Daten nach dem z. 3 Monate.

Wir haben das genau wie MIP-Map-Texturen in 3D-Spielen/Rendering gedacht. Je näher Sie kommen, desto detaillierterer Daten, je weiter entfernt, desto "gruppierter" und weniger detailliert.

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

Wir haben uns nicht entschieden, ob wir die Datenbank in Brocken unterteilen werden, um das "Detail -Level" getrennt zu halten. Datenbank. Aber wir könnten einfach, da es einige Namensprobleme gibt, wenn wir unterschiedliche Ebenen in derselben Datenbank speichern.

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

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 (in der die Webprotokolle geladen werden). Fügen Sie einen weiteren Eintrag hinzu, um die Tabelle Daily_Table mit dem Namen der erstellten Tabelle und dem Zeitstempel (aktueller Datumszeit) zu füllen. Erstellen Sie einen SQL -Agentenjob, der jede Woche ein TSQL -Skript ausführt. Das TSQL sollte alle Tabellennamen (table_name) aus den Daily_Tables mit einem date_table_created -Zeitstempel fallen lassen, der an 7 Tagen älter ist.

Hoffe das ist, was du gesucht hast :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top