Sdílet prostřednictvím


Odebrání kontejneru optimalizovaného pro paměť a skupiny souborů

Platí pro: SQL Server 2025 (17.x) a novější verze

Pokud je v SQL Serveru 2022 (16.x) a starších verzích povolená In-Memory OLTP pro databázi, není možné odebrat poslední kontejner optimalizovaný pro paměť a skupinu souborů optimalizovanou pro paměť, a to ani v případě, že jsou odstraněny všechny objekty OLTP In-Memory. V důsledku toho se modul In-Memory OLTP bude dál spouštět, když se nepoužívá.

Počínaje SYSTÉMEM SQL Server 2025 (17.x) lze modul In-Memory OLTP zastavit tak, že zcela odeberete všechny kontejnery a skupiny souborů optimalizované pro paměť v databázích bez zbývajících In-Memory objektů OLTP.

Odebrání kontejnerů optimalizovaných pro paměť a skupiny souborů a zastavení modulu In-Memory OLTP:

  1. Jako ověřovací krok se připojte k databázi a spusťte následující dotaz, abyste potvrdili, že je v databázi nasazený modul In-Memory OLTP (XTP):

    SELECT deployment_state,
           deployment_state_desc
    FROM sys.dm_db_xtp_undeploy_status;
    

    deployment_state Pokud je sloupec 1 nebo 2, nasadí se In-Memory modul OLTP a můžete pokračovat následujícími kroky. deployment_state Pokud je sloupec 0, modul In-Memory OLTP není nasazený v aktuální databázi nebo je už zastavený a zbytek tohoto článku se nepoužije.

  2. Zahoďte všechny objekty OLTP In-Memory v databázi, včetně tabulek a typů tabulek optimalizovaných pro paměť a nativně zkompilovaných uložených procedur.

    Upozornění

    Tento krok může způsobit trvalou ztrátu dat v tabulkách optimalizovaných pro paměť v aktuální databázi. Než budete pokračovat, ujistěte se, že data nejsou potřebná, a vytvořte zálohu databáze.

    Pokud chcete najít In-Memory objekty OLTP v databázi, spusťte následující příkazy T-SQL:

    USE [<database-name-placeholder>];
    
    /* memory-optimized tables */
    SELECT object_id,
           OBJECT_SCHEMA_NAME(object_id) AS schema_name,
           name AS table_name
    FROM sys.tables
    WHERE is_memory_optimized = 1;
    
    /* natively compiled modules */
    SELECT object_id,
           OBJECT_SCHEMA_NAME(object_id) AS schema_name,
           OBJECT_NAME(object_id) AS module_name
    FROM sys.all_sql_modules
    WHERE uses_native_compilation = 1;
    
    /* memory-optimized table types */
    SELECT SCHEMA_NAME(schema_id) AS type_schema_name,
           name AS type_name,
           OBJECT_NAME(type_table_object_id) AS type_table_name
    FROM sys.table_types
    WHERE is_memory_optimized = 1;
    

    Další informace naleznete v tématu DROP TABLE, DROP PROCEDURE a DROP TYPE.

  3. Pomocí příkazu ALTER DATABASE ... REMOVE FILE odeberte všechny kontejnery optimalizované pro paměť. Další informace naleznete v tématu ALTER DATABASE File and Filegroup Options. Kontejnery optimalizované pro paměť můžete také odebrat pomocí stránky Soubory v dialogovém okně Vlastnosti databáze pro vaši databázi v aplikaci SQL Server Management Studio (SSMS).

    Odebrání posledního kontejneru optimalizovaného pro paměť pro databázi spustí odebrání modulu In-Memory OLTP. Jedná se o dlouhotrvající operaci, která může vyžadovat další kroky. Další informace najdete v části Kroky dokončení posledního odebrání kontejneru optimalizovaného pro paměť dále v tomto článku.

    Pokud zrušíte nebo přerušíte dlouhotrvající ALTER DATABASE ... REMOVE FILE příkaz při odebírání posledního kontejneru optimalizovaného pro paměť, může být odebrání částečně dokončené. Odebrání dokončíte provedením ALTER DATABASE ... REMOVE FILE příkazu později.

  4. Pomocí příkazu odeberte skupinu ALTER DATABASE ... REMOVE FILEGROUP souborů optimalizovanou pro paměť nebo pomocí stránky Filegroups v dialogovém okně Vlastnosti databáze v nástroji SSMS.

Odebrání kontejnerů optimalizovaných pro paměť a skupiny souborů je úspěšné a modul In-Memory OLTP se zastaví, když je hodnota ve deployment_state sloupci sys.dm_db_xtp_undeploy_status 0.

Poznámka:

