Come archiviare 'n' giorni di log del server Web in SQL Server?


18

Per un reporting più rapido e un'analisi delle prestazioni, desideriamo inserire i log del nostro server Web in SQL Server. Questo ci permetterà di vedere modelli di traffico, problemi, rallentamenti in tempo quasi reale.

Abbiamo un demone che ascolta gli eventi di richiesta / risposta dal nostro bilanciamento del carico e inserimenti di massa nel database.

Tuttavia, riceviamo circa 1 GB di registri al giorno e dobbiamo rimanere solo circa una settimana (almeno in questo modulo non elaborato).

Qual è il modo migliore per archiviare questi dati e il modo migliore per eliminare le vecchie voci?

Abbiamo parlato della memorizzazione dei dati di ogni giorno nella propria tabella, ad es. Con Log_2011_04_07tutte le voci per quel giorno e quindi l'eliminazione della tabella più vecchia. È possibile creare una vista che copra tutte le tabelle del giorno per una facile query. È fattibile?


Questa è una domanda molto simile ma per Oracle; la sintassi sarà diversa ma questa è una classica applicazione di partizionamento per data. Non c'è bisogno di reinventare la ruota :-)
Gaius

Risposte:


17

Dovresti dare un'occhiata al partizionamento.

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

La cosa bella del partizionamento è che hai solo un nome di tabella (al contrario dell'approccio a più tabelle) in modo che le tue istruzioni di inserimento rimangano statiche. Funziona con ogni applicazione - è completamente trasparente per le query. Non devi preoccuparti di cosa succede se finisci con indici o statistiche diverse su ciascuna delle tabelle.

Si crea una funzione di partizione che decide come suddividere la tabella in più tabelle dietro la scena. La funzione può accettare solo un parametro / campo di input e, nel tuo caso, sarebbe un campo data. La funzione può suddividere la tabella per data, settimana, mese o anno: nel tuo caso, vorrai data, periodo di 24 ore.

Quindi creare un processo di SQL Server Agent che utilizza T-SQL per scambiare l'ultima partizione ogni giorno. L'eliminazione diventa un'operazione di metadati ed è velocissima. Scambia la partizione, quindi elimina quella precedente.


Esaminerò questo aspetto: consente di eliminare singole partizioni, in modo che le eliminazioni possano essere eseguite rapidamente?
Jarrod Dixon

3
Sì, dovresti esaminare specificamente il concetto di "partizione automatica della finestra scorrevole". Una bella serie di articoli che puoi trovare su SQLServerCentral: part1 , part2 e part3 .
Marian,

7

Abbiamo sviluppato un prodotto di registrazione webstatistico 6 anni fa che ci consente di tenere traccia di ogni clic di una visita dell'utente.

Quello che abbiamo fatto è stato quello di registrare ogni visita mentre scrivevi e far analizzare i log dal demone pianificato e normalizzare i dati per ulteriori ricerche in seguito. Non appena il dato / record è stato analizzato, è stato rimosso per mantenere bassa la struttura dei dati.

Per la nostra prossima versione del prodotto, distribuiremo i collettori collettivi separatamente sui siti Web e quindi utilizzeremo il demone per raccogliere i dati e ripulirli successivamente inviando comandi al servizio collettivo.

In questo modo possiamo gestire un "mantenimento programmato" senza perdere dati.

Per quanto riguarda il problema di pulizia sul server centrale, il nostro piano attuale è quello di aggiungere "timestamp" per poter archiviare i dati dopo ad es. 3 mesi.

Lo abbiamo pensato proprio come le trame MIP-MAP nei giochi / rendering 3D. Più ti avvicini, più dati dettagliati, più lontano, più "raggruppati" e meno dettagliati.

Quindi, giorno per giorno, possiamo osservare i modelli dei visitatori, ma dopo 3 mesi quei dati non sono veramente rilevanti e li comprimiamo in meno dettagli.

Non abbiamo deciso se suddividere il database in blocchi per mantenere il pr separato del "livello di dettaglio". Banca dati. Ma potremmo semplicemente, poiché ci sono alcuni problemi di denominazione se memorizziamo livelli diversi nello stesso database.

Speri di poterlo usare per qualcosa? Non posso fornirvi un codice di esempio come parte del prodotto della nostra azienda.


1

Crea un'altra tabella Daily_tables con due colonne: Table_name e Date_table_created. Nel tuo codice che crea una nuova tabella giornaliera (che carica i log web), aggiungi un'altra voce per popolare la tabella Daily_tables con il nome della tabella creata e il timestamp (data corrente). Creare un processo dell'agente SQL che eseguirà uno script TSQL ogni settimana. TSQL dovrebbe eliminare tutti i nomi di tabelle (Table_name) da Daily_tables con un timestamp Date_table_created più vecchio di 7 giorni.

Spero che questo sia quello che stavi cercando :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.