SQL server 2008 – Database Audit problem

Oopps! Upgrade your browser pretty please. Oopps! Upgrade your browser pretty please.

Bakgrund

I SQL server 2008 intruducerades inbyggd funktionalitet för att logga diverse händelser i auditiler. Dessa auditfiler kan därefter läsas med sys.fn_get_audit_file. För flera år sedan implementerade jag denna typ av audit vid ett migreringsarbete där ingen riktigt kunde svara på vilka tabeller och procedurer som fortfarande var i bruk. Varje dag samlades aggregerad information in för att uppdatera en tabell som lagrade vilka objekt som fanns och när de senast användes. Auditfilerna fick ligga kvar i 7 dagar innan de rensades bort. Så långt var allt bra. Informationen har därefter nyttjats för att kunna ta bort objekt, som tabeller och procedurer, och för att slippa migrera till ny plattform.

Problem

Funktionaliteten har fungerat mer eller mindre klanderfritt i mer än två år utan någon direkt övervakning.  En dag så har blev det plötsligt slut på diskutrymme. Auditfilerna för 7 dagar var plötsligt 260GB! Jobbet som aggregerade ihop informationen tog nu 8h att exekvera istället för 5 min.

 

Varför hade dessa logfiler växt så snabbt? Jo, efter en snabb utredning visade det sig att det nya Datawarehouset som satts upp och att man höll på och laddade historisk data. Eftersom det nya DWH:t använde sig av ett funktionsbibliotek i en av de monitorerade databaserna så loggades det varje gång något object användes. De nyttjade funktioner i select satser vilket gör att funktionerna anropas en gång per rad och datamängderna med historisk data som laddades upp var mer än 30ggr så stora. Detta innebar att det loggades 6 funtionsanrop per microsekund!

Lösning?

Kortsiktigt:

– tillfälligt stänga av SQL audit i databasen med funktioner.
– Se över rutinerna för vad som ska övervakas

Långsiktigt:

– Justera SQL audit att logga enbart utvalda object eller schema
– Bygga bort funktionsanrop i Select satser för att öka prestanda.

Slutsats

Bara för att en lösning fungerar bra just nu så är det inte någon garanti att det fungerar bra i framtiden. Säkerställ att du har kontroll på hur saker förändras över tid och övervaka att det fortfarande fungerar. Det kan tyckas vara en bra ide att att kapsla in frekvent förekommande kod, men det finns flera stora problem med inline scalar valued functions. Ett av dessa är att dessa anropas för varje rad i ditt resultatset om du använder dem i select satser. Ett annat är att index inte kan nyttjas om de används (på felaktigt sätt) i join eller where villkor. Undvik därför funktioner i största möjliga mån.

Läs mer om Audit

Du kan läsa mer om Audit på följande adress : http://msdn.microsoft.com/en-us/library/cc280386.aspx Om du är intresserad av att veta mer om audit i SQL server eller om du har andra SQL relaterade frågor är du välkommen att kontakta oss så ska vi SQL konsulter hjälpa dig på bästa sätt. /Håkan Winther