MSDB är en systemdatabas som används av SQL Server. MSDB lagrar alla typer av data, såsom säkerhetskopierings- och återställningshistorik, SQL Agent-jobbhistorik, loggleveransövervakningshistorik, SSIS-paket, Database Engine Tuning Advisor-data och Service Broker-ködata. Precis som användardatabaser behöver msdb regelbundet underhåll, inklusive indexoptimeringar och, ännu viktigare, regelbunden rensning.
Säkerhetskopiera och återställa historik
Som standard finns det ingen metod för att rensa eller radera säkerhetskopiering och återställningshistorik från msdb. Den sparas för alltid tills du ställer in en manuell eller automatiserad process för att radera data. Genom att inte rensa dessa data kommer msdb att fortsätta växa, vilket innebär att läsning och skrivning till dessa tabeller kan bli långsammare och påverka hastigheten på dina säkerhetskopieringsjobb.
De flesta tredjepartsverktyg och välrenommerade underhållslösningar inkluderar processer för att rensa säkerhetskopierings- och återställningshistorik för att förhindra att detta blir ett problem. Ett enkelt sätt att veta om du rensar säkerhetskopieringshistoriken eller inte är att fråga msdb direkt:
SELECT CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server, msdb.dbo.backupset.database_name, msdb.dbo.backupset.backup_finish_date, CASE msdb..backupset.type WHEN 'D' THEN ' Databas' NÄR 'L' SEDAN 'Loggar' AVSLUTA SOM backup_typeFROM msdb.dbo.backupmediafamilyINNER GÅ MED msdb.dbo.backupset PÅ msdb.dbo.backupmediafamily.media_set_id =msdb.dbo.backupset.media_set_idBORDRER; /pre>Om du har säkerhetskopierings- eller återställningshistorik som går tillbaka mer än 90 dagar, bör du undersöka om det finns ett myndighetskrav som kräver att du måste behålla den historiska informationen om dessa säkerhetskopior under en viss period. Om det inte finns ett krav bör du överväga att rensa data som är äldre än en viss tidsperiod. Backuphistorik behövs inte för att återställa dina databaser, och vi rekommenderar att du rengör den regelbundet för att hålla msdb i en rimlig storlek. Att behålla 90 dagar eller mindre är det intervall som jag vanligtvis rekommenderar till kunder.
För att ställa in en process för att rensa säkerhetskopierings- och återställningshistoriken, skapa ett jobb som exekverar
sp_delete_backuphistory
lagrad procedur i msdb och skicka en datumparameter till den. Den lagrade proceduren kommer att radera all säkerhetskopierings- och återställningshistorik som är äldre än det datum du anger. Du kan också skapa en databasunderhållsplan och använda uppgiften Rensa historik.Databas Engine Tuning Advisor
Database Engine Tuning Advisor, även känd som DTA, är ett verktyg som utvecklare och databasadministratörer kan använda för att trimma en databas. DTA använder msdb-databasen för att lagra inställningshistorik och andra stödjande objekt.
Jag hittar rutinmässigt rester av DTA i msdb på klienters produktionsservrar. När jag hittar dessa tabeller frågar jag dem direkt för att avgöra om DTA fortfarande används. Lyckligtvis har jag ännu inte hittat en klient som aktivt kör DTA mot produktion, eftersom det kan påverka prestandan avsevärt. När jag har bekräftat och kommunicerat med klienten släpper jag DTA-tabellerna från msdb. I vissa fall frigör detta flera gigabyte utrymme. Som en försiktighetsåtgärd tar jag mig också tid att förklara den prestandapåverkan som att köra DTA mot produktion kan orsaka och uppmuntra mina klienter att all framtida användning bör göras på en utvecklingsserver.
SQL Server Agent
Ibland kommer jag att hitta en kund som av misstag avmarkerat rutan för att begränsa storleken på jobbhistorikloggen. Detta är ett lätt misstag att göra om du har en upptagen server och loggen fortsätter att rulla över så snabbt att du inte har någon användbar jobbhistorik att referera till när du felsöker SQL Server Agent-jobb. Ett bättre tillvägagångssätt är att öka den maximala jobbhistorikloggstorleken (i rader) till ett mycket högre värde istället för att låta den växa obegränsat.
I de fall där klienter hade obegränsad jobbtillväxt hade sysjobhistory-tabellen blivit överdrivet stor och behövde rensas. Det bästa sättet att rensa historiken är att använda
sp_purge_jobhistory
och skicka in en datumparameter. Den lagrade proceduren kommer att radera all jobbhistorik som är äldre än det datum du anger. Om du måste behålla ett minsta antal dagar av SQL Server Agent-historik, är det inte effektivt att begränsa jobbhistorikloggen baserat på rader. Begränsa istället inte storleken på jobbhistorikloggen och schemalägg även ett jobb som kör sp_purge_jobhistory och skickar in en datumparameter för det minsta antal dagar jobbhistorik som du behöver. Det är vanligt att använda ett värde på 14 eller 30 dagar.Tjänstemäklare
Nyligen stötte jag på ett problem med en klient där msdb hade vuxit till 14 GB i storlek. Efter ett försök att uppdatera instansen till ett aktuellt Service Pack, misslyckades uppgraderingen med att tillämpa skripten på msdb och fick msdb att växa exponentiellt igen. Efter lite forskning upptäckte vi att Service Broker var aktiverad för händelseaviseringar men den var inte korrekt konfigurerad. I över ett år stod händelseaviseringar i kö, men dirigerades inte.
När jag kontrollerade sys.transmission_queue fann jag att tjänstemäklaren i måldatabasen inte var tillgänglig och tjänstmäklaren var administrativt inaktiverad. Jag kollade sedan för att se vilka händelsemeddelanden som ställts in genom att fråga sys.server_events_notifications och hittade bara en post:fånga alla fellogghändelser. Jag frågade sedan sys.transmissions_queue för att se hur många händelser som fanns i kön och hittade flera miljoner poster där.
Efter att ha diskuterat detta med kunden och förklarat resultaten kom vi överens om att det bästa tillvägagångssättet var att släppa händelseaviseringen och rensa den aktuella kön genom att skapa en ny mäklare. För att göra detta körde jag ALTER DATABASE msdb SET NEW_BROKER. Detta gjordes efter timmar och efter en bra fullständig säkerhetskopiering av msdb.
Efter att ha rensat transmission_queue och tagit bort händelsen kunde jag minska msdb från 14 GB till 300 MB. Innan det här problemet åtgärdades hade msdb-databasen den högsta disklatensen på instansen och klienten upplevde regelbundna dödlägen. Efter att ha implementerat denna förändring, såväl som andra optimeringar, förbättrades kundens användarupplevelse avsevärt.
Loggsändning
Tidigt i min DBA-karriär ärvde jag en konsolideringsserver som hade några hundra databaser som loggad skickades till en sekundär server i ett annat datacenter. Den här servern hade varit igång i flera år och skickade loggarna var 15:e minut. Den här instansen led inte bara av att säkerhetskopieringshistoriken inte rensades, den rensade inte heller loggförsändningsövervakarens historik. När jag rensat säkerhetskopieringshistoriken och kontrollerat storleken på msdb visade den fortfarande mer använt utrymme än det borde. Jag körde ett skript för att visa mig den totala storleken på varje tabell och upptäckte att
log_shipping_monitor_history_detail
bordet var mycket stort. I det här fallet kunde jag körasp_cleanup_log_shipping_history
för att rensa historiken och få tillbaka msdb till normal storlek.Indexering
Att optimera index i msdb är lika viktigt som dina användardatabaser. Många gånger har jag hittat klienter som optimerar användardatabaser men inte systemdatabaserna. Eftersom msdb-databasen används flitigt av SQL Server Agent, Log Shipping, Service Broker, SSIS, backup och återställning och andra processer, kan indexen bli mycket fragmenterade. Se till att dina indexoptimeringsjobb även inkluderar dina systemdatabaser, eller åtminstone msdb. Jag har sett indexoptimeringar frigöra flera gigabyte utrymme från mycket fragmenterade index inom msdb.
Sammanfattning
Att försumma msdb kan påverka din miljös prestanda negativt. Det är avgörande att övervaka storleken på msdb, såväl som processerna som använder den, för att säkerställa att den fungerar optimalt. Backup- och återställningshistorik är den vanligaste orsaken till att msdb-databasen sväller upp, men Database Engine Tuning Advisor, SQL Server Agent-historik, servicemäklare, loggsändning och bristande indexunderhåll kan alla bidra till överdriven tillväxt av msdb och påverka prestandan av databasen.