sql >> Databáze >  >> RDS >> Database

Přehled příkazu DBCC SHRINKFILE

Spouštění příkazů DBCC Shrink je v komunitě SQL Server docela kontroverzní problém. V tomto článku se podíváme na podrobnosti o tomto příkazu a poskytneme stručný přehled jeho použití a také vás upozorníme na rizika spuštění tohoto příkazu. Jako správci databází byla řada databází předána od jiných týmů nebo dodavatelů a ne vždy se nám podaří spravovat databáze, které jsme vytvořili. Jako správci databází, kdykoli se účastníme migrací nebo nových projektů, musíme zajistit, abychom pečlivě naplánovali hladký přechod databáze do produkčního a pravidelného používání. V této fázi musíme zohlednit velikost databáze. Dokážete si představit, že nastavíte databázovou aplikaci, aniž byste zvážili prognózu růstu pro první rok nebo tak nějak. Co takhle vytvořit databázi SQL Server s tak malou velikostí, že se musí každý druhý den zvětšovat a zvyšovat tak kapacitu disku uprostřed noci? Může to znít hloupě, ale ve skutečnosti se to stává a někdy to nemusíte mít pod kontrolou.

Několik bodů ke zvážení u Proaktivního DBA

Než převezmete podporu produkčních databází, nezapomeňte si u svého předchůdce ověřit, jaké jsou prognózy růstu databáze. Je počáteční velikost databází, které budete spravovat, adekvátní? Nebojte se příliš, pokud je aktuální velikost databáze mnohem větší než data, která aktuálně má. Pamatujte, že nechcete, aby tato volání o kapacitě disku ve 3:00 ráno, kdy jste se tomu mohli úplně vyhnout, měli byste mít databázi správné velikosti. Pro administrátory databází v celém odvětví je obecným trendem obětovat své životy pozdě v noci světským problémům, ke kterým by vůbec nemělo dojít. Kromě velikosti databáze mějte také na paměti kapacitu disku serveru. Nechcete, aby velikost disku byla příliš malá, než jakou pojme databáze. To všechno jsou jednoduché věci, které se hodí v době plánování. Jak však víte, není to vždy databázový profesionál, kdo na prvním místě instaluje nebo konfiguruje databáze. Důležitým bodem, který je třeba poznamenat, je správné nastavení základů databáze, pokud jde o velikost, a tento příkaz možná nebudete muset spouštět nikdy. Nicméně, jako vždy, jako DBA jsou chvíle, kdy věci nemusí být pod vaší kontrolou a během této doby můžete použít příkazy DBCC Shrink file pro efektivní využití.

Kdy mohu použít DBCC ShrinkFile?

Právě jste dostali upozornění na místo na disku přímo uprostřed spánku a musíte splnit přísné SLA. Úroveň priority je P2 a SLA může velmi brzy dojít k porušení. A uvědomíte si, že k rozšíření disku v dohledné době nedojde, no, v tom případě mějte po ruce příkazy DBCC ShrinkFile, abyste je mohli použít k opětovnému získání místa. Jak název napovídá, zmenší soubor dat nebo log souboru databáze. Než však začnete se spouštěním příkazů DBCC ShrinkFile, zkuste nejprve zkontrolovat, proč se soubor databáze zvětšuje.

  • Zvětšil se soubor kvůli nějaké dlouho probíhající transakci?
  • Existuje na serveru nějaký druh blokování?
  • Dochází k nějakému významnému vydání aplikace, o kterém jste nebyli informováni? (To se stává většinou)
  • Existuje nějaký druh problému s replikací nebo zrcadlením databáze, který způsobuje růst databáze?

Je důležité získat odpovědi na tyto otázky co nejrychleji. Obecně platí, že na všechny tyto otázky existuje jedna odpověď a je to skvělý bezplatný nástroj s názvem sp_whoisactive. Neexistují žádná slova, která by popsala enormní využití tohoto nástroje a použil jsem jej při mnoha příležitostech k vyřešení mnoha problémů souvisejících s výrobou. Nejnovější kód si můžete stáhnout z tohoto odkazu:http://whoisactive.com/ . Jeho použití je snadné a jednoduché a okamžitě vrátí výstup. Pokud jste ostřílení DBA, budete to mít již k dispozici.

DBCC ShrinkFile s příklady

Syntaxe DBCC ShrinkFile je jednoduchá a přímočará, viz tento příklad níže.

use YOURDATABASE
go
DBCC Shrinkfile(FileName,1024)

Výše uvedený příklad zmenší FileName patřící do YOURDATABASE na 1024 MB. Stejnou operaci můžete provést pomocí SQL Server Management Studio (SSMS). Klikněte pravým tlačítkem na databázi a přejděte na Úkoly , vyberte možnost Zmenšit a poté na Soubory .

Jakmile kliknete na Soubory , dostanete toto okno.

Zde máte možnost vybrat typ souboru:Data, Log nebo Filestream Data a podle potřeby provést akci „Shrink“. Pro účely zmenšení je jednodušší použít samotný příkaz DBCC.

Použití DBCC ShrinkFile s dalšími možnostmi

