EN

SQL Server – Avveckla en databas del 1

Idag kommer vi gå igenom lite tips för att avveckla en databas. Det kan vara väldigt svårt att avveckla en databas, de som satte upp den för femtielva år sedan är inte kvar, där rullar en service från en gammal NT4-applikationsserver någonstans och håller anslutningar mot databasen, men används den verkligen?

Tyvärr finns det ingen 100 % metod för att ta reda på det men vi kan göra en hel del rent tekniskt och jag kommer gå igenom en del olika metoder nedan. Har du själv något bra tips så hör gärna av dig till oss på addprodba@addpro.se.

Kolla när index senast användes
Med hjälpa av DMV index_usage_stats kan vi få reda på när när ett index senast användes, nedan listar användning av index i aktuell databas och visar objekt och index namn. Notera att det är sedan senaste omstart samt att när du är inne och pillar kan du få datumet uppdaterat. Det går även att få fram informationen via standardrapporterna, högerklicka på din databas, välj Reports, Standard Reports, Index Usage Statistics. Notera att statistik för HEAP-tabeller inte visas i rapporten.

SELECT so.name AS ObjectName, ISNULL(si.name,'[HEAP]') AS IndexName, si.type_desc As IndexType, last_user_lookup, last_user_scan, last_user_seek, last_user_update FROM sys.dm_db_index_usage_stats ius
RIGHT JOIN sys.objects so ON so.object_id = ius.object_id
RIGHT JOIN sys.indexes si ON si.object_id = ius.object_id AND si.index_id = ius.index_id
WHERE database_id = DB_ID()

Kolla datum i tabeller
Nedan frågor letar igenom alla tabeller efter datum kolumner ”datetime” (modifera om du även vill inkludera moderniteter såsom datetime2, datetimeoffset, date etc), kopiera lastDateQuery raderna till fråga nr 2. Detta ger en viss fingervisning om hurvida data i tabeller används, dock måste det kopplas ihop med vad tabellen gör, är det en aktuell order tabell är informationen intressant, men en historik eller framtida projekt tabell inte alls ger någon vettig information då datan kan ha lagts in för flera år sedan men syfta på något som händer i framtiden.

Kör detta först!

SELECT table_schema, table_name, column_name,
'INSERT INTO @LastDates SELECT TOP 1 ' + column_name + ',' + '''' + table_name + '''' + ',' + '''' + column_name + '''' + ' FROM ' + table_schema + '.' + table_name + ' ORDER BY ' + column_name + ' DESC' AS lastDateQuery,column_name,ordinal_position,data_type,character_maximum_length
from INFORMATION_SCHEMA.COLUMNS where data_type = 'datetime'

Kopiera alla rader i lastDateQuery från ovan resultat och klistra in nedan.

DECLARE @LastDates table(
            xlastrow datetime,
    xtablename varchar(100),
    xrowname varchar(100));
-- { KLISTRA IN lastDateQuery rader här }
SELECT * FROM @LastDates

Och kör för att visa senaste datum i varje tabell som innehåller datum kolumner.

Aktivera AUTO CLOSE på databasen
Om vi är hyfsat säkra på att databasen inte används kan vi slå på AUTO CLOSE. Databasen stängs då ner när den inte används och startar upp automatiskt när någon försöker använda den. Detta innebär att vi får en del prestanda försämring pga ner/upp start men i det här läget räknar vi inte med att det ska hända så ofta. Fördelen med denna metod är att vid varje uppstart loggas detta i Error loggen så vi kan avvakta några veckor och sen kolla Error loggen om det hänt något.

Starta en trace
Starta SQL Server Profiler, kör igång en trace på bla Audit Login, ExistingConnection, RPC:Completed, SQL:BatchCompleted. Använd filter på databas och ställ in den/de databaser du tänker avveckla, du kommer troligen behöva sätta upp ytterligare filter för att få bort olika jobb och annat som går mot dina databaser. Tänk på att en användare kanske loggar in mot en annan databas men ställer frågor som inkluderar din databas. Om en användare har valt en annan databas (USE AnnanDatabas) och kör en fråga mot AnnanDatabas men som tex inkluderar en JOIN mot databasen vi tänker avveckla så kommer inte det med i tracen. Så när databasen vi tänker avveckla används indirekt så är det inte säkert att vi fångar det i vår trace, en fördel är dock att det vi fångar upp får vi veta exakt var det kommer ifrån, vilken maskin, applikationens namn samt användarnamn.

I del 2 kommer vi titta på hur vi går vidare med avvecklingen av databasen.

/Fredrik

Lämna ett svar