ÖVERVAKNING AV SQL SERVER Hantering resurser för samtidiga användare Övervakning av SQL Servers aktiviteter Hantering av blockerade processer Användning av SQL Profiler för att hitta besvärliga frågor 1 TRANSAKTIONER KORT ORIENTERING En transaktion innebär kortfattat att "allt eller inget" utförs 1. Implicita Transaktioner Antag att du ska skriva en SQL-fråga som ökar lönen på alla personer som tillhör dataavdelningen med 5%. Detta kan utföras med en enda SQL-fråga som skulle kunna se ut så här. UPDATE Personal SET Lön = Lön * 1.05 WHERE Avdelning = 'Data'; Varje INSERT, UPDATE och DELETE-fråga är en automatisk (implicit) transaktion. Om det skulle bli strömavbrott eller något annat fel under tiden frågan körs skulle man inte veta vilka som fått högre lön och vilka som inte fått det. Det skulle kosta mycket tid och pengar att rätta till det hela. Tack vare transaktionen innebär det att om inte hela frågan lyckas så görs ROLLBACK på transaktionen och återställer till läget innan transaktionen. Om frågan lyckas görs COMMIT automatiskt vilket innebär att resultatet sparas permanent 2 1
2. Explicita transaktioner TRANSAKTIONER KORT ORIENTERING När flera av varandra beroende operationer görs efter varandra och alla måste lyckas, måste man själv skapa en (explicit) transaktion. Transaktionen ska göra ROLLBACK om något gör fel och COMMIT om inget fel uppstått. BEGIN TRY BEGIN TRAN -- Ta ut 1000 kr från konto 5 Ex. UPDATE Account En bank ska överföra en summa pengar från ett SET Amount -= 1000 WHERE AccountID = 5; konto till ett annat konto. Då får det inte vara så att bara uttaget eller bara insättningen skulle lyckas. Både uttag OCH insättning måste utföras utan fel. En transaktion kan enkelt beskrivas med: Allt eller inget -- Sätt in 1000 kr till konto 9 UPDATE Account SET Amount += 1000 WHERE AccountID = 9; COMMIT TRAN END TRY BEGIN CATCH ROLLBACK TRAN; Raiserror('Fel',16,1); END CATCH Inne i ett TRY-block utförs uttag och insättning. Transaktionen startar med BEGIN TRAN. Om allt fungerar, utförs sist COMMIT TRAN som sparar operationerna permanent. Om det blir ett fel i TRY-bocket fortsätter körningen i CATCH-blocket och gör alla operationerna ogjorda med ROLLBACK TRAN. 3 LÅS (LOCKS) Lås SQL-Server SQL Server låser objekt när samtidiga användare (concurrent users) vill komma åt dem för uppdatering eller radering SQL Server använder lås för att uppfylla villkoren på en transaktion andra användare ska inte komma in och störa transaktionen SQL Server väljer själv lämplig nivå att låsa på Row, Page, Keys, Key Ranges, Table, Index, Database, Schema Förhindrar de problem som kan uppstå: Dirty data -Användare kan se andra användares uncommited data Lost update -En användares uppdatering skriver över en annan uppdatering Unrepeatable reads -En andra läsning ger ett annat resultat än tidigare läsning av samma post 4 2
LÅS (LOCKS) Lås krävs för att skydda resurser när det finns samtidiga (concurrent) användare Problem med Lås (Locks) Blockerade processer En process som ligger och väntar på att lås ska släppas Deadlock Kallas även "The deadly embrace", kan uppstå då två transaktioner låser data som den andra vill ha, fast i omvänd ordning. BEGIN TRAN A --(1) Låser ProductID=1 SET UnitPrice = UnitPrice*1.20 WHERE ProductID = 1 1 2 BEGIN TRAN B --(2) Låser ProductID=2 SET UnitPrice = UnitPrice*0.9 WHERE ProductID = 2 --(3) Väntar på att få låsa ProductID=2 3 SET UnitPrice = UnitPrice*1.15 WHERE ProductID = 2 --(4) Väntar på att få låsa ProductID=1 SET UnitPrice = UnitPrice*0.8 WHERE ProductID = 1 4 Deadlock Vi har fått en deadlock! SQL Server kommer att som tur är avbryta en av transaktionerna, förmodligen avbryts B, eftersom den kom sist. 5 ÖVERVAKNING AV SQL SERVER Varför övervaka? Förbättra prestanda Hitta flaskhalsar Kontrollera om hårdvaran rätt dimensionerad Kontrollera om SQL Server är effektivt konfigurerad Studera användarnas aktiviteter Vilken typ av arbete utförs Vilka resurser krävs av vanliga transaktioner Övervakningsverktyg SQL Server Profiler Detaljerade spårningar (traces) av aktiviteter Hittar besvärliga frågor Övervakar händelser (events) i SQL Servermotorn Activity Monitor - Aktivitetsövervakaren Övervakning av processer och resurser Hittar besvärliga frågor sp_who, sp_who2, sp_lock Kommando-versioner av Activity Monitor 6 3
SQL SERVER PROFILER SQL Server Profiler är ett verktyg för att övervaka händelser (events) i SQL Server Engine. Startas från Start-menyn eller från Tools-menyn i Management Studio En spårning (trace) skapas antingen från scratch där man väljer vilka händelser man vill undersöka eller så används en färdig mall Man kan filtrera så att endast vissa användares aktiviteter spåras - håller informationen nere Med profiler startad visas alla inställda händelser med information om tider, SQL satser mm Man kan hitta frågor som tar lång tid, långa låsningar, deadlocks, ja i princip all trafik och händelser i servern kan inspekteras Kan användas till prestandatrimning eller kanske till "reverse engineering" för att utröna vilka frågor som ställs från en applikation 7 ACTIVITY MONITOR #1 Activity monitor Startas genom att högerklicka på valfri SQL server i Object Explorer - Välj sedan Activity monitor. 4 diagram visar: 1. "% Processor time" 2. "Waiting tasks" 3. "Database I/O" 4. "Batch Requests/s" Underst finns fyra utfällbara fönster där processer, väntetider, file I/O och tunga frågor kan studeras. 8 4
ACTIVITY MONITOR #2 I Processes kan man t ex hitta processer blockerande processer Man kan också filtrera på alla kolumner hitta blockerande processer visa fråga (högerklick- Details) döda process (- Kill Process) trace'a i profiler. (-Trace Process ) I Resource Waits kan man leta efter flaskhalsar (hög Wait Time) I Data File I/O kan man hitta databaser som har hög I/O I Recent Expensive Queries visar de senaste "tunga" frågorna 9 HANTERING AV BLOCKERADE PROCESSER Visa låsta processer Med Activity Monitor kan man lätt spåra orsaken till att processer blir hängande. Se föregående bild! Åtgärder Man kan antingen avbryta den blockerande processen eller den blockerande processen med "Kill Process" när man tagit reda på orsaken. Skydd mot att bli blockerad Lägg in en timeout med: SET LOCK_TIMEOUT milliseconds -- Kan endast sättas för sessionen Ex. SET LOCK_TIMEOUT -1 -- Vänta för evigt SET LOCK_TIMEOUT 0 -- Vänta inte alls SET LOCK_TIMEOUT 3000 -- Vänta 3 s SELECT @@LOCK_TIMEOUT -- visar aktuellt värde 10 5
SAMMANFATTNING En transaktion är ett antal SQL-satser som måste utföras i sin helhet. Allt eller inget. En lyckad transaktion avslutas med COMMIT och en misslyckad med ROLLBACK. Alla INSERT, UPDATE och DELTE - SQL-satser är implicita (automatiska) transaktioner. När två eller flera operationer ska utföras i sin helhet (allt eller inget) bildar man en explicit transaktion med BEGIN TRAN och testar alla operationer på fel. Om inget fel uppstår gör man COMMIT TRAN som sparar resultatet permanent och om det uppstår ett fel gör man ROLLBACK TRAN som gör alla operationer i transaktionen ogjorda. När flera användare vill komma åt samma resurser måste dessa låsas för en användare i taget - speciellt för update och delete. SQL Server väljer själv lämplig nivå att låsa på - Row, Page, Keys, Key Ranges, Table, Index, Database, Schema Lås förhindrar o Dirty data o Lost update o Unrepeatable reads Låsen gör att nya problem kan uppstå t ex Blockering och Deadlock. Låsningar kan studeras med: Activity Monitor, sp_who, sp_who2, sp_lock Väntetid kan minskas med SET LOCK_TIMEOUT Aktiviteter i SQL Server kan detaljstuderas med hjälp av SQL Profiler 11 6