ZMENŠOVACÍ SOUBOR DBCC (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Zmenší zadanou velikost dat nebo souboru protokolu aktuální databáze. Můžete ho použít k přesunutí dat z jednoho souboru do jiných souborů ve stejné skupině souborů, která vyprázdní soubor a umožní jeho odebrání databáze. Soubor můžete zmenšit na menší než jeho velikost při vytváření a resetovat minimální velikost souboru na novou hodnotu.

Používejte DBCC SHRINKFILE pouze v případě nutnosti, protože zmenšování je dlouhodobá a náročná operace.

Poznámka

Neberte zmenšovací operace jako 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

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 }

Argumenty

file_name

Logický název souboru se zmenšuje.

file_id

Identifikační číslo souboru se zmenšuje. Pokud chcete získat ID souboru, použijte funkci systému FILE_IDEX nebo dotazujte zobrazení katalogu sys.database_files v aktuální databázi.

velikost_cíle

Celé číslo představující novou megabajtovou velikost souboru. Pokud target_size nastavíte nebo 0 nespecifikujete, DBCC SHRINKFILE soubor se zmenší na jeho velikost pro vytvoření.

Výchozí velikost prázdného souboru můžete zmenšit pomocí DBCC SHRINKFILE <target_size>. Pokud například vytvoříte soubor o velikosti 5 MB a zmenšíte ho na 3 MB, pokud je soubor stále prázdný, nastaví se výchozí velikost souboru na 3 MB. To platí jenom pro prázdné soubory, které nikdy neobsáhly data.

Tato možnost není podporována pro kontejnery FILESTREAM filegroup.

Pokud je zadaný, DBCC SHRINKFILE pokusí se soubor zmenšit na target_size. Použité stránky v oblasti souboru, které se mají uvolnit, se přesunou do volného místa v uchovávaných oblastech souboru. Například s datovým souborem DBCC SHRINKFILE o velikosti 10 MB se operace s 8target_size přesune všechny použité stránky v posledních 2 MB souboru na všechny nepřidělené stránky v prvních 8 MB souboru. DBCC SHRINKFILE nezmenšuje soubor za požadovanou uloženou velikost dat. Pokud se například použije 7 MB datového souboru 10 MB, DBCC SHRINKFILE příkaz s target_size 6 zmenší soubor pouze na 7 MB, nikoli na 6 MB.

Pokud zadáte target_size , TRUNCATEONLYDBCC SHRINKFILE nemusí se na konci souboru uvolnit volné místo.

PRÁZDNÝ SOUBOR

Migruje všechna data ze zadaného souboru do jiných souborů ve stejné skupině souborů. Jinými slovy, EMPTYFILE migruje data ze zadaného souboru do jiných souborů ve stejné skupině souborů. EMPTYFILE vás ujistí, že se do souboru nepřidají žádná nová data, i když tento soubor není jen pro čtení. Můžete použít ALTER DATABASE tento výrok k odstranění souboru. Pokud použijete ALTER DATABASE příkaz ke změně velikosti souboru, příznak pouze pro čtení se resetuje a data lze přidat.

Pro kontejnery FILESTREAM filegroup nemůžete použít ALTER DATABASE k odebrání souboru, dokud systém uvolňování paměti FILESTREAM nespustí a neodstraní všechny nepotřebné soubory kontejneru skupiny souborů, které EMPTYFILE zkopírovaly do jiného kontejneru. Další informace naleznete v tématu sp_filestream_force_garbage_collection. Pro informace o odstranění kontejneru FILESTREAM viz příslušná sekce v ALTER DATABASE Možnostech souborů a skupin souborů

EMPTYFILEnení podporováno v Azure SQL Database, Azure SQL Database Hyperscale ani SQL databázi v Microsoft Fabric.

ZKRÁCENÍ

Přesune přidělené stránky z konce datového souboru na nepřidělené stránky v přední části souboru nebo bez zadání target_percent. Volné místo na konci souboru se nevrátí do operačního systému a fyzická velikost souboru se nezmění. Proto pokud je zadán NOTRUNCATE, zdá se, že se soubor nezmenšuje.

NOTRUNCATE se vztahuje pouze na datové soubory. Soubory protokolu nejsou ovlivněny.

Tato možnost není podporována pro kontejnery FILESTREAM filegroup.

TRUNCATEONLY

Uvolní veškeré volné místo na konci souboru do operačního systému, ale neprovádí žádný pohyb stránek uvnitř souboru. Datový soubor se zvětší pouze do posledního přiděleného rozsahu.

