Zmenšení databáze tempdb

platí pro:SQL Serverazure SQL Managed Instance

Tento článek popisuje různé metody, které můžete použít ke zmenšení tempdb databáze na SQL Serveru.

Ke změně velikosti tempdbmůžete použít některou z následujících metod . První tři možnosti jsou popsány v tomto článku. Pokud chcete použít SQL Server Management Studio (SSMS), postupujte podle pokynů v Zmenšení databáze.

Metoda Vyžaduje restartování? Další informace
ALTER DATABASE Ano Poskytuje úplnou kontrolu nad velikostí výchozích souborů tempdb (tempdev a templog).
DBCC SHRINKDATABASE Ne Funguje na úrovni databáze.
DBCC SHRINKFILE Ne Umožňuje zmenšit jednotlivé soubory.
SQL Server Management Studio Ne Zmenšete soubory databáze prostřednictvím grafického uživatelského rozhraní.

Poznámky

Ve výchozím nastavení je databáze tempdb nakonfigurovaná tak, aby se podle potřeby automaticky zvětšovala. Proto se tato databáze může v průběhu času neočekávaně zvětšit na větší než požadovaná velikost. Větší tempdb velikosti databází nemají nepříznivý vliv na výkon SQL Serveru.

Při spuštění SQL Serveru se tempdb znovu vytvoří pomocí kopie databáze model, a tempdb se resetuje na svou poslední nakonfigurovanou velikost. Nakonfigurovaná velikost je poslední explicitní velikost, kterou jste nastavili pomocí operace změny velikosti souboru, například pomocí možnosti ALTER DATABASE s volbou MODIFY FILE nebo s příkazy DBCC SHRINKFILE nebo DBCC SHRINKDATABASE. Proto pokud nepotřebujete použít jiné hodnoty nebo chcete okamžitě vyřešit velkou tempdb databázi, můžete počkat na další restartování služby SQL Serveru, aby se velikost zmenšila.

Můžete zmenšit tempdb, zatímco aktivita tempdb probíhá. Můžete ale narazit na jiné chyby, jako jsou blokování, zablokování atd., které můžou zabránit dokončení zmenšení. Chcete-li zajistit úspěšné zmenšení tempdb , proveďte tuto operaci, pokud je server v režimu jednoho uživatele nebo když zastavíte veškerou tempdb aktivitu.

SQL Server zaznamenává pouze dostatek informací v protokolu transakcí tempdb k vrácení transakce zpět, ale ne k opakování transakcí během obnovení databáze. Tato funkce zvyšuje výkon příkazů INSERT v tempdb. Navíc nemusíte protokolovat informace pro opakování jakýchkoli transakcí, protože tempdb se znovu vytvoří při každém restartu SQL Serveru. Proto nemá žádné transakce k vrácení dopředu nebo vrácení zpět.

Další informace o správě a monitorování tempdbnaleznete v tématu Plánování kapacity a Monitorování databáze tempdb.

Použijte příkaz ALTER DATABASE

Poznámka

Tento příkaz funguje pouze u výchozích tempdb logických souborů tempdev a templog. Pokud do tempdbsouboru přidáte další soubory, můžete je po restartování SQL Serveru jako služby zmenšit. Všechny soubory tempdb se při spuštění znovu vytvoří. Tyto soubory jsou ale prázdné a je možné je odebrat. Pokud chcete odebrat nadbytečné soubory tempdb, použijte ALTER DATABASE příkaz s REMOVE FILE možností.

Tato metoda vyžaduje restartování SQL Serveru.

Poznámka

K instanci SQL Serveru se můžete připojit pomocí libovolného známého klientského nástroje SQL Serveru, jako je sqlcmd, SQL Server Management Studio (SSMS) nebo rozšíření MSSQL pro Visual Studio Code.

  1. Zastavte SQL Server.

  2. Na příkazovém řádku spusťte instanci v minimálním režimu konfigurace. Postupujte takto:

    1. Na příkazovém řádku přejděte do složky, ve které je nainstalovaný SQL Server (nahraďte <VersionNumber> a <InstanceName> v následujícím příkladu):

      cd C:\Program Files\Microsoft SQL Server\MSSQL<VersionNumber>.<InstanceName>\MSSQL\Binn
      
    2. Pokud je instance pojmenovanou instancí SQL Serveru, spusťte následující příkaz (nahraďte <InstanceName> v následujícím příkladu):

      sqlservr.exe -s <InstanceName> -c -f -mSQLCMD
      
    3. Pokud je instance výchozí instancí SQL Serveru, spusťte následující příkaz:

      sqlservr -c -f -mSQLCMD
      

      Poznámka

      Parametry -c a -f způsobí spuštění SQL Serveru v minimálním režimu konfigurace, který má tempdb velikost 1 MB datového souboru a 0,5 MB pro soubor protokolu. Parametr -mSQLCMD zabraňuje jakékoli jiné aplikaci než sqlcmd v převzetí jednouživatelského připojení.

  3. Připojte se k SQL Serveru pomocí sqlcmda spusťte následující příkazy Transact-SQL. Nahraďte <target_size_in_MB> velikostí, kterou chcete:

    ALTER DATABASE tempdb MODIFY FILE
    (NAME = 'tempdev', SIZE = <target_size_in_MB>);
    
    ALTER DATABASE tempdb MODIFY FILE
    (NAME = 'templog', SIZE = <target_size_in_MB>);
    
  4. Zastavte SQL Server. Uděláte to tak, že stisknete Ctrl+C v okně příkazového řádku, restartujte SQL Server jako službu a pak zkontrolujete velikost tempdb.mdf souborů a templog.ldf souborů.

