Inleiding
Regelmatig database-onderhoud is een belangrijk onderdeel van het werk van een databasebeheerder en helpt ervoor te zorgen dat cruciale systemen normaal werken. Een van de gemakkelijkste manieren om dit te bereiken, is het automatiseren van taken die verband houden met DBCC CheckDB. Welke versie van SQL Server u ook gebruikt, er zal nooit een database zijn die geen onderhoud vereist. U zult het onderhoud regelmatig moeten plannen, zodat u uw rug kunt dekken, vooral op het moment van een echt rampscenario.
DBA is altijd de boosdoener
Als er een databaseprobleem is, zijn alle ogen gericht op de DBA. Of het probleem nu is veroorzaakt door regen of doordat een ontwikkelaar vervelende code heeft geschreven, waardoor de database traag is, er wordt altijd verwacht dat de DBA de rommel oplost. En je kunt je voorstellen met wat voor druk je moet omgaan als je wordt gevraagd om snel een database te herstellen met behulp van de laatst beschikbare back-up die, zoals je tijdens het proces ontdekt, niet geldig is en de integriteit van de database al een paar maanden in gevaar was geleden. Hier ligt het verschil tussen een proactieve DBA en een reactieve DBA. In werkelijkheid is uw herstelstrategie veel belangrijker dan de back-upstrategie. Welk doel kunnen dagelijkse databaseback-ups dienen als ze op het moment van herstel geen zin hebben?
Waarom is onderhoud belangrijk?
Met de ongekende groei van databasetechnologieën en met nieuwe functies die bij elke release verschijnen, is het voor jou als DBA absoluut noodzakelijk om de rest voor te blijven en ervoor te zorgen dat je de best practices uit de branche volgt op het gebied van database onderhoud.
DBCC CheckDB en hoe we het kunnen uitvoeren
DBCC CheckDB – deze naam beschrijft de functionaliteit vrij goed. Simpel gezegd, het controleert databases. Dit is belangrijk om ervoor te zorgen dat de database werkt zoals verwacht. Kortom, DBCC CheckDB controleert de logische en fysieke integriteit van alle objecten in de database. Dit is wat DBCC CheckDB onder de motorkap doet volgens de officiële Microsoft-documentatie:
Voert DBCC CHECKALLOC uit op de database – de consistentie van schijfruimtetoewijzingen
Voert DBCC CHECKTABLE uit op elke tabel en weergave in de database - dit is de integriteit van alle pagina's en structuren waaruit de tabel of geïndexeerde weergave bestaat.
Voert DBCC CHECKCATALOG uit op de database – dit controleert op catalogusconsistentie binnen de opgegeven database.
Valideert de inhoud van elke geïndexeerde weergave in de database.
Valideert consistentie op linkniveau tussen tabelmetadata en bestandssysteemmappen/bestanden bij het opslaan van varbinary(max)-gegevens in het bestandssysteem met behulp van FILESTREAM.
Valideert de Service Broker-gegevens in de database.
Als je het DBCC CheckDB-commando expliciet of via een taak uitvoert, doet het eigenlijk al het bovenstaande.
DBCC CheckDB rechtstreeks op een database uitvoeren
U kunt de opdracht DBCC CheckDB rechtstreeks op een database uitvoeren en controleren op de resultaten. Controleer de uitvoer van de opdracht zoals weergegeven in de onderstaande schermafbeelding. De uitvoer toont de details over rijen in de tabellen en het aantal pagina's dat door deze rijen wordt gebruikt.
Als je goed kijkt, zie je meer details die specifiek zijn voor database-objecten. In de "VLDB"-database kan ik bijvoorbeeld de volgende uitvoer zien:
“Object ID 1179151246 (object 'Warehouse.ColdRoomTemperatures'): The operation is not supported with memory optimized tables. This object has been skipped and will not be processed.”
Zoals deze uitvoer laat zien, wordt DBCC CheckDB niet ondersteund met voor geheugen geoptimaliseerde tabellen. Voor geheugen geoptimaliseerde tabellen werden voor het eerst geïntroduceerd in SQL Server 2014 als een functie voor alleen ondernemingen. In de loop der jaren zijn ze echter een populaire en wijdverbreide functionaliteit in SQL Server geworden.
U zult ook merken dat DBCC Check de service broker-gegevens in de database heeft gevalideerd, zoals hieronder weergegeven.
“DBCC results for 'VLDB'. Service Broker Msg 9675, State 1: Message Types analyzed: 14. Service Broker Msg 9676, State 1: Service Contracts analyzed: 6. Service Broker Msg 9667, State 1: Services analyzed: 3. Service Broker Msg 9668, State 1: Service Queues analyzed: 3. Service Broker Msg 9669, State 1: Conversation Endpoints analyzed: 0. Service Broker Msg 9674, State 1: Conversation Groups analyzed: 0. Service Broker Msg 9670, State 1: Remote Service Bindings analyzed: 0. Service Broker Msg 9605, State 1: Conversation Priorities analyzed: 0.”
Ten slotte, als de DBCC CheckDB-opdracht met succes is voltooid, ziet u de volgende uitvoer:
Wat gebeurt er als fouten worden gemeld na het uitvoeren van DBCC CheckDB?
In het bovenstaande voorbeeld zou je kunnen zien dat DBCC CheckDB zonder fouten is voltooid. Als u echter niet zoveel geluk heeft, kunt u consistentiefouten tegenkomen - en dat is het moment waarop u een aantal cruciale beslissingen moet nemen. Als u problemen op een productiedatabase bent tegengekomen, kunt u het beste de bedrijfseigenaren of uw Operations Manager informeren om uw kaarten op tafel te leggen. Je kunt ze ofwel de optie geven om de database te herstellen vanaf de laatst beschikbare back-up of je kunt experimenteren met het uitvoeren van DBCC CheckDB-commando's met extra opties.
De DBCC-foutmeldingen kunnen er ongeveer zo uitzien als hieronder:
Table error: Object ID 36, index ID 1, partition ID, alloc unit ID (type In-row data). Keys out of order on page (1:107), slots 6 and 9. CHECKDB found 0 allocation errors and 1 consistency errors in table 'sys.syk' (object ID 36). CHECKDB found 0 allocation errors and 1 consistency errors in database 'VLDB'. repair_rebuild is the minimum repair level for the errors found by DBCC CHECKDB (VLDB).
In de foutmelding ziet u een zorgvuldig geformuleerde foutmelding – “repair_rebuild is the minimaal reparatieniveau voor de fouten gevonden door DBCC CHECKDB ” – suggereert u om DBCC CheckDB uit te voeren met de optie repair_rebuild. Kijk maar naar het woord dat wordt gemarkeerd - 'minimum'. Dit betekent dat er met de optie repair_rebuild geen reële kans op gegevensverlies is en dat SQL Server enkele snelle oplossingen onder de motorkap doet. Raadpleeg de onderstaande opdracht om DBCC CheckDB uit te voeren met de optie repair_rebuild. Zorg ervoor dat u de database in de modus voor één gebruiker plaatst.
Volgens de Microsoft-documentatie is de REPAIR_REBUILD-optie de meest onschadelijke versie omdat er geen gegevensverlies kan zijn. Als REPAIR_REBUILD de consistentiefouten echter nog steeds niet verhelpt, is er nog een andere optie:REPAIR_ALLOW_DATA_LOSS inschakelen. Als we naar de naam kijken, weten we dat er een kans is op gegevensverlies als we deze optie inschakelen. Daarom waarschuwt Microsoft ons om dit met uiterste voorzichtigheid te gebruiken, aangezien er onverwachte gevolgen kunnen zijn bij het uitvoeren van DBCC CheckDB met REPAIR_ALLOW_DATA_LOSS. Het DBCC CheckDB-commando ziet er in dit geval als volgt uit:
Aandachtspunten voordat u de reparatieoptie met DBCC CheckDB gebruikt
Hoe kritisch is de betreffende database?
Bevindt de database zich in de productie- of een testomgeving?
Hoe groot is de database?
Heeft u een goede herstelstrategie voor het geval er problemen optreden?
Heeft u uw databaseback-ups gevalideerd?
Probeer op basis van de situatie en de antwoorden op bovenstaande vragen een beslissing te nemen waarbij u rekening houdt met het belang van de klant.
Het automatiseren van de DBCC CheckDB-taken op SQL Server met behulp van database-onderhoudsplannen
Nou, u hoeft niet al deze opdrachten handmatig op uw servers uit te voeren. Daarom hebben we onderhoudsplannen. Zorg ervoor dat u een regelmatige onderhoudscyclus plant voor al uw databases met behulp van de database-onderhoudsplannen. Het is een vrij eenvoudige en ongecompliceerde taak. Selecteer onder "Onderhoudsplantaken" de "Taak database-integriteit controleren".
Dit voegt een subtaak toe aan uw onderhoudsplan om integriteitscontroles voor uw databases te plannen. Zorg ervoor dat u de vereiste databases selecteert, zoals weergegeven.
Zorg ervoor dat u alle databasecontroles uitvoert tijdens de daluren van de week. Meestal zijn de onderhoudsvensters in het weekend wanneer de server minder druk is in vergelijking met de andere dagen van de week. Dit verschilt echter van server tot server en is afhankelijk van de toepassing. Op kritieke databasesystemen worden over het algemeen waarschuwingen weergegeven wanneer er DBCC CheckDB- of integriteitscontroles zijn gemist. Op deze manier kunnen de DBA's proactief controleren en ervoor zorgen dat ze de integriteitscontroles voltooien om later verrassingen te voorkomen.
DBCC CheckDB-taken automatiseren op SQL Server met behulp van aangepaste scripts of andere populaire scripts
SQL Server-onderhoudsplannen hoeven niet altijd te worden gebruikt voor het uitvoeren van onderhoudstaken op uw SQL Server-instantie. Er zijn andere beschikbare aangepaste scripts die u kunt gebruiken. Een van de populaire gratis onderhoudstools is de onderhoudsoplossing van Ola Hallengren. U kunt de volledige onderhoudsoplossing installeren, inclusief taken voor back-ups, optimalisatie enz., of u kunt alleen de relevante scripts downloaden die verband houden met integriteitscontroles. In deze demo zullen we proberen de scripts te installeren die specifiek zijn voor database-integriteitscontroles.
Klik op de optie DatabaseIntegrityCheck.sql zoals getoond om de opgeslagen procedures te downloaden die de database-integriteit controleren. Nadat ik deze opgeslagen procedures in de hoofddatabase had uitgevoerd, kwam ik deze waarschuwingsberichten tegen:
“The module 'DatabaseIntegrityCheck' depends on the missing object 'dbo.CommandExecute'. The module will still be created; however, it cannot run successfully until the object exists.”
Als u de opgeslagen procedure uitvoert voor het uitvoeren van integriteitscontroles, krijgt u de volgende foutmelding:
Zoals de fout aangeeft, kun je de ontbrekende code hier downloaden. Zodra dit is gebeurd, kunt u beginnen met het uitproberen van de database-integriteitscontroles.
Je kunt verschillende opties aanpassen met behulp van de aanvullende DBCC-opdrachtparameters. Meer details en voorbeelden hiervan vind je hier.
In deze demo zullen we echter een paar voorbeelden bekijken om te zien hoe gemakkelijk en gebruiksvriendelijk deze scripts werkelijk zijn.
Voor het uitvoeren van DBCC CheckDB op alle gebruikersdatabases , moet u het volgende uitvoeren:
EXECUTE dbo.DatabaseIntegrityCheck @Databases = 'USER_DATABASES', @CheckCommands = 'CHECKDB'
U kunt de uitgevoerde opdracht en de resultaatstatus zien die bevestigt dat DBCC CheckDB met succes is voltooid.
Om DBCC Check alleen uit te voeren voor de systeemdatabases, voer dit commando uit:
EXECUTE dbo.DatabaseIntegrityCheck @Databases = 'SYSTEM_DATABASES', @CheckCommands = 'CHECKDB'
Op de schermafbeelding kunt u zien dat de DBCC CheckDB met succes is voltooid voor de systeemdatabases.
Voor het uitvoeren van DBCC CheckDB alleen voor een specifieke database, voer het volgende uit:
EXECUTE dbo.DatabaseIntegrityCheck @Databases = 'VLDB', -- your specific DB Name @CheckCommands = 'CHECKDB'
In het bovenstaande voorbeeld zag je een paar manieren waarop we parameters kunnen gebruiken. Er zijn echter een aantal andere filters die u kunt selecteren op basis van uw voorkeuren. Zoals reeds vermeld, kunt u ook verwijzen naar deze link voor een beter begrip van de scripts van Ola Hallengren. Nogmaals, ik gebruik de scripts van Ola Hallengren op de servers die ik beheer en het wordt sterk aanbevolen en erkend binnen de SQL Server-gemeenschap. U kunt de opgeslagen procedures plannen op basis van uw voorkeursparameters en het is een SQL-taak tijdens de daluren. Op deze manier hoeft u deze scripts niet echt handmatig uit te voeren, zodat u zich kunt concentreren op andere belangrijke taken.
Conclusie
- Van dit artikel heb je geleerd over DBCC CheckDB en hoe het kan worden gebruikt
- U begreep ook het belang van het regelmatig uitvoeren van DBCC CheckDB op al uw belangrijke databases
- Je hebt ook geleerd hoe belangrijk het is om een geteste back-upstrategie te hebben - het wordt aanbevolen om je databases te herstellen met een goede back-up in plaats van consistentiefouten op te lossen met behulp van de DBCC-herstelopties
- Je hebt ook gezien hoe eenvoudig het is om scripts te configureren en te automatiseren met behulp van SQL Server-onderhoudsplannen of aangepaste scripts, bijvoorbeeld die van Ola Hallengren
- Je hebt ook de risico's geleerd van het niet plannen van DBCC CheckDB op je ondersteunde infrastructuur
- Je hebt ook geleerd dat, ongeacht op welke server je je bevindt of welke infrastructuur je gebruikt, er geen database kan zijn die geen onderhoud vereist
- Zorg er ten slotte voor dat u uw databases gezond houdt en in ieder geval klaar bent voor die UIT-dagen die u misschien niet onder controle heeft