Pokud target_size zadáte pomocí TRUNCATEONLY, nemusí být uvolněno volné místo na konci souboru.

Tato TRUNCATEONLY možnost nepřesouvá informace v logu, ale odstraňuje neaktivní virtuální logy (VLF) z konce logu. Tato možnost není podporována pro kontejnery FILESTREAM filegroup.

S NO_INFOMSGS

Potlačí všechny informační zprávy.

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í. Pro více informací viz Pochopení problémů souběžnosti s DBCC SHRINKFILE.

Tato funkce je podobná WAIT_AT_LOW_PRIORITY s online operacemi indexu, ale existují určité rozdíly.

  • Nemůžete specifikovat ABORT_AFTER_WAIT tuto 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_PŘI_NÍZKÉ_PRIORITĚ

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 ] }

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

  • SELF

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

  • 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 sady 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. Toto číslo 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 8kB stránek, na které databázový stroj odhaduje, že lze soubor zmenšit.

Poznámky

DBCC SHRINKFILE platí pro soubory aktuální databáze. Pro více informací o tom, jak změnit aktuální databázi, viz POUŽÍT.

Operace DBCC SHRINKFILE můžete kdykoli zastavit a všechna dokončená práce se zachovají. Pokud použijete parametr EMPTYFILE a operaci zrušíte, soubor se neoznačí, aby se zabránilo přidání dalších dat.

Ostatní uživatelé mohou pracovat v databázi během zmenšení souboru; databáze nemusí být v režimu jednoho uživatele. K zmenšení systémových databází nemusíte spouštět instanci SQL Serveru v režimu jednoho uživatele.

Známé problémy

Platí na: SQL Server, Azure SQL Database, SQL database in Microsoft Fabric, Azure SQL Managed Instance, Azure Synapse Analytics dedication SQL pool

  • Ve verzích SQL Server starších než SQL Server 2025 (17.x) nelze stránky používané typy sloupců velkých objektů (LOB) (varbinary(max),varchar(max) a nvarchar(max)) v komprimovaných segmentech úložiště sloupců přesouvat a DBCC SHRINKDATABASEDBCC SHRINKFILE. Další informace najdete v tématu Co je nového v indexech columnstore.

Vysvětlení problémů se souběžností u DBCC SHRINKFILE

Příkazy zmenšit databázi a zmenšit soubor mohou vést k problémům s konkurenčností, zejména při aktivní údržbě, jako je obnova indexů, nebo v rušných online transakč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í. To 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 s 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 pod WAIT_AT_LOW_PRIORITY s operacemi zmenšení.

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

Zmenšení souboru protokolu

U souborů protokolu používá databázové jádro target_size k výpočtu cílové velikosti celého protokolu. Proto je target_size volné místo logu po operaci zmenšení. Cílová velikost celého protokolu se pak přeloží na cílovou velikost každého souboru protokolu. DBCC SHRINKFILE se pokusí okamžitě zmenšit každý fyzický soubor protokolu na cílovou velikost. Pokud se ale část logického protokolu nachází 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. Tato zpráva popisuje, jaké akce jsou potřeba k přesunutí logického protokolu z virtuálních protokolů, které se nacházejí ke konci souboru. Po provedení akcí lze pomocí DBCC SHRINKFILE uvolnit zbývající prostor.

Vzhledem k tomu, že soubor protokolu lze zmenšit pouze na hranici virtuálního souboru protokolu, zmenšení souboru protokolu na menší než velikost virtuálního souboru protokolu nemusí být možné, i když se nepoužívá. Databázový stroj dynamicky zvolí velikost virtuálního protokolového souboru při vytvoření nebo rozšíření protokolových souborů.

Osvědčené postupy

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

  • Operace zmenšení je nejúčinnější po operaci, která vytvoří velké množství nevyužitého místa, jako je operace zkrácení tabulky nebo operace odstranění tabulky.

  • Většina databází vyžaduje, aby bylo k dispozici nějaké volné místo pro běžné každodenní operace. Pokud zmenšíte soubor databáze opakovaně a všimněte si, že se velikost databáze znovu zvětší, znamená to, že pro běžné operace se vyžaduje 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 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.

Odstraňování problémů

Tato část popisuje, jak diagnostikovat a opravit problémy, ke kterým může dojít při spuštění příkazu DBCC SHRINKFILE.

