DBCC SHRINKFILE (Transact-SQL)
platí pro:SQL Server
Azure SQL Database
azure SQL Managed Instance
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. DbCC SHRINKFILE používejte pouze v případě potřeby.
Poznámka
Operace zmenšení by se neměly považovat za pravidelnou operaci údržby. Data a soubory protokolů, které se zvětšují z důvodu pravidelných opakovaných obchodních operací, nevyžadují operace zmenšení.
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 }
Argumenty
file_name
Logický název souboru, který se má zmenšit.
file_id
Identifikační číslo (ID) souboru, který má být zmenšen. Pokud chcete získat ID souboru, použijte funkci systému FILE_IDEX nebo zadejte dotaz na zobrazení katalogu sys.database_files v aktuální databázi.
velikost_cíle
Celé číslo představující novou megabajtovou velikost souboru. Pokud není zadáno nebo 0, DBCC SHRINKFILE
zmenšuje velikost vytvoření souboru.
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 zadáno, DBCC SHRINKFILE
se pokusí zmenšit soubor 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 u datového souboru o velikosti 10 MB se operace DBCC SHRINKFILE
s 8
target_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, příkaz DBCC SHRINKFILE
s target_size 6 zmenší soubor pouze na 7 MB, nikoli na 6 MB.
EMPTYFILE
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í. K odebrání souboru můžete použít příkaz ALTER DATABASE. Pokud ke změně velikosti souboru použijete příkaz ALTER DATABASE, příznak jen pro čtení se resetuje a data je možné 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. Informace o odebrání kontejneru FILESTREAM najdete v odpovídající části v části MOŽNOSTI ALTER DATABASE File and Filegroup (Transact-SQL)
EMPTYFILE
se nepodporuje ve službě Azure SQL Database ani Azure SQL Database Hyperscale.
NOTRUNCATE
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.
target_size se ignoruje, pokud je zadán parametr TRUNCATEONLY
.
Možnost TRUNCATEONLY
nepřesune informace v protokolu, ale odebere neaktivní soubory VLF na konci souboru protokolu. Tato možnost není podporována pro kontejnery FILESTREAM filegroup.
WITH NO_INFOMSGS
Potlačí všechny informační zprávy.
WAIT_AT_LOW_PRIORITY s operacemi zmenšení
platí pro: SQL Server 2022 (16.x) a novější verze, Azure SQL Database, Azure SQL Managed Instance
Funkce čekání s nízkou prioritou snižuje konkurenci zámků. Další informace naleznete v tématu Pochopení problémů souběžnosti s DBCC SHRINKDATABASE.
Tato funkce je podobná WAIT_AT_LOW_PRIORITY s online operacemi indexu, ale existují určité rozdíly.
- Nelze použít možnost ABORT_AFTER_WAIT s parametrem NONE.
ČEKAT_PŘI_NÍZKÉ_PRIORITĚ
platí pro: SQL Server (SQL Server 2022 (16.x) a novější) a Azure SQL Database.
Když se příkaz pro zmenšení spustí v režimu WAIT_AT_LOW_PRIORITY, nebudou nové dotazy vyžadující stabilitu schématu (Sch-S) zablokované operací čekání na zmenšení, dokud operace zmenšení nepřestane čekat a nespustí se. Operace zmenšení se provede, když dokáže získat zámek změny schématu (Sch-M). Pokud nová operace zmenšení v režimu WAIT_AT_LOW_PRIORITY nemůže získat zámek kvůli dlouhotrvajícímu dotazu, operace zmenšení nakonec vyprší po 1 minutě a beze slova se ukončí.
Pokud nová operace zmenšení v režimu WAIT_AT_LOW_PRIORITY nemůže získat zámek kvůli dlouhotrvajícímu dotazu, operace zmenšení nakonec po 1 minutě ve výchozím nastavení vyprší a tiše se ukončí. K tomu dojde, pokud operace zmenšení nemůže získat zámek Sch-M kvůli souběžnému dotazu nebo dotazům, které uchovávají zámky Sch-S. Když dojde k vypršení časového limitu, odešle se chyba 49516 do protokolu chyb SQL Serveru, 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
. Opakujte operaci zmenšení v režimu WAIT_AT_LOW_PRIORITY
.
ABORT_AFTER_WAIT = [ SELF | BLOKÁTORY ]
platí pro: SQL Server (SQL Server 2022 (16.x) a novější) a Azure SQL Database.
JÁ
Ukončete operaci zmenšení souboru, která se právě spouští, aniž byste provedli žádnou akci.
BLOKÁTORY
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.
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. Další informace o tom, jak změnit aktuální databázi, naleznete v tématu USE (Transact-SQL).
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.
Pokud DBCC SHRINKFILE
operace selže, vyvolá se chyba.
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.
Pokud je specifikováno pomocí WAIT_AT_LOW_PRIORITY, požadavek na zámek Sch-M při operaci zmenšení bude při provádění příkazu čekat s nízkou prioritou po dobu 1 minuty. Pokud je operace po dobu trvání blokovaná, provede se zadaná ABORT_AFTER_WAIT akce.
Známé problémy
platí pro: SQL Server, Azure SQL Database, Azure SQL Managed Instance, vyhrazený fond SQL služby Azure Synapse Analytics
- Typy sloupců LOB (varbinary(max), varchar(max)a nvarchar(max)) v komprimovaných segmentech columnstore nejsou ovlivněny
DBCC SHRINKDATABASE
aDBCC SHRINKFILE
.
Vysvětlení problémů se souběžností u DBCC SHRINKFILE
Příkazy pro zmenšení databáze a zmenšení souborů můžou vést k problémům se souběžností, zejména při aktivní údržbě, jako je opětovné sestavení indexů nebo v zaneprázdněných prostředích OLTP. Když vaše aplikace spustí dotazy na databázové tabulky, tyto dotazy získají a udržují zámek stability schématu (Sch-S), dokud dotazy nebudou dokončeny jejich operace. Při pokusu o uvolnění místa během pravidelného používání vyžadují operace zmenšení databáze a zmenšení souborů v současné době při přesouvání nebo odstraňování stránek mapování přidělení indexů (IAM) zámek schématu (Sch-M), který blokuje zámky Sch-S potřebné pro uživatelské dotazy. V důsledku toho dlouhotrvající dotazy zablokují operaci zmenšení až do dokončení dotazů. To znamená, že všechny nové dotazy vyžadující Sch-S zámky se také zařadí do fronty za probíhající operaci zmenšení a budou také blokovány, což dále zhoršuje tento problém souběžnosti. To může výrazně ovlivnit výkon dotazů aplikace a může také způsobit potíže s dokončením potřebné údržby pro zmenšení databázových souborů. Představeno v systému SQL Server 2022 (16.x), funkce čekání na zmenšení s nízkou prioritou řeší tento problém tím, že získá zámek změny schématu v režimu WAIT_AT_LOW_PRIORITY
. Další informace naleznete pod WAIT_AT_LOW_PRIORITY s operacemi zmenšení.
Další informace o zámcích Sch-S a Sch-M naleznete v tématu Průvodce uzamčením transakcí a verzování řádků.
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šení souboru databáze plýtvání operací. Události automatického zvětšování potřebné k růstu databázového souboru brání výkonu.
Operace zmenšení nezachovává stav fragmentace indexů v databázi a obecně zvyšuje fragmentaci do určité míry. Tato fragmentace je dalším důvodem, proč databázi opakovaně nezmenšovat.
Zmenšete více souborů ve stejné databázi postupně místo souběžně. Souboj na tabulkách systému může způsobit blokování a vést ke zpožděním.
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 operaci zmenšení bez chyb nezmění, zkuste ověřit, jestli 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;
- Spuštěním příkazu DBCC SQLPERF vrátíte místo použité v transakčním protokolu.
Operace zmenšení nemůže velikost souboru dále zmenšit, pokud není k dispozici dostatek volného místa.
Obvykle se jedná o soubor protokolu, který se zdá, že se nezmenšuje, obvykle výsledek souboru protokolu, který nebyl zkrácen pravidelným zálohováním transakčního protokolu. Pokud chcete protokol zkrátit, zálohujte transakční protokol a spusťte operaci DBCC SHRINKFILE
znovu. Pokud není vyžadováno obnovení k určitému bodu v čase, zvažte model obnovení databáze SIMPLE.
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_num
nebo 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í.
Pokud chcete tento problém vyřešit, můžete provést jednu z následujících úloh:
- 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
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 AdventureWorks2022
na 1 MB. Pokud chcete povolit, aby DBCC SHRINKFILE
příkaz zmenšil soubor, soubor se nejprve zkrátí nastavením modelu obnovení databáze na SIMPLE.
USE AdventureWorks2022;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE AdventureWorks2022
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (AdventureWorks2022_Log, 1);
GO
-- Reset the database recovery model.
ALTER DATABASE AdventureWorks2022
SET RECOVERY FULL;
GO
C. Zkraťte datový soubor
Následující příklad zkrátí primární datový soubor v AdventureWorks2022
databázi. Dotaz na zobrazení katalogu sys.database_files
se provádí ke získání file_id
datového souboru.
USE AdventureWorks2022;
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 AdventureWorks2022;
GO
-- Create a data file and assume it contains data.
ALTER DATABASE AdventureWorks2022
ADD FILE (
NAME = Test1data,
FILENAME = 'C:\t1data.ndf',
SIZE = 5MB
);
GO
-- Empty the data file.
DBCC SHRINKFILE (Test1data, EMPTYFILE);
GO
-- Remove the data file from the database.
ALTER DATABASE AdventureWorks2022
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 AdventureWorks2022;
GO
SELECT file_id, name
FROM sys.database_files;
GO
DBCC SHRINKFILE (5, 1) WITH WAIT_AT_LOW_PRIORITY (ABORT_AFTER_WAIT = SELF);
Související obsah
- Zmenšit databázi
- Zmenšení souboru
- DBCC SHRINKDATABASE (Transact-SQL)
- cs-CZ: Úvahy o nastavení automatického zvětšování a automatického zmenšování v SQL Serveru
- Databázových souborů a Skupin souborů
- sys.database_files (Transact-SQL)
- sys.databases (Transact-SQL)
- FILE_ID (Transact-SQL)
- ALTER DATABASE (Transact-SQL)