DBCC SHRINKDATABASE (Transact-SQL)

  • 17.7.2017
  • 8 minut čtení
    • p
    • M
    • j
    • i
    • K
    • +12

Týká se: SQL Server (všechny podporované verze) Azure SQL Database Azure Synapse Analytics

Zmenší velikost datových a logovacích souborů v zadané databázi.

Syntaktické konvence jazyka Transact-SQL

Syntaxe

DBCC SHRINKDATABASE ( database_name | database_id | 0 ) 
-- Azure Synapse AnalyticsDBCC SHRINKDATABASE ( database_name ) 

Poznámka

Pro zobrazení syntaxe jazyka Transact-SQL pro SQL Server 2014 a starší verze viz dokumentace k předchozím verzím.

Argumenty

název_databáze | ID_databáze | 0
Je název nebo ID databáze, která se má zmenšit. Hodnota 0 určuje, že se použije aktuální databáze.

cíl_procenta
Je procento volného místa, které má zůstat v databázovém souboru po zmenšení databáze.

NOTRUNCATE
Přesune přiřazené stránky z konce souboru na nepřiřazené stránky v přední části souboru. Tato akce zkomprimuje data v souboru. target_percent je nepovinný údaj. Azure Synapse Analytics tuto možnost nepodporuje.

Volné místo na konci souboru se operačnímu systému nevrací a fyzická velikost souboru se nemění. Proto se zdá, že se databáze nezmenší, když zadáte NOTRUNCATE.

NOTRUNCATE se vztahuje pouze na datové soubory. NOTRUNCATE nemá vliv na soubor protokolu.

TRUNCATEONLY
Uvolní veškeré volné místo na konci souboru operačnímu systému. Nepřesouvá žádné stránky uvnitř souboru. Datový soubor se zmenší pouze na poslední přiřazený rozsah. Ignoruje target_percent, je-li zadáno pomocí TRUNCATEONLY. Azure Synapse Analytics tuto možnost nepodporuje.

TRUNCATEONLY ovlivňuje soubor protokolu. Chcete-li zkrátit pouze datový soubor, použijte příkaz DBCC SHRINKFILE.

PODLE NO_INFOMSGS
Potlačí všechny informační zprávy, které mají úroveň závažnosti 0 až 10.

Soubory výsledků

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

Název sloupce Popis
DbId Identifikační číslo souboru, který se Database Engine pokusil zmenšit.
FileId Identifikační číslo souboru, který se Database Engine pokusil zmenšit.
CurrentSize Počet 8-KB stránek, které soubor aktuálně zabírá.
MinimumSize Počet 8-KB stránek, které by soubor mohl minimálně zabírat. Tato hodnota odpovídá minimální velikosti nebo původně vytvořené velikosti souboru.
UsedPages Počet 8-KB stránek, které soubor aktuálně využívá.
EstimatedPages Počet 8-KB stránek, na které by se podle odhadu databázového stroje mohl soubor zmenšit.

Poznámka

Databázový stroj nezobrazuje řádky pro ty soubory, které nebyly zmenšeny.

Poznámky

Poznámka

Spuštění tohoto příkazu se nedoporučuje, protože jde o operaci náročnou na i/o a může vyřadit datový sklad z provozu. Kromě toho budou mít snímky datového skladu po spuštění tohoto příkazu vliv na náklady.

Chcete-li zmenšit všechna data a soubory protokolu pro určitou databázi, spusťte příkaz DBCC SHRINKDATABASE. Chcete-li zmenšit po jednom datovém souboru nebo souboru protokolu pro určitou databázi, spusťte příkaz DBCC SHRINKFILE.

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

Operaci DBCC SHRINKDATABASE lze zastavit v libovolném bodě procesu a veškerá dokončená práce zůstane zachována.

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

Řekněme, že databáze je původně vytvořena s velikostí 10 MB. Pak se zvětší na 100 MB. Nejmenší velikost, na kterou lze databázi zmenšit, je 10 MB, i když byla všechna data v databázi odstraněna.

Při spuštění příkazu DBCC SHRINKDATABASE zadejte buď volbu NOTRUNCATE, nebo volbu TRUNCATEONLY. Pokud tak neučiníte, výsledek bude stejný, jako kdybyste spustili operaci DBCC SHRINKDATABASE s volbou NOTRUNCATE a následně spustili operaci DBCC SHRINKDATABASE s volbou TRUNCATEONLY.

Zmenšená databáze nemusí být v režimu jednoho uživatele. V době zmenšování databáze v ní mohou pracovat i jiní uživatelé, včetně systémových databází.

Bázi nelze zmenšovat v době, kdy je databáze zálohována. A naopak, nelze zálohovat databázi v době, kdy probíhá operace zmenšování databáze.

Jak funguje DBCC SHRINKDATABASE

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

Předpokládejme, že máte několik souborů protokolu, datový soubor a databázi s názvem mydb. Datový soubor a soubor protokolu mají každý velikost 10 MB a datový soubor obsahuje 6 MB dat. Databázový engine vypočítá cílovou velikost každého souboru. Tato hodnota je velikost, na kterou má být soubor zmenšen. Pokud je příkaz DBCC SHRINKDATABASE zadán s hodnotou target_percent, vypočítá Database Engine cílovou velikost jako cílové_procento volného místa v souboru po zmenšení.

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