Soubor se nezmenšuje.

Pokud se velikost souboru po bezchybné zmenšovací operaci nezmění a zkusíte následující kroky k ověření, zda má soubor dostatek volného místa:

  • Spusťte následující dotaz.

    SELECT name,
           size / 128.0 - CAST (FILEPROPERTY(name, 'SpaceUsed') AS INT) / 128.0 AS AvailableSpaceInMB
    FROM sys.database_files;
    
  • Pokud chcete zmenšit soubor transakčního logu, použijte sys.dm_db_log_space_usage dynamický management view (DMV), abyste viděli prostor v transakčním logu.

Operace zmenšování souboru nemůže dále zmenšit, pokud není dostatek volného místa.

Častým důvodem, proč se soubor transakčního logu nezmenšuje, je absence pravidelných záloh transakčních logů. Pokud chcete protokol zkrátit, zálohujte transakční protokol a spusťte operaci DBCC SHRINKFILE znovu. Pokud není potřeba obnova v reálném čase, zvažte modely obnovy (SQL Server), abyste předešli růstu logovacích souborů.

Operace zmenšení je zablokovaná.

Transakce běžící pod izolační úrovní založenou na verzování řádků může blokovat operace zmenšení. Pokud například probíhá velká operace odstranění spuštěná pod úrovní izolace na základě správy verzí řádku a v této době se začne provádět operace DBCC SHRINKDATABASE, operace zmenšení pak čeká na dokončení odstranění, než bude pokračovat. Pokud k tomuto blokování dojde, DBCC SHRINKFILE a DBCC SHRINKDATABASE operace vytisknou informační zprávu (5202 pro SHRINKDATABASE a 5203 pro SHRINKFILE) do protokolu chyb SQL Serveru. Tato zpráva se protokoluje každých pět minut v první hodině a potom každou hodinu. Například:

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.

Tato zpráva znamená, že operace zmenšení blokuje transakce snímků s časovými razítky staršími než 109 (poslední transakce, kterou operace zmenšení dokončila). Je také označeno, že sloupce transaction_sequence_numnebo first_snapshot_sequence_num v zobrazení dynamické správy sys.dm_tran_active_snapshot_database_transactions obsahují hodnotu 15. Pokud sloupec zobrazení transaction_sequence_num nebo first_snapshot_sequence_num obsahuje číslo menší než číslo poslední dokončené transakce operace zmenšení (109), operace zmenšení počká na dokončení těchto transakcí.

K vyřešení problému postupujte jedním z následujících kroků:

  • Ukončete transakci, která blokuje operaci zmenšení.
  • Ukončete operaci zmenšení. Dokončená práce se zachová, pokud je operace zmenšení ukončena.
  • Nedělejte nic a nechte operaci zmenšení čekat, dokud se blokující transakce nedokončí.

Dovolení

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

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í datového souboru na zadanou cílovou velikost

Následující příklad zmenší velikost datového souboru s názvem DataFile1 v uživatelské databázi UserDB na 7 MB.

USE UserDB;
GO

DBCC SHRINKFILE (DataFile1, 7);
GO

B. Zmenšení souboru protokolu na zadanou cílovou velikost

Následující příklad zmenší soubor protokolu v databázi AdventureWorks2025 na 1 MB. Aby bylo DBCC SHRINKFILE možné příkaz zmenšit soubor, je soubor nejprve zkrácen nastavením modelu obnovy databáze na .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. Zkraťte datový soubor

Následující příklad zkrátí primární datový soubor v AdventureWorks2025 databázi. Dotaz na zobrazení katalogu sys.database_files se provádí ke získání file_id datového souboru.

USE AdventureWorks2025;
GO

SELECT file_id,
       name
FROM sys.database_files;
GO

DBCC SHRINKFILE (1, TRUNCATEONLY);

D. Vyprázdnění souboru

Následující příklad ukazuje vyprázdnění souboru, aby jej bylo možné z databáze odebrat. Pro účely tohoto příkladu se nejprve vytvoří datový soubor, který obsahuje 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. Zmenšení souboru databáze pomocí WAIT_AT_LOW_PRIORITY

Následující příklad se pokusí zmenšit velikost datového souboru v aktuální uživatelské databázi na 1 MB. Zobrazení katalogu sys.database_files je dotazováno k získání file_id datového souboru, v tomto příkladu, file_id 5. Pokud se zámek nedá získat během jedné minuty, operace zmenšování se přeruší.

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);