Příkaz DBCC ShrinkFile můžete spustit s dalšími možnostmi – emptyfile, notruncate nebo truncateonly.

Prázdný soubor

Můžete použít příkaz emptyfile jako níže.

use YOURDATABASE
go
dbcc shrinkfile(FileName,emptyfile)

To pomůže přesunout data do jiných souborů ve stejné skupině souborů. Po dokončení budete moci odstranit soubor databáze, pokud již není vyžadován. U této možnosti emptyfile je však třeba poznamenat jen málo věcí, protože byste toho moc nemohli udělat pro vyprázdnění obsahu primárního datového souboru s ID souboru 1. Chcete-li získat číslo ID souboru, spusťte tento skript.

select file_id, name,physical_name from sys.database_files

Zde je v tomto příkladu název souboru „mo“ a file_id je 1. Když se pokusíte vyprázdnit soubor mo, který má file_id 1, objeví se tato chybová zpráva.

Důvodem je, že v původním souboru jsou systémové informace, které nelze vyprázdnit. Pokud však zkusíte stejný příkaz na jiném datovém souboru „mo2data“, příkaz prázdný soubor uspěje.

Nezkrátit

Jak název napovídá, operačnímu systému není uvolněno žádné místo. Je to spíše jako vnitřní operace v souboru, kdy jsou stránky redistribuovány v rámci samotného souboru, aniž by se změnila celková velikost databázového souboru. Z tohoto důvodu existuje velká možnost zavedení fragmentace. Viz příklad níže.

-- Example only  
Use YourDatabase		
go
DBCC SHRINKFILE (filename,notruncate);  
GO  

Pouze zkrácení

Jak název napovídá, volné místo bude uvolněno zpět do OS od konce souboru. Toto je zdaleka nejbezpečnější operace, kterou můžete spustit pomocí DBCC ShrinkFile. Viz příklad níže.

-- Example only  
Use YourDatabase		
go
DBCC SHRINKFILE (filename,truncateonly);  
GO  

Co dělat, když DBCC ShrinkFile v protokolu transakcí nefunguje podle očekávání? Chcete-li problém vyřešit, použijte tuto bezpečnou metodu

Jsou chvíle, kdy tento příkaz nemusí fungovat podle očekávání. Za předpokladu, že máte situaci, kdy se pokoušíte zmenšit soubor protokolu databáze a zdá se, že to nefunguje. Níže je uvedeno několik kroků, které můžete podniknout, abyste pochopili, proč zmenšování nefunguje podle očekávání. Všimnete si, že zmenšený soubor se zobrazí jako úspěšný, ale nedojde k žádnému zmenšení velikosti souboru protokolu. V takovém případě spusťte tento příkaz a zkontrolujte několik věcí o použití souboru protokolu.

select name,log_reuse_wait_desc,* from sys.databases

Na snímku obrazovky můžete vidět, že sloupec log_reuse_wait_desc čeká na zálohu protokolu.

Zde můžete vidět, že je třeba provést zálohu protokolu pro databázi, než budete moci soubor protokolu skutečně zmenšit. Pokud se jedná o produkční databázi, zkuste provést zálohu protokolu na jiný disk, kde je k dispozici místo. K provedení zálohy protokolu použijte ukázkový příkaz níže.

backup log DBName to disk='C:\Program Files\Microsoft SQL Server\MSSQL15.A1\MSSQL\Backup\DBName.trn'
with init,stats,compression

Po spuštění příkazu backup spusťte znovu níže uvedený příkaz, abyste viděli stav sloupce log_reuse_wait_desc.

select name,log_reuse_wait_desc,* from sys.databases

Na snímku obrazovky můžete vidět, že stav sloupce log_reuse_wait_desc se změnil na „Nic“.

Zde můžete vidět, že stav sloupce „log_reuse_wait_desc“ se změnil na „Nic“. Ve vašem případě se může stále zobrazovat jako „LOG_BACKUP“. Pokračujte v zálohování protokolu databáze, dokud se stav nezmění na „Nic“. Důvod, proč se stále může zobrazovat stav „LOG_BACKUP“ i po provedení záloh protokolu transakcí, je ten, že po spuštění zálohy protokolu transakcí nemusely být vymazány žádné VLF. VLF je zkratka pro Virtual log files a je součástí vnitřní architektury transakčního protokolu. Soubory protokolu transakcí se skládají z těchto VLF. Spuštěním tohoto příkazu můžete získat informace o VLF.

select * from sys.dm_db_log_info(5)

Zde 5 představuje id_databáze. Zobrazí se snímek obrazovky výstupu. Počet vrácených řádků představuje skutečný počet souborů virtuálního protokolu (VLF) v databázi. Stav souboru virtuálního protokolu můžete zkontrolovat ve sloupci „vlf_status“. Hodnota 2 znamená, že je aktivní. Pomocí tohoto příkazu můžete zkontrolovat interní příznaky v souboru protokolu transakcí, abyste pochopili, proč se protokol transakcí neuvolňuje ani po provedení zálohování protokolu.

Dříve byl používán příkaz DBCC LOGINFO, který poskytoval podobné informace.