Předpokládejme, že datový soubor mydb obsahuje 7 MB dat. Zadání hodnoty target_percent 30 umožní, aby se tento datový soubor zmenšil na volné procento 30. Zadání target_percent 40 však datový soubor nezmenší, protože Database Engine nezmenší soubor na menší velikost, než jakou data aktuálně zabírají.

Tento problém si můžete představit i jinak: 40 procent hledaného volného místa + 70 procent zaplněného datového souboru (7 MB z 10 MB) je více než 100 procent. Jakákoli target_size větší než 30 nezmenší datový soubor. Nezmenší se, protože požadované procento volného místa plus aktuální procento, které datový soubor zabírá, je více než 100 procent.

Pro soubory protokolu používá Database Engine target_percent k výpočtu cílové velikosti celého protokolu. Proto je target_percent velikost volného místa v protokolu po operaci zmenšení. Cílová velikost pro celý protokol je pak převedena na cílovou velikost pro každý soubor protokolu.

DBCC SHRINKDATABASE se snaží každý fyzický soubor protokolu okamžitě zmenšit na jeho cílovou velikost. Řekněme, že žádná část logického logu nezůstane ve virtuálních logách nad rámec cílové velikosti souboru logu. Pak je soubor úspěšně zkrácen a DBCC SHRINKDATABASE skončí bez hlášení. Pokud však část logického záznamu zůstane ve virtuálních protokolech nad rámec cílové velikosti, databázový stroj uvolní co nejvíce místa a poté vydá informační zprávu. Zpráva popisuje, jaké akce je třeba provést, aby se logický protokol přesunul z virtuálních protokolů na konec souboru. Po provedení akcí lze k uvolnění zbývajícího místa použít příkaz DBCC SHRINKDATABASE.

Soubor protokolu lze zmenšit pouze na hranici souboru virtuálního protokolu. Proto zmenšení souboru protokolu na velikost menší, než je velikost virtuálního souboru protokolu, nemusí být možné. Nemusí to být možné ani v případě, že se nepoužívá. Velikost virtuálního souboru protokolu je dynamicky volena databázovým strojem při vytváření nebo rozšiřování souborů protokolu.

Nejlepší 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 zrušení tabulky.
  • Většina databází vyžaduje, aby bylo k dispozici určité volné místo pro běžné každodenní operace. Může se stát, že při opakovaném zmenšování databáze zjistíte, že její velikost opět roste. Tento nárůst naznačuje, že zmenšený prostor je potřebný pro běžné operace. V těchto případech je opakované zmenšování databáze zbytečnou operací.
  • Operace zmenšení nezachovává stav fragmentace indexů v databázi a obecně fragmentaci do určité míry zvyšuje. Tento výsledek je dalším důvodem, proč databázi opakovaně nezmenšovat.
  • Pokud nemáte konkrétní požadavek, nenastavujte volbu AUTO_SHRINK databáze na hodnotu ON.

Řešení problémů

Je možné zablokovat operace zmenšování transakcí, která běží pod úrovní izolace založenou na verzování řádků. Například v okamžiku provedení operace DBCC SHRINK DATABASE probíhá velká operace mazání spuštěná pod úrovní izolace založenou na verzování řádků. Pokud k této situaci dojde, operace zmenšení počká na dokončení operace mazání a teprve potom zmenší soubory. Když operace zmenšování čeká, operace DBCC SHRINKFILE a DBCC SHRINKDATABASE vypíší informační zprávu (5202 pro SHRINKDATABASE a 5203 pro SHRINKFILE). Tato zpráva se vypisuje do protokolu chyb SQL Serveru každých pět minut v první hodině a poté každou další hodinu. Pokud například protokol chyb obsahuje následující chybové hlášení:

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 transakce snímků, které mají časová razítka starší než 109, zablokují operaci smršťování. Tato transakce je poslední transakcí, která operaci smršťování dokončila. Znamená to také, že sloupce transaction_sequence_num nebo first_snapshot_sequence_num v dynamickém zobrazení pro správu sys.dm_tran_active_snapshot_database_transactions (Transact-SQL) obsahují hodnotu 15. V tomto případě se jedná o chybu. 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). V takovém případě bude operace smršťování čekat na dokončení těchto transakcí.

Chcete-li problém vyřešit, můžete provést jednu z následujících úloh:

  • Ukončete transakci, která blokuje operaci smršťování.
  • Ukončete operaci smršťování. Veškerá dokončená práce zůstane zachována.
  • Nedělejte nic a nechte operaci smršťování čekat na dokončení blokující transakce.

Oprávnění

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

Příklady

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

Následující příklad zmenší velikost datových souborů a souborů protokolu v databázi uživatele UserDB tak, aby v databázi bylo 10 procent volného místa.

DBCC SHRINKDATABASE (UserDB, 10); GO 

B. Zkrácení databáze

Následující příklad zmenší datové soubory a soubory protokolu ve vzorové databázi AdventureWorks na poslední přiřazený rozsah.

DBCC SHRINKDATABASE (AdventureWorks2012, TRUNCATEONLY); 

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

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

Viz také

ALTER DATABASE (Transact-SQL)
DBCC (Transact-SQL)
DBCC SHRINKFILE (Transact-SQL)
Zmenšení databáze

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.