Question

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

Nous avons un démon qui écoute les événements demande / réponse de nos équilibreur de charge et inserts en vrac dans la base de données.

Cependant, nous obtenons environ 1 Go de journaux par jour et nous avons seulement besoin de garder environ une semaine autour (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 sa propre table, par exemple Log_2011_04_07 aurait toutes les entrées pour ce jour-là, et puis laisser tomber le tableau le plus ancien. Un point de vue pourrait être créé pour couvrir toutes les tables de jour pour effectuer des requêtes facile. Est-ce faisable?

Était-ce utile?

La solution

Vous devriez regarder dans le partitionnement.

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

La chose cool sur le partitionnement est que vous avez un seul nom de la table (par opposition à l'approche de plusieurs tables) pour que vos instructions d'insertion restent statiques. Il fonctionne avec toutes les applications - il est complètement transparent aux requêtes. Vous n'avez pas à vous soucier de ce qui se passe si vous vous retrouvez avec des indices ou des statistiques sur chacun des tableaux, que ce soit.

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

Ensuite, construire un travail SQL Server Agent qui utilise T-SQL pour échanger sur la dernière partition tous les jours. La suppression devient une opération de métadonnées, et il est ultra-rapide. Échangez la partition, puis déposez l'ancien sur.

Autres conseils

Nous avons développé un produit il y a de l'exploitation forestière webstatistic 6 ans qui nous permet de suivre chaque clic d'une visite de l'utilisateur.

Ce que nous avons fait étaient à chaque visite buld dossier que vous avez écrit et que le démon prévu parse les journaux et normaliser les données pour la recherche plus tard. Dès que les données / enregistrement a été analysé, il a été retiré pour maintenir la structure de données faible.

Pour notre prochaine version du produit, nous allons distribuer les gros collecteurs séparement sur les sites Web et puis utilisez le démon pour recueillir les données et nettoyer ensuite en émettant des commandes à la masse-service.

De cette façon, nous pouvons gérer une « maintainance programmée » sans perte de données.

En ce qui concerne la question de nettoyage sur le serveur central, notre plan actuel est d'ajouter « timestamps » pour pouvoir archiver les données après par exemple. 3 mois.

Nous avons pensé que cela comme textures MIP-MAP dans les jeux 3D / rendu. Plus vous obtenez, les données plus détaillées, plus loin, plus « regroupés » et moins détaillée.

Donc, jour après jour, nous pouvons observer des modèles de visiteurs, mais après trois mois ces données ne coûtent pas vraiment pertinent et nous compresser les données en moins de détails.

Nous havent décidé si nous allons briser la base de données en morceaux pour cela pour garder le « niveau de détail » pr seperated. base de données. Mais nous venons de force, car il y a des problèmes de nameing si nous enregistrons des niveaux différents dans la même base de données.

Je espère que vous pouvez l'utiliser pour quelque chose? Je ne peux pas vous donner un exemple de code comme partie du produit de notre société.

Créer 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 logs web), ajouter une autre entrée pour remplir la table Daily_tables avec le nom de la table créée, et l'horodatage (date heure actuelle). Créer un emploi d'agent SQL qui va exécuter un script TSQL chaque semaine. Le TSQL doit déposer tous les noms de tables (Table_name) des Daily_tables avec un horodatage Date_table_created qui est plus que 7 jours.

L'espoir est ce que vous cherchez :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top