Co dělat, když DBCC ShrinkFile v protokolu transakcí nefunguje podle očekávání? Něco, co můžete provádět v neprodukčním prostředí. Nedoporučuje se však v produkčním prostředí

Na mnoha webech byste narazili na lidi, kteří doporučovali změnit model obnovy na jednoduchý a poté spustit zmenšený soubor, aby se uvolnil prostor zpět do operačního systému. Mějte na paměti, že změna modelu obnovy na jednoduchý ovlivní obnovu vaší databáze, protože byste nebyli schopni obnovit se do určitého okamžiku. To opět závisí na vaší obchodní smlouvě SLA. Model obnovy můžete změnit pomocí T-SQL (níže) nebo pomocí GUI.

alter database DB_NAME set recovery simple

Pomocí GUI změňte model obnovy podle obrázku. Klikněte pravým tlačítkem na databázi, přejděte na „Vlastnosti“ a klikněte na „Možnosti“. V části „Možnosti“ vyberte „Model obnovení“.

Všimnete si, že pouhá změna modelu obnovy na Jednoduchý neuvolní místo zpět do operačního systému. Budete muset explicitně spustit příkaz DBCC ShrinkFile, abyste zmenšili soubor a získali místo. Viz ukázkový skript níže. Tento příkaz zmenší váš název souboru na 1024 MB.

use YOURDATABASE
go
DBCC Shrinkfile(FileName,1024)

Možnost Auto Shrink databáze

Všimnete si, že ve vlastnostech databáze existuje možnost známá jako „Automatické zmenšení“. Kliknutím pravým tlačítkem na databázi zobrazíte vlastnost databáze. V sekci možností uvidíte tuto možnost, jak je znázorněno. Z nastavení modelové databáze můžete vidět, že možnost „Automatické zmenšování“ je ve výchozím nastavení zakázána. Kdykoli je tedy vytvořena nová databáze, tato možnost je také ve stavu vypnuto. Mohou nastat případy, kdy databázoví profesionálové mohou nevědomky ponechat tuto možnost povolenou, aniž by si byli vědomi negativních důsledků jejího ponechání.

Spuštěním tohoto příkazu zkontrolujete stav této volby pro databáze na serveru.

select name,is_auto_shrink_on,* from sys.databases

Uvidíte tento výstup.

Pokud náhodou uvidíte, že je povolena, můžete ji deaktivovat buď pomocí GUI, nebo můžete spustit níže uvedený příkaz proti databázi.

ALTER DATABASE YOUR_DATABASE set AUTO_SHRINK OFF

Další návrhy údržby

Podívejte se na těchto několik dalších tipů, abyste se vyhnuli problému růstu databáze, kvůli kterému musíte spouštět příkazy DBCC ShrinkFile.

  • Zajistěte, aby byl model obnovy vašich databází v souladu s obchodními smlouvami SLA. Pokud vaše firma nevyžaduje u testovacích databází obnovu v určitém okamžiku, ponechte je v modelu jednoduché obnovy. Viděl jsem několik příležitostí, kdy byl model obnovy databází dokončen, když je obnova pomocí nejnovější plné zálohy v pořádku.
  • Zajistěte správné monitorování, zejména při růstu databáze. Měli byste být upozorněni, když využití souboru protokolu dosáhne 85 %. Získáte tak čas na vyřešení problému s prostorem
  • Pokud je databáze v modelu úplné obnovy, zajistěte pravidelné zálohování protokolů a měli byste být upozorněni, pokud některá ze záloh protokolů selže
  • Ujistěte se, že je na databázových jednotkách dostatek místa, abyste předešli problémům s nedostatkem místa
  • U databází, které lze archivovat, vyviňte některé strategie archivace, abyste mohli přesouvat starší data do jiné databáze a vytvářet sestavy a nastavit tuto databázi pouze pro čtení. To vám poskytne větší kontrolu, pokud jde o velikost databáze
  • Zajistěte pravidelné provádění kontrol integrity databáze pomocí DBCC CheckDB. Další informace naleznete v tomto článku:https://codingsight.com/dbcc-checkdb-overview/

Závěr

  • Z tohoto článku jste dobře porozuměli používání příkazu DBCC ShrinkFile
  • Dozvěděli jste se o rizicích spouštění příkazů DBCC ShrinkFile
  • Zjistili jste různé možnosti, které můžeme poskytnout pomocí příkazů DBCC ShrinkFile
  • Viděli jste možnosti, které můžeme vyzkoušet, pokud se protokol transakcí nezmenšuje pomocí příkazů DBCC ShrinkFile
  • Dozvěděli jste se o výchozím nastavení automatického zmenšování ve vlastnosti databáze
  • Také jste se naučili další návrhy na údržbu databáze, abyste udrželi své databáze v pořádku.
  • Nakonec se ujistěte, že jste v každém případě připraveni na dny OFF, které možná nebudete mít pod kontrolou

  1. Je čas, abychom IDE Microsoft Access trochu milovali

  2. Použití podmínky if ve vložení SQL Server

  3. Instalace R12.2.6 EBS krok za krokem na Virtual Box část -2

  4. Jak opravit chybu připojení databáze MySQL JDBC 08001