sql >> Database teknologi >  >> RDS >> Database

Vigtigheden af ​​vedligeholdelse på MSDB

MSDB er en systemdatabase, der bruges af SQL Server. MSDB gemmer alle slags data, såsom backup- og gendannelseshistorik, SQL Agent-jobhistorik, logforsendelsesmonitorhistorik, SSIS-pakker, Database Engine Tuning Advisor-data og Service Broker-kødata. Ligesom brugerdatabaser har msdb brug for regelmæssig vedligeholdelse, inklusive indeksoptimeringer og, endnu vigtigere, regelmæssig udrensning.

Sikkerhedskopiering og gendannelseshistorik

Som standard er der ingen metode til at slette eller slette backup og gendanne historik fra msdb. Det opbevares for evigt, indtil du opsætter en manuel eller automatiseret proces til at slette dataene. Ved ikke at rense disse data vil msdb fortsætte med at vokse, hvilket betyder, at læsning og skrivning til disse tabeller kan blive langsommere og påvirke hastigheden af ​​dine backup-jobs.

De fleste tredjepartsværktøjer og velrenommerede vedligeholdelsesløsninger inkluderer processer til at rydde backup og gendannelseshistorik for at forhindre, at dette bliver et problem. En nem måde at vide, om du sletter sikkerhedskopieringshistorik eller ej, er at forespørge msdb direkte:

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 ' Database' NÅR 'L' SÅ SLUTTER 'Log' SOM backup_typeFRA msdb.dbo.backupmediafamilyINNER JOIN msdb.dbo.backupset PÅ msdb.dbo.backupmediafamily.media_set_id =msdb.dbo.backupset.media_date.backupset_idORDER; 

Hvis du har backup- eller gendannelseshistorik, der går mere end 90 dage tilbage, så bør du undersøge, om der er et lovkrav, der påbyder, at du skal opbevare de historiske oplysninger om disse sikkerhedskopier i en bestemt periode. Hvis der ikke er et krav, bør du overveje at slette data, der er ældre end en bestemt tidsperiode. Sikkerhedskopieringshistorik er ikke nødvendig for at gendanne dine databaser, og vi anbefaler at rense den med jævne mellemrum for at holde msdb i en rimelig størrelse. At holde 90 dage eller mindre er den rækkevidde, jeg typisk anbefaler til kunder.

For at konfigurere en proces til at slette sikkerhedskopierings- og gendannelseshistorikken, skal du oprette et job, der udfører sp_delete_backuphistory gemt procedure i msdb og send den en datoparameter. Den lagrede procedure vil slette al backup- og gendannelseshistorik, der er ældre end den dato, du angiver. Du kan også oprette en databasevedligeholdelsesplan og bruge opgaven Oprydningshistorik.

Database Engine Tuning Advisor

Database Engine Tuning Advisor, også kendt som DTA, er et værktøj, som udviklere og databaseadministratorer kan bruge til at hjælpe med at tune en database. DTA udnytter msdb-databasen til at gemme indstillingshistorik og andre understøttende objekter.

Jeg finder rutinemæssigt rester af DTA i msdb på klienters produktionsservere. Når jeg finder disse tabeller, spørger jeg dem direkte for at afgøre, om DTA stadig bruges. Heldigvis har jeg endnu ikke fundet en klient, der aktivt kører DTA mod produktion, da det kan påvirke ydeevnen betydeligt. Når jeg har bekræftet og kommunikeret med klienten, dropper jeg DTA-tabellerne fra msdb. I nogle tilfælde frigiver dette flere gigabyte plads. Som en sikkerhedsforanstaltning tager jeg mig også tid til at forklare den præstationspåvirkning, som at køre DTA mod produktion kan forårsage og opmuntre mine klienter til, at enhver fremtidig brug skal ske på en udviklingsserver.

SQL Server Agent

Nogle gange vil jeg finde en klient, der ved et uheld fjernede markeringen i feltet for at begrænse størrelsen af ​​jobhistorikloggen. Dette er en nem fejl at lave, hvis du har en travl server, og loggen bliver ved med at rulle så hurtigt, at du ikke har nogen brugbar jobhistorik at referere til, når du fejlfinder SQL Server Agent-job. En bedre tilgang er at øge den maksimale jobhistoriklogstørrelse (i rækker) til en meget højere værdi i stedet for at lade den vokse ubegrænset.