Použití příkazu DBCC SHRINKDATABASE

DBCC SHRINKDATABASE přijímá parametr target_percent. Tento parametr nastaví procento volného místa, které chcete nechat v databázovém souboru po zmenšení databáze. Pokud používáte DBCC SHRINKDATABASE, možná budete muset restartovat SQL Server.

  1. sp_spaceused Pomocí uložené procedury zkontrolujte místo, které tempdbaktuálně používá . Pak vypočítat procento volného místa, které se má použít jako parametr pro DBCC SHRINKDATABASE. Tento výpočet vychází z požadované velikosti databáze.

    Poznámka

    V některých případech možná budete muset spustit sp_spaceused @updateusage = true, abyste přepočítali využité místo a získali aktualizovanou sestavu. Další informace najdete v části sp_spaceused.

    Podívejte se na následující příklad:

    Předpokládejme, že tempdb má dva soubory: primární datový soubor (tempdb.mdf), který je 1 024 MB a soubor protokolu (tempdb.ldf), který je 360 MB. Předpokládejme, že sp_spaceused oznamuje, že primární datový soubor obsahuje 600 MB dat. Předpokládejme také, že chcete primární datový soubor zmenšit na 800 MB. Vypočítejte požadované procento zbývajícího volného místa po zmenšení: 800 MB - 600 MB = 200 MB. Nyní vydělte 200 MB 800 MB = 25 procent a tato hodnota je vaše target_percent. Soubor transakčního protokolu se odpovídajícím způsobem zmrští a po zmenšení databáze ponechá 25 % nebo 200 MB volného místa.

  2. Spusťte následující příkaz Transact-SQL. Nahraďte <target_percent> požadovaným procentem:

    DBCC SHRINKDATABASE (tempdb, '<target_percent>');
    

Příkaz DBCC SHRINKDATABASE má při použití tempdbomezení . Cílovou velikost pro soubory dat a protokolů nelze nastavit tak, aby byla menší než velikost zadaná při vytvoření databáze. Nemůžete ji také nastavit menší než poslední velikost, kterou explicitně nastavíte pomocí operace změny velikosti souboru, například ALTER DATABASE s MODIFY FILE možností. Dalším omezením DBCC SHRINKDATABASE je výpočet parametru target_percentage a jeho závislost na použitém aktuálním prostoru.

Použití příkazu DBCC SHRINKFILE

DBCC SHRINKFILE Pomocí příkazu zmenšete jednotlivé tempdb soubory. DBCC SHRINKFILE poskytuje větší flexibilitu než DBCC SHRINKDATABASE, protože ji můžete použít v jednom databázovém souboru, aniž by to mělo vliv na jiné soubory, které patří do stejné databáze. DBCC SHRINKFILE přijímá parametr target_size. Tento parametr nastaví požadovanou konečnou velikost souboru databáze.

  1. Určete požadovanou velikost primárního datového souboru (tempdb.mdf), souboru protokolu (templog.ldf) a dalších souborů, které se přidají do tempdb. Ujistěte se, že využité místo v souborech je menší nebo rovno požadované cílové velikosti.

  2. Připojte se k SQL Serveru pomocí SSMS, Visual Studio Code nebo sqlcmd. Potom spusťte následující příkazy Transact-SQL pro konkrétní soubory databáze, které chcete zmenšit. Nahraďte <target_size_in_MB> požadovanou velikostí:

    USE tempdb;
    GO
    
    -- This command shrinks the primary data file
    DBCC SHRINKFILE (tempdev, '<target_size_in_MB>');
    GO
    
    -- This command shrinks the log file, examine the last paragraph.
    DBCC SHRINKFILE (templog, '<target_size_in_MB>');
    GO
    

Výhodou DBCC SHRINKFILE je, že může zmenšit velikost souboru na menší než původní velikost. Můžete spouštět DBCC SHRINKFILE na libovolném datovém nebo protokolovém souboru. Databázi nemůžete zmenšit, než je velikost model databáze.

Chyba 8909 při spuštění operací zmenšení

Pokud tempdb se používá a pokusíte se ho zmenšit pomocí DBCC SHRINKDATABASE příkazů nebo DBCC SHRINKFILE příkazů, můžou se zobrazit zprávy podobné následujícímu výstupu. Přesná zpráva závisí na verzi SQL Serveru, kterou používáte:

Server: Msg 8909, Level 16, State 1, Line 1 Table error: Object ID 0, index ID -1, partition ID 0, alloc unit ID 0 (type Unknown), page ID (6:8040) contains an incorrect page ID in its page header. The PageId in the page header = (0:0).

Tato chyba neukazuje žádné skutečné poškození v tempdb. Mohou však existovat jiné důvody chyb fyzického poškození dat, jako je chyba 8909, a že tyto důvody zahrnují problémy subsystému vstupně-výstupní operace. Proto pokud k chybě dojde mimo operace zmenšení, měli byste se tím dále zabývat.

I když se do aplikace nebo uživateli, který spouští operaci zmenšení, vrátí zpráva 8909, operace zmenšení nezkrachují.