Odebrání kontejneru optimalizovaného pro paměť není podporováno, pokud má databáze žádné snímky databáze. Před odebráním kontejnerů optimalizovaných pro paměť odstraňte všechny snímky.

Kroky k dokončení odebrání posledního kontejneru optimalizovaného pro paměť

Pokud se ALTER DATABASE ... REMOVE FILE příkaz pro odebrání posledního kontejneru optimalizovaného pro paměť nedokončí okamžitě, vyžadují se další kroky.

Zobrazení dynamické správy sys.dm_db_xtp_undeploy_status poskytuje stav procesu odebrání modulu OLTP In-Memory. V následujících krocích použijte tento dotaz k určení aktuálního stavu a požadovaných akcí:

SELECT deployment_state,
       deployment_state_desc,
       undeploy_lsn,
       start_of_log_lsn
FROM sys.dm_db_xtp_undeploy_status;
  1. deployment_state Pokud je hodnota 3 a hodnota ve undeploy_lsn sloupci je 0, spusťte následující příkaz:

    CHECKPOINT;
    
  2. Pokud je hodnota deployment_state 3 a hodnota ve sloupci undeploy_lsn je jiná než 0, proces odebrání kontejneru čeká, až číslo sekvence protokolu (LSN) ve sloupci start_of_log_lsn překročí hodnotu LSN ve sloupci undeploy_lsn. To vyžaduje zkrácení transakčního protokolu. Pro zkrácení protokolu:

    • Spusťte následující příkaz:

      CHECKPOINT;
      

      Pokud chcete přejít start_of_log_lsn nad rámec undeploy_lsn, možná budete muset tento příkaz spustit několikrát, počkat minutu po každém spuštění příkazu.

    • Pokud databáze používá model úplného nebo hromadně protokolovanéhoobnovení, pak kromě provádění CHECKPOINT příkazů možná budete muset určit a vyřešit důvod zpoždění zkrácení protokolu, který je hlášen ve sloupci v log_reuse_wait_descsys.databases zobrazení katalogu.

      Pokud deployment_state hodnota po provedení CHECKPOINT příkazů zůstane 3, spusťte následující příkaz:

      SELECT name,
             log_reuse_wait_desc
      FROM sys.databases
      WHERE database_id = DB_ID();
      

      Jakmile znáte důvod zpoždění zkrácení protokolu, podívejte se na faktory, které mohou zpozdit zkrácení protokolu pro více informací a určete vhodný postup.

      Ve aktivních databázích je transakční log obvykle zkrácen po nějaké době bez jakékoli další akce uživatele. Pokud je log_reuse_wait_desc v sys.databases například LOG_BACKUP, pak naplánované nebo na vyžádání zálohování protokolů zkrátí protokol. Další informace naleznete v tématu Zálohování transakčního protokolu.

      Pokud je hodnota ve sloupci log_reuse_wait_desc rovna NOTHING, ale hodnota ve sloupci deployment_state zůstává 3, zálohujte transakční log. Pokud chcete zkrátit transakční protokol, možná budete muset vytvořit více než jednu zálohu transakčního protokolu.

  3. deployment_state Pokud je hodnota 4, pak začátek aktivní části transakčního protokolu pokročil za LSN zrušení nasazení a proces odstraňování kontejneru čeká na konečný záznam protokolu zrušení nasazení. Ve většině případů se tento krok dokončí během několika sekund bez jakékoli další akce.

    Pokud databáze obsahuje repliky dostupnosti, musí být záznam o ukončení nasazení rozšířen a použit na všechny repliky. Pokud hodnota 4 přetrvává delší dobu, přečtěte si téma Určení, proč nejsou změny z primární repliky zobrazeny na sekundární replice pro skupiny dostupnosti Always On, kde najdete další informace.

  4. deployment_state Pokud je hodnota 5, proces odebrání kontejneru čeká na dokončení konečné operace kontrolního bodu XTP. Pokud chcete kontrolní bod zahájit okamžitě, spusťte následující příkaz:

    CHECKPOINT;
    

    Kontrolní bod XTP probíhá automaticky, jakmile se transakční protokol zvýšil o určitou prahovou hodnotu. Další informace naleznete v tématu Operace kontrolního bodu pro Memory-Optimized tabulky.

  5. Po dokončení poslední operace kontrolního bodu XTP se odebrání posledního kontejneru optimalizovaného pro paměť úspěšně dokončí a hodnota ve deployment_state sloupci bude 0.

  6. deployment_state Pokud je hodnota 6, znamená to, že ALTER DATABASE ... REMOVE FILE příkaz pro poslední kontejner optimalizovaný pro paměť byl zrušen nebo přerušen. Spusťte příkaz znovu a dokončete odebrání kontejneru.