I de tilfælde, hvor klienter havde ubegrænset jobvækst, var sysjobhistorie-tabellen blevet for stor og skulle renses. Den bedste måde at rense historikken på er at bruge sp_purge_jobhistory og indsend en datoparameter. Den lagrede procedure vil slette al jobhistorik, der er ældre end den dato, du angiver. Hvis du skal beholde et minimumsantal dages SQL Server Agent-historik, er begrænsning af jobhistorikloggen baseret på rækker ikke effektiv. Begræns i stedet ikke størrelsen af ​​jobhistorikloggen og planlæg også et job, der kører sp_purge_jobhistory og sender en datoparameter for det mindste antal dage af jobhistorik, du har brug for. Det er almindeligt at bruge en værdi på 14 eller 30 dage.

Servicemægler

For nylig stødte jeg på et problem med en klient, hvor msdb var vokset til 14 GB i størrelse. Efter et forsøg på at opdatere forekomsten til en aktuel servicepakke, mislykkedes opgraderingen ved at anvende scripts til msdb og fik msdb til at vokse eksponentielt igen. Efter nogle undersøgelser opdagede vi, at Service Broker var aktiveret for hændelsesmeddelelser, men det var ikke korrekt konfigureret. I mere end et år stod begivenhedsmeddelelser i kø, men blev ikke dirigeret.

Ved at kontrollere sys.transmission_queue fandt jeg ud af, at servicemægleren i måldatabasen ikke var tilgængelig, og servicemægleren var administrativt deaktiveret. Jeg tjekkede derefter for at se, hvilke hændelsesmeddelelser der var konfigureret ved at forespørge på sys.server_events_notifications og fandt kun én post:fange alle fejlloghændelser. Jeg spurgte derefter sys.transmissions_queue for at se, hvor mange begivenheder der var i køen og fandt flere millioner poster der.

Efter at have diskuteret dette med klienten og forklaret resultaterne, blev vi enige om, at den bedste fremgangsmåde var at droppe begivenhedsmeddelelsen og rydde den aktuelle kø ved at oprette en ny mægler. For at gøre dette udførte jeg ALTER DATABASE msdb SET NEW_BROKER. Dette blev gjort efter timer og efter en god fuld backup af msdb.

Efter at have ryddet transmission_queue og fjernet hændelsen var jeg i stand til at reducere msdb fra 14GB til 300MB. Inden dette problem blev rettet, havde msdb-databasen den højeste disklatens på instansen, og klienten oplevede regelmæssige deadlocks. Efter implementering af denne ændring, samt andre optimeringer, blev kundens brugeroplevelse væsentligt forbedret.

Logforsendelse

Tidligt i min DBA-karriere arvede jeg en konsolideringsserver, der havde et par hundrede databaser, der blev Log Sendt til en sekundær server i et andet datacenter. Denne server havde været oppe og køre i flere år og sendte logfilerne hvert 15. minut. Ikke alene led dette tilfælde af, at backuphistorikken ikke blev renset, den ryddede heller ikke logforsendelsesovervågningshistorikken korrekt. Når jeg rensede sikkerhedskopieringshistorikken og tjekkede størrelsen af ​​msdb, viste den stadig mere brugt plads, end den burde. Jeg kørte et script for at vise mig den samlede størrelse af hver tabel og fandt ud af, at log_shipping_monitor_history_detail bordet var meget stort. I dette tilfælde var jeg i stand til at køre sp_cleanup_log_shipping_history for at rense historikken og få msdb tilbage til normal størrelse.

Indeksering

Optimering af indekser i msdb er lige så vigtigt som dine brugerdatabaser. Mange gange har jeg fundet klienter, der optimerer brugerdatabaser, men ikke systemdatabaserne. Da msdb-databasen er meget brugt af SQL Server Agent, Log Shipping, Service Broker, SSIS, backup og gendannelse og andre processer, kan indekserne blive meget fragmenterede. Sørg for, at dine indeksoptimeringsjob også inkluderer dine systemdatabaser eller i det mindste msdb. Jeg har set indeksoptimeringer frigøre flere gigabyte plads fra stærkt fragmenterede indekser i msdb.

Oversigt

Forsømmelse af msdb kan påvirke dit miljøs ydeevne negativt. Det er afgørende at overvåge størrelsen af ​​msdb, såvel som de processer, der bruger det, for at sikre, at det fungerer optimalt. Sikkerhedskopiering og gendannelseshistorik er den mest almindelige årsag til, at msdb-databasen svulmer op, men Database Engine Tuning Advisor, SQL Server Agent-historik, servicemægler, logforsendelse og manglende indeksvedligeholdelse kan alle bidrage til overdreven vækst af msdb og påvirke ydeevnen af databasen.


  1. Sådan fungerer implicitte transaktioner i SQL Server

  2. MySQL LOG10() Funktion – Returner base-10 logaritmen for en værdi

  3. Stjerneskemaet

  4. Hvordan kan jeg lave en FØR OPDATERET trigger med sql server?