Sdílet prostřednictvím


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 neočekávaně zvětšovat na velikost 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 model databáze a tempdb se obnoví na poslední nakonfigurovanou velikost. Nakonfigurovaná velikost je poslední explicitní velikost nastavená pomocí operace změny velikosti souboru, například ALTER DATABASE, která používá možnost MODIFY FILE nebo příkazy DBCC SHRINKFILE nebo DBCC SHRINKDATABASE. Proto pokud nebudete muset použít jiné hodnoty nebo získat okamžité řešení pro 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í. Proto, abyste zajistili úspěšné zmenšení tempdb, doporučujeme to provést, když je server v režimu jednoho uživatele, nebo když zastavíte veškerou aktivitu tempdb.

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žití příkazu ALTER DATABASE

Poznámka

Tento příkaz funguje pouze u výchozích tempdb logických souborů tempdev a templog. Pokud se do tempdbpřidají 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ří. Jsou ale prázdné a dají se odebrat. Pokud chcete v tempdbodebrat další soubory, použijte příkaz ALTER DATABASE s možností REMOVE FILE.

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

  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> požadovanou velikostí:

    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 ověříte velikost tempdb.mdf a templog.ldf souborů.

Použití příkazu DBCC SHRINKDATABASE

DBCC SHRINKDATABASE obdrží parametr target_percent. Jedná se o požadované procento volného místa, které zbývá v databázovém souboru po zmenšení databáze. Pokud používáte DBCC SHRINKDATABASE, možná budete muset restartovat SQL Server.

  1. Pomocí uložené procedury sp_spaceused určete, kolik prostoru se aktuálně používá v tempdb. Pak vypočítat procento volného místa, které je ponecháno pro použití 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ý prostor 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 o 800 MB = 25 procent a to 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. Připojte se k SQL Serveru pomocí SSMS, Azure Data Studia nebo sqlcmda spusťte následující příkaz Transact-SQL. Nahraďte <target_percent> požadovaným procentem:

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

U tempdbexistují omezení příkazu DBCC SHRINKDATABASE . Cílová velikost pro data a soubory protokolu nemůže být menší než velikost zadaná při vytvoření databáze nebo menší než poslední nastavená explicitní velikost pomocí operace změny velikosti souboru, například ALTER DATABASE, která používá možnost MODIFY FILE. Dalším omezením DBCC SHRINKDATABASE je výpočet parametru target_percentage a jeho závislosti na aktuálním použitém prostoru.

Použití příkazu DBCC SHRINKFILE

Pomocí příkazu DBCC SHRINKFILE zmenšete jednotlivé soubory tempdb. 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 obdrží parametr target_size. Toto je požadovaná konečná 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 místo použité v souborech je menší nebo rovno požadované cílové velikosti.

  2. Připojte se k SQL Serveru pomocí SSMS, Azure Data Studia nebo sqlcmda pak 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 vydat DBCC SHRINKFILE u libovolného datového souboru nebo souborů protokolu. Databázi nemůžete zmenšit, než je velikost model databáze.

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

Pokud se používá tempdb a pokud se ho pokusíte zmenšit pomocí příkazů DBCC SHRINKDATABASE nebo DBCC SHRINKFILE, můžou se v závislosti na používané verzi SQL Serveru zobrazit zprávy podobné následujícímu:

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 provést další vyšetřování problému.

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