Comment stocker 'n' jours de journaux de serveur Web dans Sql Server?


18

Pour des rapports et une analyse des performances plus rapides, nous souhaitons insérer nos journaux de serveur Web dans Sql Server. Cela nous permettra de voir les modèles de trafic, les problèmes et les ralentissements en temps quasi réel.

Nous avons un démon qui écoute les événements de demande / réponse de notre équilibreur de charge et des insertions en masse dans la base de données.

Cependant, nous obtenons environ 1 Go de journaux par jour et nous n'avons besoin que de conserver environ une semaine (au moins sous cette forme brute).

Quelle est la meilleure façon de stocker ces données et la meilleure façon de supprimer les anciennes entrées?

Nous avons parlé de stocker les données de chaque jour dans sa propre table, par exemple Log_2011_04_07aurait toutes les entrées pour ce jour, puis de supprimer la table la plus ancienne. Une vue pourrait être créée pour couvrir toutes les tables de jour pour une interrogation facile. Est-ce faisable?


C'est une question très similaire mais pour Oracle; la syntaxe sera différente, mais il s'agit d'une application classique de partitionnement par date. Pas besoin de réinventer la roue :-)
Gaius

Réponses:


17

Vous devriez regarder dans le partitionnement.

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

La chose intéressante à propos du partitionnement est que vous n'avez qu'un seul nom de table (par opposition à l'approche à plusieurs tables), de sorte que vos instructions d'insertion restent statiques. Il fonctionne avec toutes les applications - il est complètement transparent pour les requêtes. Vous n'avez pas à vous soucier de ce qui se passe si vous vous retrouvez avec des index ou des statistiques différents sur chacune des tables.

Vous créez une fonction de partition qui décide comment diviser la table en plusieurs tables derrière la scène. La fonction ne peut prendre qu'un seul paramètre / champ d'entrée, et dans votre cas, ce serait un champ de date. La fonction peut décomposer le tableau par date, semaine, mois ou année - dans votre cas, vous souhaitez une date, une période de 24 heures.

Créez ensuite un travail de l'Agent SQL Server qui utilise T-SQL pour échanger la dernière partition chaque jour. La suppression devient une opération de métadonnées, et elle est extrêmement rapide. Échangez la partition, puis supprimez l'ancienne.


J'examinerai cela - cela permet-il de supprimer des partitions individuelles, afin que les suppressions puissent aller rapidement?
Jarrod Dixon

3
Oui, vous devriez examiner spécifiquement le concept de "partition de fenêtre coulissante automatique". Une belle série d'articles que vous pouvez trouver sur SQLServerCentral: part1 , part2 et part3 .
Marian

7

Nous avons développé il y a 6 ans un produit de journalisation webstatistique qui nous permet de suivre chaque clic d'une visite des utilisateurs.

Ce que nous avons fait était d'enregistrer en bloc chaque visite comme vous l'avez écrit et de demander au démon planifié d'analyser les journaux et de normaliser les données pour une recherche ultérieure. Dès que les données / l'enregistrement ont été analysés, ils ont été supprimés pour maintenir la structure des données à un niveau bas.

Pour notre prochaine version du produit, nous distribuerons les collecteurs en vrac séparément sur les sites Web, puis utiliserons le démon pour collecter les données et les nettoyer ensuite en émettant des commandes au service en vrac.

De cette façon, nous pouvons gérer une «maintenance planifiée» sans perdre de données.

Concernant le problème de nettoyage sur le serveur central, notre plan actuel est d'ajouter des "horodatages" pour pouvoir archiver les données après par exemple. 3 mois.

Nous l'avons pensé tout comme les textures MIP-MAP dans les jeux / rendus 3D. Plus vous vous rapprochez, plus les données sont détaillées, plus vous vous éloignez, plus vous êtes "groupé" et moins détaillé.

Donc, au jour le jour, nous pouvons observer les tendances des visiteurs, mais après 3 mois, ces données ne sont plus vraiment pertinentes et nous compressons les données en moins de détails.

Nous n'avons pas décidé si nous allons diviser la base de données en morceaux pour que cela garde le "niveau de détail" séparé. base de données. Mais nous pourrions le faire, car il y a des problèmes de nom si nous stockons différents niveaux dans la même base de données.

J'espère que vous pourrez l'utiliser pour quelque chose? Je ne peux pas vous fournir d'exemple de code comme partie intégrante du produit de notre entreprise.


1

Créez une autre table Daily_tables avec deux colonnes: Table_name et Date_table_created. Dans votre code qui crée une nouvelle table quotidienne (qui charge les journaux Web), ajoutez une autre entrée pour remplir la table Daily_tables avec le nom de la table créée et l'horodatage (heure actuelle). Créez un travail d'agent SQL qui exécutera un script TSQL chaque semaine. Le TSQL doit supprimer tous les noms de tables (Table_name) des Daily_tables avec un horodatage Date_table_created plus ancien que 7 jours.

J'espère que c'est ce que vous cherchiez :)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.