Het uitvoeren van DBCC Shrink-opdrachten is een nogal controversieel probleem in de SQL Server-gemeenschap. In dit artikel zullen we details over deze opdracht bekijken en een kort overzicht geven van het gebruik ervan en u ook waarschuwen voor de risico's van het uitvoeren van deze opdracht. Als DBA's werden een aantal databases overgedragen van andere teams of leveranciers, en het is niet altijd mogelijk dat we de databases beheren die we hebben gemaakt. Als DBA's, wanneer we betrokken zijn bij migraties of nieuwe projecten, moeten we ervoor zorgen dat we zorgvuldig een soepele overgang van de database naar productie en regelmatig gebruik plannen. In dit stadium moeten we rekening houden met de grootte van de database. Kun je je voorstellen dat je een database-applicatie opzet zonder rekening te houden met de groeiprognose voor het eerste jaar of zo. Hoe zit het met het maken van een SQL Server-database die zo klein is dat deze om de dag moet groeien, waardoor de schijfwaarschuwingen midden in de nacht worden verhoogd? Het klinkt misschien gek, maar de waarheid is dat dit gebeurt en dat je er soms geen controle over hebt.
Enkele punten om te overwegen voor de proactieve DBA
Voordat u de ondersteuning van de productiedatabases overneemt, moet u bij uw voorganger navragen wat de prognoses zijn op het gebied van databasegroei. Is de initiële omvang van de databases die u gaat beheren voldoende groot? Maak je geen zorgen als de huidige omvang van de database veel groter is dan de gegevens die het momenteel heeft. Onthoud dat u die schijfcapaciteitsoproepen om 03:00 uur 's nachts niet wilt, terwijl u dit volledig had kunnen vermijden door een database van de juiste grootte te hebben. Het is een algemene trend voor databasebeheerders in de hele industrie om 's avonds laat hun leven op te offeren voor alledaagse problemen die eigenlijk helemaal niet hadden moeten gebeuren. Houd naast de databasegrootte ook rekening met de schijfcapaciteit van de server. U wilt niet dat de schijfgrootte veel te klein is dan wat een database aankan. Dit zijn allemaal eenvoudige dingen die van pas komen op het moment van plannen. Zoals u weet, is het echter niet altijd een databaseprofessional die databases installeert of configureert. Het belangrijkste om op te merken is om de basis goed te krijgen met uw database in termen van grootte en het is mogelijk dat u deze opdracht nooit hoeft uit te voeren. Echter, zoals altijd, als DBA, zijn er momenten waarop u dingen niet onder controle hebt en gedurende deze tijd kunt u DBCC Shrink-bestandsopdrachten gebruiken voor efficiënt gebruik.
Wanneer kan ik DBCC ShrinkFile gebruiken?
Je hebt zojuist midden in je slaap een schijfruimtewaarschuwing ontvangen en je hebt strikte SLA's waaraan je moet voldoen. Het prioriteitsniveau is een P2 en de SLA kan zeer binnenkort worden geschonden. En je realiseert je dat het uitbreiden van de schijf niet snel zal gebeuren, in dat geval, houd in dat geval je DBCC ShrinkFile-commando's bij de hand zodat je ze kunt gebruiken om de ruimte terug te winnen. Zoals de naam al doet vermoeden, verkleint het het bestand met de gegevens of het logbestand van de database. Maar voordat u begint met het uitvoeren van de DBCC ShrinkFile-opdrachten, probeer eerst te controleren waarom het databasebestand groeit.
- Is het bestand gegroeid door een langlopende transactie?
- Is er enige vorm van blokkering op de server?
- Gebeurt er een grote applicatie-release waar u niet over bent geïnformeerd? (Dit gebeurt meestal)
- Is er een probleem met databasereplicatie of spiegeling dat databasegroei veroorzaakt?
Het is belangrijk om zo snel mogelijk antwoord op deze vragen te krijgen. Over het algemeen is er één antwoord op al deze vragen en het is een geweldige gratis tool genaamd sp_whoisactive. Er zijn geen woorden om het enorme gebruik van deze tool te beschrijven en ik heb het meerdere keren gebruikt om tal van productiegerelateerde problemen op te lossen. U kunt de nieuwste code downloaden via deze link:http://whoisactive.com/ . Het is gemakkelijk en eenvoudig te gebruiken en geeft de uitvoer in een mum van tijd terug. Als je een doorgewinterde DBA bent, heb je dit al tot je beschikking.
DBCC ShrinkFile met voorbeelden
De syntaxis voor het DBCC ShrinkFile is eenvoudig en ongecompliceerd, zie onderstaand voorbeeld.
use YOURDATABASE go DBCC Shrinkfile(FileName,1024)
In het bovenstaande voorbeeld wordt de bestandsnaam die bij YOURDATABASE hoort, verkleind tot 1024 MB. U kunt dezelfde bewerking uitvoeren met SQL Server Management Studio (SSMS). Klik met de rechtermuisknop op de database, ga naar Taken , selecteer Krimpen , en dan Bestanden .
Zodra u op Bestanden . klikt , krijg je dit venster.
Hier heeft u de mogelijkheid om het bestandstype te selecteren:Data, Log of Filestream Data en indien nodig de “Shrink action” uit te voeren. Het is gemakkelijker om het DBCC-commando zelf te gebruiken voor krimpdoeleinden.
DBCC ShrinkFile gebruiken met extra opties
U kunt de opdracht DBCC ShrinkFile uitvoeren met extra opties:emptyfile, notruncate of truncateonly.
Leeg bestand
U kunt het lege bestand commando gebruiken zoals hieronder.
use YOURDATABASE go dbcc shrinkfile(FileName,emptyfile)
Dit zal helpen om de gegevens naar andere bestanden binnen dezelfde bestandsgroep te verplaatsen. Als u klaar bent, kunt u een databasebestand verwijderen als dit niet langer nodig is. Er zijn echter weinig dingen om op te merken met deze lege-bestandsoptie, aangezien u niet veel zou kunnen doen om de inhoud van het primaire gegevensbestand met bestands-ID 1 te legen. Voer dit script uit om het bestands-ID-nummer te krijgen.
select file_id, name,physical_name from sys.database_files
In dit voorbeeld is de bestandsnaam "mo" en is file_id 1. Wanneer u probeert het bestand mo met file_id 1 te legen, krijgt u deze foutmelding.
Dit komt omdat er systeeminformatie in het originele bestand zit, die niet kan worden geleegd. Maar als u hetzelfde commando probeert op het andere gegevensbestand "mo2data", zal het lege bestandscommando slagen.
Notruncate
Zoals de naam al doet vermoeden, wordt er geen ruimte vrijgemaakt voor het besturingssysteem. Dit lijkt meer op een interne bewerking in het bestand waarbij de pagina's opnieuw worden gedistribueerd binnen het bestand zelf zonder de algehele grootte van het databasebestand te wijzigen. Hierdoor is de kans op versnippering groot. Zie het voorbeeld hieronder.
-- Example only Use YourDatabase go DBCC SHRINKFILE (filename,notruncate); GO
Alleen afkappen
Zoals de naam al doet vermoeden, wordt de vrije ruimte vanaf het einde van het bestand weer vrijgegeven aan het besturingssysteem. Dit is verreweg de veiligste bewerking die u kunt uitvoeren met DBCC ShrinkFile. Zie het voorbeeld hieronder.
-- Example only Use YourDatabase go DBCC SHRINKFILE (filename,truncateonly); GO
Wat te doen als DBCC ShrinkFile in het transactielogboek niet werkt zoals verwacht? Raadpleeg deze veilige methode om het probleem op te lossen
Soms werkt deze opdracht niet zoals verwacht. Ervan uitgaande dat u een situatie hebt waarin u het logbestand van een database probeert te verkleinen en het lijkt niet te werken. Hieronder staan enkele stappen die u kunt nemen om te begrijpen waarom de psychiater niet werkt zoals verwacht. U zult merken dat het krimpbestand als geslaagd wordt weergegeven, maar de grootte van het logbestand wordt niet kleiner. Voer in dat geval deze opdracht uit om een paar dingen over het gebruik van het logbestand te controleren.
select name,log_reuse_wait_desc,* from sys.databases
Op de schermafbeelding kunt u zien dat de kolom log_reuse_wait_desc wacht op logback-up.
Hier kunt u zien dat de logback-up voor de database moet worden uitgevoerd voordat u het logbestand echt kunt verkleinen. Als dit zich in een productiedatabase bevindt, probeer dan de logback-up uit te voeren op een andere schijf waar ruimte beschikbaar is. Gebruik de onderstaande voorbeeldopdracht om de logback-up uit te voeren.
backup log DBName to disk='C:\Program Files\Microsoft SQL Server\MSSQL15.A1\MSSQL\Backup\DBName.trn' with init,stats,compression
Nadat u de back-upopdracht hebt uitgevoerd, voert u de onderstaande opdracht opnieuw uit om de status van de log_reuse_wait_desc-kolom te bekijken.
select name,log_reuse_wait_desc,* from sys.databases
Op de schermafbeelding kunt u zien dat de status voor de log_reuse_wait_desc-kolom is gewijzigd in "Niets".
Hier kunt u zien dat de status voor de kolom "log_reuse_wait_desc" is gewijzigd in "Niets". In uw geval kan het nog steeds worden weergegeven als "LOG_BACKUP". Ga door met het maken van logboekback-ups voor de database totdat de status verandert in "Niets". De reden dat u mogelijk nog steeds de status "LOG_BACKUP" ziet, zelfs na het uitvoeren van back-ups van transactielogboeken, is omdat er mogelijk geen VLF's zijn gewist nadat u de back-up van het transactielogboek hebt uitgevoerd. VLF staat voor Virtuele logbestanden en maakt deel uit van de interne architectuur van het transactielogboek. Transactielogbestanden bestaan uit deze VLF's. U kunt informatie over de VLF's krijgen door deze opdracht uit te voeren.
select * from sys.dm_db_log_info(5)
Hier vertegenwoordigt 5 de database_id. De schermafbeelding van de uitvoer wordt weergegeven. Het aantal geretourneerde rijen vertegenwoordigt het werkelijke aantal virtuele logbestanden (VLF's) in de database. U kunt de kolom "vlf_status" controleren om de status van het virtuele logbestand te controleren. Waarde 2 betekent dat het actief is. Met deze opdracht kunt u de interne vlaggen in het transactielogboekbestand controleren om te begrijpen waarom het transactielogboek niet wordt vrijgegeven, zelfs niet na het uitvoeren van logboekback-ups.
Voorheen was de opdracht die werd gebruikt DBCC LOGINFO die vergelijkbare informatie opleverde.
Wat te doen als DBCC ShrinkFile in het transactielogboek niet werkt zoals verwacht? Iets dat u kunt uitvoeren in een niet-prod-omgeving. Echter niet aanbevolen in een productieomgeving
Je zou op meerdere websites mensen zijn tegengekomen die aanbevelen om het herstelmodel in een eenvoudig model te veranderen en vervolgens een krimpbestand uit te voeren om ruimte vrij te maken voor het besturingssysteem. Houd er rekening mee dat het wijzigen van het herstelmodel naar een eenvoudig model van invloed is op het herstel van uw database, omdat u niet naar een specifiek tijdstip kunt herstellen. Dit hangt weer af van uw zakelijke SLA. U kunt het herstelmodel wijzigen met behulp van T-SQL (hieronder) of met behulp van de GUI.
alter database DB_NAME set recovery simple
Gebruik de GUI om het herstelmodel te wijzigen zoals weergegeven. Klik met de rechtermuisknop op de database, ga naar "Eigenschappen", klik op "Opties". Selecteer onder "Opties" het "Herstelmodel".
U zult merken dat alleen het wijzigen van het herstelmodel naar Eenvoudig de ruimte niet teruggeeft aan het besturingssysteem. U moet expliciet de opdracht DBCC ShrinkFile uitvoeren om het bestand te verkleinen en de ruimte terug te winnen. Zie het voorbeeldscript hieronder. Deze opdracht verkleint uw bestandsnaam tot 1024 MB.
use YOURDATABASE go DBCC Shrinkfile(FileName,1024)
Automatisch verkleinen database-optie
U zult merken dat er een optie is die bekend staat als "Auto Shrink" in de database-eigenschappen. Klik met de rechtermuisknop op de database om de database-eigenschap te bekijken. Onder het gedeelte opties ziet u deze optie zoals weergegeven. Aan de modeldatabase-instelling kunt u zien dat de optie "Automatisch verkleinen" standaard is uitgeschakeld. Dus wanneer er een nieuwe database wordt gemaakt, is deze optie ook uitgeschakeld. Er kunnen gevallen zijn waarin databaseprofessionals deze optie onbewust ingeschakeld laten zonder zich bewust te zijn van de negatieve gevolgen van het aan laten staan.
Voer deze opdracht uit om de status van deze optie voor de databases op de server te controleren.
select name,is_auto_shrink_on,* from sys.databases
U zult deze uitvoer zien.
Als u bij toeval ziet dat het is ingeschakeld, kunt u het uitschakelen met behulp van de GUI of u kunt de onderstaande opdracht uitvoeren op de database.
ALTER DATABASE YOUR_DATABASE set AUTO_SHRINK OFF
Andere onderhoudssuggesties
Raadpleeg deze paar aanvullende tips om het probleem van databasegroei te voorkomen, waardoor u DBCC ShrinkFile-opdrachten moet uitvoeren.
- Zorg ervoor dat het herstelmodel van uw databases is afgestemd op zakelijke SLA's. Als uw bedrijf geen herstel op een bepaald tijdstip nodig heeft voor testdatabases, laat ze dan gewoon in een eenvoudig herstelmodel. Ik heb meerdere keren gezien dat het herstelmodel van de databases compleet was, terwijl het herstel in orde was met de nieuwste volledige back-up
- Zorg voor een goede monitoring, vooral bij databasegroei. U moet gewaarschuwd worden wanneer het gebruik van het logbestand 85% bereikt. Dit geeft je wat tijd om het ruimteprobleem op te lossen
- Zorg ervoor dat er regelmatig back-ups van logbestanden worden gemaakt als de database zich in het volledige herstelmodel bevindt en dat u gewaarschuwd moet worden als een van de logback-ups mislukt
- Zorg ervoor dat er voldoende ruimte is op de databaseschijven om problemen met ruimtegebrek te voorkomen
- Ontwikkel voor databases die kunnen worden gearchiveerd enkele archiefstrategieën zodat u oudere gegevens naar een andere database kunt verplaatsen om rapporten te maken en die database alleen-lezen te maken. Dit geeft u meer controle over de grootte van de database
- Zorg ervoor dat u regelmatig integriteitscontroles op uw database uitvoert met DBCC CheckDB. Raadpleeg dit artikel voor meer informatie:https://codingsight.com/dbcc-checkdb-overview/
Conclusie
- Uit dit artikel heb je een goed begrip gekregen van het gebruik van het DBCC ShrinkFile-commando
- Je hebt geleerd over de risico's van het uitvoeren van de DBCC ShrinkFile-opdrachten
- Je hebt de verschillende opties geleerd die we kunnen bieden met behulp van de DBCC ShrinkFile-opdrachten
- Je hebt de opties gezien die we kunnen proberen als het transactielogboek niet kleiner wordt met de DBCC ShrinkFile-opdrachten
- Je hebt geleerd over de standaardinstelling voor automatisch verkleinen in de database-eigenschap
- Je hebt ook andere suggesties voor databaseonderhoud geleerd om je databases gezond te houden
- Zorg er ten slotte voor dat u in ieder geval klaar bent voor die UIT-dagen die u misschien niet in de hand heeft