DBCC SHRINKDATABASE (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analyticssql database v Microsoft Fabric

Zmenší velikost dat a souborů protokolu v zadané databázi.

Nepovažujte zmenšovací operace za běžnou údržbu. Data a soubory protokolů, které se zvětšují kvůli pravidelným opakovaným obchodním operacím, nevyžadují operace zmenšení.

Transact-SQL konvence syntaxe

Syntaxe

Syntaxe SQL Serveru:

DBCC SHRINKDATABASE
( database_name | database_id | 0
     [ , target_percent ]
     [ , { 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 }

Syntaxe pro Azure Synapse Analytics:

DBCC SHRINKDATABASE
( database_name
     [ , target_percent ]
)
[ WITH NO_INFOMSGS ]

Argumenty

{ database_name | database_id | 0 }

Název nebo ID databáze se zmenšuje. Hodnota 0 určuje aktuální databázi.

target_percent

Procento volného místa, které zůstane v databázovém souboru po dokončení operace zmenšení.

Pokud zadáte target_percent s TRUNCATEONLY, operace zmenšování nemusí uvolnit volné místo na konci souboru.

ZKRÁCENÍ

Přesune přiřazené stránky z konce souboru na nepřiřazené stránky před souborem. Tato akce zkomprimuje data v souboru. target_percent je volitelné. Azure Synapse Analytics tuto možnost nepodporuje.

Volné místo na konci souboru se nevrátí do operačního systému a fyzická velikost souboru se nezmění. Databáze se proto při zadávání NOTRUNCATEzdá, že se nezmenšuje.

NOTRUNCATE Platí pouze pro datové soubory. NOTRUNCATE nemá vliv na soubor protokolu.

TRUNCATEONLY

Uvolní veškeré volné místo na konci souboru do operačního systému. Nepřesune žádné stránky uvnitř souboru. Datový soubor se zmenší pouze do posledního přiřazeného rozsahu. Azure Synapse Analytics tuto možnost nepodporuje.

Pokud zadáte target_percent s TRUNCATEONLY, operace zmenšování nemusí uvolnit volné místo na konci souboru.

S NO_INFOMSGS

Potlačí všechny informační zprávy, které mají úrovně závažnosti od 0 do 10.

WAIT_AT_LOW_PRIORITY s operacemi zmenšení

Platí na: SQL Server 2022 (16.x) a novější verze, Azure SQL Database, Azure SQL Managed Instance, SQL databázi v Microsoft Fabric

Funkce čekání při nízké prioritě snižuje boj o zámek během operace zmenšení. Další informace naleznete v tématu Vysvětlení problémů souběžnosti s DBCC SHRINKDATABASE.

Tato funkce je podobná WAIT_AT_LOW_PRIORITY při online operacích s indexy, ačkoli s několika rozdíly.

  • Nemůžete specifikovat ABORT_AFTER_WAIT možnost NONE.
  • Nemůžeš nastavit MAX_DURATION tuto možnost. Časový limit pro zmenšovací operaci s nízkou prioritou je vždy jedna minuta.

Čekat s nízkou prioritou

Když je příkaz zmenšení vykonán v režimu WAIT_AT_LOW_PRIORITY , dotazy vyžadující uzamčení stabilitySch-S () schématu na stránkách Index Allocation Map (IAM) nejsou blokovány operací zmenšení. Operace zmenšení však může být zablokována zámkem Sch-S na stránce IAM. Shrink pokračuje v vykonávání pouze tehdy, když dokáže získat zámek schema modify (Sch-M) na požadovanou stránku IAM.

Pokud operace zmenšování v WAIT_AT_LOW_PRIORITY režimu nemůže získat tento zámek kvůli dlouhodobému dotazu Sch-S držícímu zámek, operace zmenšení vyprší s chybou 49516, například: 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 = [ SELF | BLOKÁTORY ] }

  • SELF

    SELF je výchozí možností. Ukončit operaci zmenšení databáze, která právě probíhá, bez dalšího kroku.

  • BLOCKERS

    Ukončete všechny uživatelské transakce, které blokují operaci zmenšení souboru, aby operace nemohla pokračovat. Možnost BLOCKERS vyžaduje, aby přihlášení mělo oprávnění ALTER ANY CONNECTION nebo KILL DATABASE CONNECTION nebo oprávnění.

Sada výsledků

Následující tabulka popisuje sloupce v sadě výsledků.

Název sloupce Popis
DbId Identifikační číslo souboru, který se databázový stroj pokusil zmenšit.
FileId Identifikační číslo souboru, který se databázový stroj pokusil zmenšit.
CurrentSize Počet 8 kB stránek, které soubor aktuálně zabírá.
MinimumSize Minimálně počet 8 kB stránek, které může soubor zabírat. Tato hodnota odpovídá minimální velikosti nebo původně vytvořené velikosti souboru.
UsedPages Počet stránek, které soubor aktuálně používá, je 8 kB.
EstimatedPages Počet 8 KB stránek, na které databázový stroj odhaduje, že by mohlo dojít ke zmenšení souboru.

Poznámka

Database Engine nezobrazuje řádky pro soubory, které nejsou zmenšené.

Poznámky

Pokud chcete zmenšit všechna data a soubory protokolu pro konkrétní databázi, spusťte příkaz DBCC SHRINKDATABASE. Pokud chcete zmenšit data nebo soubor protokolu najednou pro konkrétní databázi, spusťte příkaz DBCC SHRINKFILE .

Pokud chcete zobrazit aktuální množství volného (nepřiděleného) místa v databázi, spusťte sp_spaceused.

DBCC SHRINKDATABASE operace je možné kdykoli v procesu zastavit a veškerá dokončená práce se zachová.

Databáze nemůže být menší než nakonfigurovaná minimální velikost databáze. Minimální velikost zadáte při původním vytvoření databáze. Nebo minimální velikost může být poslední nastavená explicitně pomocí operace změny velikosti souboru. Příkladem operací, jako jsou DBCC SHRINKFILE nebo ALTER DATABASE, jsou operace změny velikosti souboru.

Představte si, že databáze je původně vytvořená s velikostí 10 MB. Pak se zvětšuje na 100 MB. Nejmenší velikost databáze je možné snížit na 10 MB, i když byla odstraněna všechna data v databázi.

Můžete nastavit NOTRUNCATE tuto možnost nebo možnost TRUNCATEONLY při spuštění DBCC SHRINKDATABASE. Pokud nespecifikujete žádnou z možností, výsledek je stejný, jako když provedete DBCC SHRINKDATABASE operaci s , NOTRUNCATE následovanou DBCC SHRINKDATABASE operací s .TRUNCATEONLY

Zmenšená databáze nemusí být v jednouživatelském režimu. Ostatní uživatelé mohou pracovat v databázi, když se zmenšuje, včetně systémových databází.

Databázi nemůžete zmenšit, když se databáze zálohuje. Naopak nemůžete zálohovat databázi, zatímco probíhá operace zmenšení databáze.

V SQL poolech Azure Synapse se vyhněte spouštění příkazu shrink, protože jde o I/O náročnou operaci, která může váš dedikovaný SQL pool (dříve SQL DW) vyřadit z provozu. Tento příkaz také ovlivňuje náklady na snapshoty datového skladu.

Známé problémy

Platí na: SQL Server, Azure SQL Database, Azure SQL Managed Instance, Azure Synapse Analytics dedicated SQL pool

  • V SQL Server 2022 (16.x) a starších verzích nelze stránky používané LOB sloupcovými typy (varbinary(max),varchar(max) a nvarchar(max)) v komprimovaných segmentech columnstore přesunout o DBCC SHRINKDATABASE a DBCC SHRINKFILE. Další informace najdete v tématu Co je nového v indexech columnstore.

Jak DBCC SHRINKDATABASE funguje

DBCC SHRINKDATABASE zmenší datové soubory na základě jednotlivých souborů, ale zmenší soubory protokolu, jako by všechny soubory protokolů existovaly v jednom souvislém fondu protokolů. Soubory se vždy zmenšují od konce.

Předpokládejme, že máte dva logovací soubory a datový soubor v databázi s názvem mydb. Soubory dat a protokolů jsou 10 MB a datový soubor obsahuje 6 MB dat. Databázový stroj vypočítá cílovou velikost každého souboru. Tato hodnota je cílová velikost souboru po zmenšení. Když zadáte DBCC SHRINKDATABASEtarget_percent, Database Engine vypočítá velikost cíle jako target_percent volného místa v souboru po zmenšení.

Pokud například zadáte target_percent 25 pro zmenšení mydb, databázový stroj vypočítá cílovou velikost datového souboru na 8 MB (6 MB dat plus 2 MB volného místa). Databázový stroj například přesune všechna data z posledních 2 MB datového souboru do libovolného volného místa v prvním 8 MB datového souboru a pak soubor zmenší.

Předpokládejme, že datový soubor mydb obsahuje 7 MB dat. Zadání target_percent 30 umožňuje, aby se tento datový soubor zmenšil na procento volného počtu 30. Když ale zadáte target_percent 40, nezmenší se datový soubor, protože v aktuální celkové velikosti datového souboru nelze vytvořit dostatek volného místa.

Tento problém si můžete představit jiným způsobem: 40 % chtělo volné místo + 70 % plný datový soubor (7 MB z 10 MB) je více než 100 procent. Jakýkoli target_percent větší než 30 nezmenší datový soubor. Nesmrští se, protože součet požadovaného procenta volného místa a aktuálního procenta, které datový soubor zabírá, přesahuje 100 procent.

Pro soubory protokolu používá Databázový stroj target_percent k výpočtu cílové velikosti pro celý protokol. Proto target_percent je množství volného místa v protokolu po operaci zmenšení. Cílová velikost celého protokolu se pak přeloží na cílovou velikost každého souboru protokolu.

DBCC SHRINKDATABASE se pokusí okamžitě zmenšit každý fyzický soubor protokolu na cílovou velikost. Pokud žádná část logického logu nezůstane ve virtuálních logech nad rámec cílové velikosti log souboru, DBCC SHRINKDATABASE úspěšně se soubor zkrátí a skončí bez jakýchkoli zpráv. Pokud ale část logického protokolu zůstane ve virtuálních protokolech nad cílovou velikostí, databázový stroj uvolní co nejvíce místa a pak vydá informační zprávu. Zpráva popisuje akce k přesunu logického logu z virtuálních logů na konci souboru. Po provedení akcí použijte DBCC SHRINKDATABASE k uvolnění zbývajícího místa.

Logovací soubor můžete zmenšit pouze na virtuální hranici log souboru. Proto není možné zmenšit logovací soubor na velikost menší než virtuální logovací soubor. Database Engine dynamicky vybírá velikost virtuálního logovacího souboru při vytváření nebo rozšiřování logovacích souborů.

Vysvětlení problémů souběžnosti s DBCC SHRINKDATABASE

Příkazy zmenšit databázi a zmenšit soubor mohou vést ke problémům s souběžností, zejména při aktivní údržbě, jako je obnova indexů, nebo v rušných OLTP prostředích.

Například uživatelský dotaz může získat uzamčení stability schématu (Sch-S) na stránce Index Allocation Map (IAM) a držet jej až do dokončení. Při pokusu o obnovení místa při běžném používání vyžadují operace s zmenšováním databáze a zmenšováním souborů zámek pro úpravu schématu (Sch-M) při přesunu nebo mazání IAM stránek, čímž blokují zámky Sch-S potřebné pro uživatelské dotazy. Výsledkem je, že dlouhodobé dotazy mohou zablokovat operaci zmenšení. Toto chování také znamená, že jakýkoli nový dotaz vyžadující Sch-S zámek na IAM stránce může být frontován za operaci zmenšení, což tento problém se souběžností ještě zhoršuje.

Funkce čekání při nízké prioritě pro operace zmenšení, zavedená v SQL Server 2022 (16.x), řeší tento problém tím, že v režimu převezme zámek schématu na IAM stránkáchWAIT_AT_LOW_PRIORITY. Další informace naleznete v části WAIT_AT_LOW_PRIORITY se zmenšovacími operacemi.

Pro více informací o Sch-SSch-M a zámecích viz průvodce Transaction locking and row versioning.

Osvědčené postupy

Při plánování zmenšení databáze zvažte následující informace:

  • Operace zmenšení je nejúčinnější po operaci, která vytváří nevyužité místo, například po operaci zkrácení tabulky nebo operaci zrušení tabulky.

  • Většina databází vyžaduje určité volné místo pro běžné každodenní operace. Pokud opakovaně zmenšujete databázový soubor a všimnete si, že se opět zvětšuje, tento růst naznačuje, že běžné operace vyžadují volné místo. V těchto případech je opakované zmenšování databázového souboru kontraproduktivní. Zvětšení souboru potřebné k přidělení nového místa po zmenšení může výkon omezit.

  • Operace zmenšování nezachovává fragmentaci indexů v databázi a může zvýšit fragmentaci indexu, což může snížit propustnost čtení I/O u dotazů používajících velké skeny.

  • Pokud nemáte konkrétní požadavek, nenastavujte AUTO_SHRINK nastavení databáze na ON.

  • Pokud potřebujete zmenšit datové soubory velké databáze, zvažte použití PowerShell skriptu ShrinkDriver . Skript automatizuje a zjednodušuje proces zmenšování, čímž jej proměňuje v jedinou, pozorovatelnou a obnovovatelnou operaci. Skript zmenšuje více souborů paralelně, při přerušení se znovu pokusí a během běhu generuje podrobné hlášení o stavu.

Řešení potíží

Transakce běžící pod izolační úrovní založenou na verzování řádků může blokovat operace zmenšení. Například spouštíte DBCC SHRINKDATABASE , zatímco probíhá rozsáhlá operace mazání pod úrovní izolace založené na verzování řádku. V tomto případě operace zmenšování čeká na dokončení mazání, než soubory zmenší. Při čekání na operaci zmenšení zobrazí operace DBCC SHRINKFILE a DBCC SHRINKDATABASE informační zprávu (5202 pro SHRINKDATABASE a 5203 pro SHRINKFILE). Tato zpráva se vytiskne do error logu SQL Server každých pět minut v první hodině a pak každou další hodinu. Pokud například protokol chyb obsahuje následující chybovou zprávu:

DBCC SHRINKDATABASE for database ID 9 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.

Tato chyba znamená, že snapshot transakce s časovými razítky staršími než 109 blokují operaci zmenšení. Tato transakce je poslední transakce, kterou operace zmenšení dokončila. Také označuje, že transaction_sequence_num sloupce or first_snapshot_sequence_num v zobrazení dynamické správy sys.dm_tran_active_snapshot_database_transactions obsahují hodnotu 15. Sloupec transaction_sequence_num nebo first_snapshot_sequence_num v zobrazení může obsahovat číslo, které je menší než poslední transakce dokončená operací zmenšení (109). Pokud ano, operace zmenšení čeká na dokončení těchto transakcí.

K vyřešení problému můžete udělat jednu z následujících metod:

  • Ukončete transakci, která blokuje operaci zmenšení.
  • Ukončete operaci zmenšení. Veškerá dokončená práce se uchovává.
  • Nedělejte nic a nechte operaci zmenšení čekat, dokud se blokující transakce nedokončí.

Dovolení

Vyžaduje členství v pevné roli serveru sysadmin nebo db_owner pevné databázové roli.

Příklady

Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorks2025 nebo AdventureWorksDW2025, kterou si můžete stáhnout z domovské stránky Microsoft SQL Serveru pro ukázky a komunitní projekty .

A. Zmenšení databáze a zadání procenta volného místa

Následující příklad zmenšuje velikost dat a souborů protokolu v uživatelské databázi UserDB tak, aby umožňovala 10% volné místo v databázi.

DBCC SHRINKDATABASE (UserDB, 10);
GO

B. Zkraťte databázi

Následující příklad zmenší data a soubory protokolu v ukázkové databázi AdventureWorks2025 do posledního přiřazeného rozsahu.

DBCC SHRINKDATABASE (AdventureWorks2025, TRUNCATEONLY);

C. Zmenšení databáze Azure Synapse Analytics

DBCC SHRINKDATABASE (database_A);
DBCC SHRINKDATABASE (database_B, 10);

D. Zmenšte databázi pomocí WAIT_AT_LOW_PRIORITY

Následující příklad se pokusí zmenšit velikost dat a souborů protokolu v databázi AdventureWorks2025 tak, aby umožňovala 20% volného místa v databázi. Pokud se zámek nedá získat během jedné minuty, operace zmenšení se zastaví.

DBCC SHRINKDATABASE ([AdventureWorks2025], 20) WITH WAIT_AT_LOW_PRIORITY (ABORT_AFTER_WAIT = SELF);