Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-databas i Microsoft Fabric
Krymper den aktuella databasens angivna data- eller loggfilstorlek. Du kan använda den för att flytta data från en fil till andra filer i samma filgrupp, vilket tömmer filen och tillåter borttagning av databasen. Du kan krympa en fil till mindre än dess storlek när den skapas och återställa den minsta filstorleken till det nya värdet.
DBCC SHRINKFILE Använd endast när det är nödvändigt eftersom krympning är en långvarig och resurskrävande verksamhet.
Observera
Behandla inte krympningsoperationer som regelbundet underhåll. Data och loggfiler som växer på grund av regelbundna återkommande affärsåtgärder kräver inte krympningsåtgärder.
Transact-SQL syntaxkonventioner
Syntax
DBCC SHRINKFILE
(
{ file_name | file_id }
{ [ , EMPTYFILE ]
| [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATEONLY } ] ]
}
)
[ WITH
{
[ WAIT_AT_LOW_PRIORITY
[ (
<wait_at_low_priority_option_list>
) ]
]
[ , NO_INFOMSGS ]
}
]
<wait_at_low_priority_option_list> ::=
<wait_at_low_priority_option>
| <wait_at_low_priority_option_list> , <wait_at_low_priority_option>
<wait_at_low_priority_option> ::=
ABORT_AFTER_WAIT = { SELF | BLOCKERS }
Argument
file_name
Det logiska namnet på filen att krympa.
file_id
Identifieringsnumret (ID) för filen ska krympa. Om du vill hämta ett fil-ID använder du systemfunktionen FILE_IDEX eller frågar sys.database_files katalogvyn i den aktuella databasen.
målstorlek
Ett heltal som representerar filens nya megabytestorlek. Om du ställer in target_size till eller 0 inte specificerar det, DBCC SHRINKFILE minskar filen till dess skapande storlek.
Du kan minska standardstorleken för en tom fil med DBCC SHRINKFILE <target_size>. Om du till exempel skapar en 5 MB-fil och sedan krymper filen till 3 MB medan filen fortfarande är tom, är standardfilens storlek inställd på 3 MB. Detta gäller endast för tomma filer som aldrig har innehållit data.
Det här alternativet stöds inte för FILESTREAM-filgruppscontainrar.
Om det anges DBCC SHRINKFILE försöker du krympa filen till target_size. Använda sidor i filens område som ska frigöras flyttas till ledigt utrymme i filens behållna områden. Med en datafil på 10 MB flyttas till exempel en DBCC SHRINKFILE åtgärd med en 8target_size alla använda sidor i filens sista 2 MB till alla oallokerade sidor i filens första 8 MB.
DBCC SHRINKFILE krymper inte en fil efter den nödvändiga lagrade datastorleken. Om till exempel 7 MB av en datafil på 10 MB används, krymper en DBCC SHRINKFILE instruktion med en target_size på 6 filen till endast 7 MB, inte 6 MB.
Om du specificerar target_size med TRUNCATEONLY, kanske det DBCC SHRINKFILE inte frigörs ledigt utrymme i slutet av filen.
TOMFIL
Migrerar alla data från den angivna filen till andra filer i samma filgrupp. Med andra ord migrerar EMPTYFILE data från en angiven fil till andra filer i samma filgrupp.
EMPTYFILE försäkrar dig om att inga nya data läggs till i filen, trots att filen inte är skrivskyddad. Du kan använda uttalandet ALTER DATABASE för att ta bort en fil. Om du använder satsen ALTER DATABASE för att ändra filstorlek återställs skrivskyddade flaggan och data kan läggas till.
För FILESTREAM-filgruppscontainrar kan du inte använda ALTER DATABASE för att ta bort en fil förrän FILESTREAM-skräpinsamlaren har kört och tagit bort alla onödiga filgruppscontainerfiler som EMPTYFILE har kopierat till en annan container. Mer information finns i sp_filestream_force_garbage_collection. För information om hur man tar bort en FILESTREAM-container, se motsvarande avsnitt i ALTER DATABASE Fil- och filgruppsalternativ
EMPTYFILEstöds inte i Azure SQL Database, Azure SQL Database Hyperscale eller SQL-databas i Microsoft Fabric.
NOTRUNCATE
Flyttar allokerade sidor från en datafils slut till oallokerade sidor i en fils front med eller utan att ange target_percent. Det lediga utrymmet i filens slut returneras inte till operativsystemet och filens fysiska storlek ändras inte. Om NOTRUNCATE anges verkar filen därför inte krympa.
NOTRUNCATE gäller endast för datafiler. Loggfilerna påverkas inte.
Det här alternativet stöds inte för FILESTREAM-filgruppscontainrar.
TRUNKERA ENDAST
Frigör allt ledigt utrymme i slutet av filen till operativsystemet, men utför ingen sidflytt i filen. Datafilen krymps endast till den senaste allokerade omfattningen.
Om target_size anges med TRUNCATEONLYfrigörs eventuellt inte ledigt utrymme i slutet av filen.
Alternativet TRUNCATEONLY flyttar inte information i loggen, men tar bort inaktiva virtuella loggfiler (VLF) från slutet av loggfilen. Det här alternativet stöds inte för FILESTREAM-filgruppscontainrar.
MED NO_INFOMSGS
Undertrycker alla informationsmeddelanden.
WAIT_AT_LOW_PRIORITY med krympningsoperationer
Gäller för: SQL Server 2022 (16.x) och senare versioner, Azure SQL Database, Azure SQL Managed Instance, SQL database i Microsoft Fabric
Funktionen 'vänta vid låg prioritet' minskar låskonkurrens under krympningsoperationen. För mer information, se Förstå samtidighetsproblem med DBCC SHRINKFILE.
Den här funktionen liknar WAIT_AT_LOW_PRIORITY med onlineindexåtgärder, med vissa skillnader.
- Du kan inte ange
ABORT_AFTER_WAITalternativetNONE. - Du kan inte ställa in
MAX_DURATIONvalet. Tidsavslutningen för lågprioriterat lås för en krympoperation är alltid en minut.
Vänta med låg prioritet
När ett shrink-kommando körs i WAIT_AT_LOW_PRIORITY mode blockeras inte frågor som kräver schema stability (Sch-S) låsningar på Index Allocation Map (IAM)-sidorna av shrink-operationen. Dock kan krympningsoperationen blockeras av ett Sch-S lås på en IAM-sida. Shrink fortsätter att köras endast när den kan få ett schema modifiera lås () lås påSch-M en IAM-sida som det kräver.
Om en krympoperation i WAIT_AT_LOW_PRIORITY läge inte kan få detta lås på grund av en långvarig fråga som håller ett Sch-S lås, går krympoperationen ut med fel 49516, till exempel: Msg 49516, Level 16, State 1, Line 134 Shrink timeout waiting to acquire schema modify lock in WLP mode to process IAM pageID 1:2865 on database ID 5.
{ ABORT_AFTER_WAIT = [ SJÄLV | BLOCKERARE ] }
Gäller för: SQL Server (SQL Server 2022 (16.x och senare versioner), Azure SQL Database, SQL-databas i Microsoft Fabric.
SELFSELFär standardalternativet. Avsluta den krympfilsoperation som för närvarande körs utan att vidta några ytterligare åtgärder.BLOCKERSAvsluta alla användartransaktioner som blockerar krympningsfilåtgärden så att åtgärden kan fortsätta. Alternativet
BLOCKERSkräver att inloggningen harALTER ANY CONNECTIONOR-behörighetKILL DATABASE CONNECTION.
Resultatuppsättning
I följande tabell beskrivs kolumner för resultatuppsättningar.
| Kolumnnamn | Beskrivning |
|---|---|
DbId |
Databasidentifieringsnumret för filen som databasmotorn försökte krympa. |
FileId |
Filidentifieringsnumret för filen som databasmotorn försökte krympa. |
CurrentSize |
Antal 8 KB-sidor som filen för närvarande upptar. |
MinimumSize |
Antal 8-KB-sidor som filen minst kan uppta. Det här talet motsvarar den minsta storleken eller ursprungligen skapade storleken på en fil. |
UsedPages |
Antal 8 KB-sidor som för närvarande används av filen. |
EstimatedPages |
Antal 8 KB-sidor som databasmotorn uppskattar att filen kan krympas ned till. |
Anmärkningar
DBCC SHRINKFILE gäller för den aktuella databasens filer. För mer information om hur du ändrar den aktuella databasen, se USE.
Du kan stoppa DBCC SHRINKFILE åtgärder när som helst och allt slutfört arbete bevaras. Om du använder parametern EMPTYFILE och avbryter åtgärden markeras inte filen för att förhindra att ytterligare data läggs till.
Andra användare kan arbeta i databasen när filen krymper. databasen behöver inte vara i enanvändarläge. Du behöver inte köra instansen av SQL Server i enanvändarläge för att krympa systemdatabaserna.
Kända problem
Gäller för: SQL Server, Azure SQL Database, SQL database in Microsoft Fabric, Azure SQL Managed Instance, Azure Synapse Analytics dedicated SQL pool
- I versioner av SQL Server tidigare än SQL Server 2025 (17.x) kan sidorna som används av kolumntyper av stora objekt (LOB) (varbinary(max),varchar(max) och nvarchar(max)) i komprimerade kolumnstore-segment inte flyttas av
DBCC SHRINKDATABASEochDBCC SHRINKFILE. Mer information finns i Nyheter i kolumnlagringsindex.
Förstå samtidighetsproblem med DBCC SHRINKFILE
Kommandon för att minska databasen och förminska filen kan leda till samtidighetsproblem, särskilt vid aktivt underhåll som att bygga om index, eller i intensiva onlinetransaktionshanteringsmiljöer (OLTP).
Till exempel kan en användarfråga få ett schemastabilitetslås (Sch-S) på en Index Allocation Map (IAM)-sida och hålla den tills den är klar. Vid försök att återta utrymme vid vanlig användning kräver krympningsdatabas och förminskningsfiloperationer ett schema-modifieringslås (Sch-M) vid flytt eller borttagning av IAM-sidor, vilket blockerar de Sch-S lås som användarens frågor behöver. Som ett resultat kan långvariga frågor blockera en krympningsoperation. Detta innebär också att alla nya frågor som kräver lås Sch-S på en IAM-sida kan köas bakom krympningsoperationen, vilket ytterligare förvärrar detta samtidighetsproblem.
Introducerad i SQL Server 2022 (16.x), åtgärdar funktionen 'vänta vid låg prioritet för krympoperationer' detta problem genom att ta schema-modifieringslåset på IAM-sidor i lägetWAIT_AT_LOW_PRIORITY. För mer information, se WAIT_AT_LOW_PRIORITY med komprimeringsoperationer.
För mer information om Sch-S lås, Sch-M se Transaction locking and row versioning guide.
Krympa en loggfil
För loggfiler använder databasmotorn target_size för att beräkna hela loggens målstorlek. Därför är target_size loggens lediga utrymme efter krympningsåtgärden. Hela loggens målstorlek översätts sedan till varje loggfils målstorlek.
DBCC SHRINKFILE försöker krympa varje fysisk loggfil till målstorleken omedelbart. Men om en del av den logiska loggen finns i de virtuella loggarna utöver målstorleken frigör databasmotorn så mycket utrymme som möjligt och utfärdar sedan ett informationsmeddelande. Meddelandet beskriver vilka åtgärder som krävs för att flytta den logiska loggen från de virtuella loggarna i slutet av filen. När åtgärderna har utförts kan DBCC SHRINKFILE användas för att frigöra återstående utrymme.
Eftersom en loggfil bara kan krympas till en gräns för en virtuell loggfil kanske det inte går att krympa en loggfil till en storlek som är mindre än storleken på en virtuell loggfil, även om den inte används. Databasmotorn väljer dynamiskt storleken på den virtuella filloggen när loggfiler skapas eller utökas.
Metodtips
Tänk på följande information när du planerar att krympa en fil:
En krympningsåtgärd är mest effektiv efter en åtgärd som skapar en stor mängd oanvänt utrymme, till exempel en trunkeringstabell eller en drop table-åtgärd.
De flesta databaser kräver lite ledigt utrymme för regelbundna dagliga åtgärder. Om du krymper en databasfil upprepade gånger och märker att databasstorleken växer igen, anger detta att ledigt utrymme krävs för vanliga åtgärder. I dessa fall är det kontraproduktivt att upprepade gånger krympa databasfilen. Den filtillväxt som krävs för att allokera nytt utrymme efter krympning kan hämma prestandan.
En krympningsoperation bevarar inte fragmenteringstillståndet för index i databasen och kan öka indexfragmenteringen, vilket kan minska läs-I/O-genomströmningen för frågor som använder stora skanningar.
Om du behöver krympa datafilerna i en stor databas, överväg att använda PowerShell-skriptet ShrinkDriver . Skriptet automatiserar och förenklar förminskningsprocessen, vilket gör den till en enda, observerbar och återupptagbar operation. Skriptet krymper flera filer parallellt, försöker igen när det avbryts och ger detaljerade statusrapporter medan det körs.
Felsöka
I det här avsnittet beskrivs hur du diagnostiserar och korrigerar problem som kan uppstå när du kör kommandot DBCC SHRINKFILE.
Filen krymper inte
Om filstorleken inte ändras efter en felfri krympningsoperation, prova följande steg för att verifiera att filen har tillräckligt med ledigt utrymme:
Kör följande fråga.
SELECT name, size / 128.0 - CAST (FILEPROPERTY(name, 'SpaceUsed') AS INT) / 128.0 AS AvailableSpaceInMB FROM sys.database_files;Om du vill krympa transaktionsloggfilen, använd den sys.dm_db_log_space_usage dynamiska hanteringsvyn (DMV) för att se det utrymme som används i transaktionsloggen.
Krympningsoperationen kan inte minska filstorleken ytterligare om det inte finns tillräckligt med ledigt utrymme.
En vanlig anledning till att en transaktionsloggfil inte krymper är avsaknaden av regelbundna säkerhetskopior av transaktionsloggar. Om du vill trunkera loggen säkerhetskopierar du transaktionsloggen och kör sedan åtgärden DBCC SHRINKFILE igen. Om återställning i tidpunkt inte krävs, överväg återställningsmodellerna (SQL Server) för att undvika tillväxt av loggfiler.
Krympåtgärden blockeras
En transaktion som körs under en radversionsbaserad isoleringsnivå kan blockera krympningsåtgärder. Om en stor borttagningsåtgärd som körs under en radversionsbaserad isoleringsnivå pågår när en DBCC SHRINKDATABASE-åtgärd körs, väntar en krympningsåtgärd på att borttagningen ska slutföras innan den fortsätter. När blockeringen sker skriver DBCC SHRINKFILE och DBCC SHRINKDATABASE åtgärder ut ett informationsmeddelande (5202 för SHRINKDATABASE och 5203 för SHRINKFILE) till SQL Server-felloggen. Det här meddelandet loggas var femte minut under den första timmen och sedan varje timme. Till exempel:
DBCC SHRINKFILE for file ID 1 is waiting for the snapshot
transaction with timestamp 15 and other snapshot transactions linked to
timestamp 15 or with timestamps older than 109 to finish.
Det här meddelandet innebär att ögonblicksbildtransaktioner med tidsstämplar som är äldre än 109 (den senaste transaktionen som krympningsåtgärden slutförde) blockerar krympningsåtgärden. Det anger också kolumnerna transaction_sequence_num, eller first_snapshot_sequence_num i vyn sys.dm_tran_active_snapshot_database_transactions dynamisk hantering innehåller värdet 15. Om kolumnen transaction_sequence_num eller first_snapshot_sequence_num innehåller ett tal som är mindre än den senaste slutförda transaktionen (109) för en krympningsåtgärd, väntar krympningsåtgärden på att dessa transaktioner ska slutföras.
För att lösa problemet, gör ett av följande steg:
- Avsluta transaktionen som blockerar krympningsåtgärden.
- Avsluta krympningsåtgärden. Allt utfört arbete behålls om krympningsåtgärden avslutas.
- Gör ingenting och låt krympningsåtgärden vänta tills den blockerande transaktionen har slutförts.
Behörigheter
Kräver medlemskap i sysadmin fast serverroll eller db_owner fast databasroll.
Exempel
Kodexemplen i den här artikeln använder AdventureWorks2025- eller AdventureWorksDW2025-exempeldatabasen, som du kan ladda ned från startsidan Microsoft SQL Server Samples och Community Projects.
A. Krymp en datafil till en angiven målstorlek
I följande exempel krymps storleken på en datafil med namnet DataFile1 i UserDB användardatabas till 7 MB.
USE UserDB;
GO
DBCC SHRINKFILE (DataFile1, 7);
GO
B. Krymp en loggfil till en angiven målstorlek
I följande exempel krymper loggfilen i AdventureWorks2025-databasen till 1 MB. För att tillåta kommandot DBCC SHRINKFILE att krympa filen förkortas filen först genom att sätta databasens återställningsmodell till SIMPLE.
USE AdventureWorks2025;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE AdventureWorks2025
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (AdventureWorks2025_Log, 1);
GO
-- Reset the database recovery model.
ALTER DATABASE AdventureWorks2025
SET RECOVERY FULL;
GO
C. Trunkera en datafil
Följande exempel trunkar den primära datafilen i AdventureWorks2025-databasen.
sys.database_files-katalogvyn frågas för att hämta file_id från datafilen.
USE AdventureWorks2025;
GO
SELECT file_id,
name
FROM sys.database_files;
GO
DBCC SHRINKFILE (1, TRUNCATEONLY);
D. Töm en fil
I följande exempel visas hur du tömmer en fil så att den kan tas bort från databasen. För det här exemplet skapas först en datafil och innehåller data.
USE AdventureWorks2025;
GO
-- Create a data file and assume it contains data.
ALTER DATABASE AdventureWorks2025
ADD FILE (NAME = Test1data, FILENAME = 'C:\t1data.ndf', SIZE = 5 MB);
GO
-- Empty the data file.
DBCC SHRINKFILE (Test1data, EMPTYFILE);
GO
-- Remove the data file from the database.
ALTER DATABASE AdventureWorks2025
REMOVE FILE Test1data;
GO
E. Krymp en databasfil med WAIT_AT_LOW_PRIORITY
I följande exempel försöker man minska storleken på en datafil i den aktuella användardatabasen till 1 MB.
sys.database_files katalogvyn efterfrågas för att hämta file_id av datafilen, i det här exemplet file_id 5. Om ett lås inte kan hämtas inom en minut avbryts krympningsåtgärden.
USE AdventureWorks2025;
GO
SELECT file_id,
name
FROM sys.database_files;
GO
DBCC SHRINKFILE (5, 1) WITH WAIT_AT_LOW_PRIORITY (ABORT_AFTER_WAIT = SELF);
Relaterat innehåll
- Krymp en databas
- Krymp en fil
- DBCC KRYMPDATABAS (Transact-SQL)
- Överväganden för inställningarna för automatisk tillväxt och automatisk skalning i SQL Server
- Databasfiler och filgrupper
- sys.database_files (Transact-SQL)
- sys.databaser (Transact-SQL)
- FILE_ID (Transact-SQL)
- ALTER DATABASE (Transact-SQL)
- Hantera filutrymme för databaser i Azure SQL Database