Aracılığıyla paylaş


Bellek açısından optimize edilmiş konteyner ve dosya grubu kaldırma

Şunlar için geçerlidir: SQL Server 2025 (17.x) ve sonraki sürümleri

SQL Server 2022 (16.x) ve daha eski sürümlerde, veritabanı için In-Memory OLTP etkinleştirildiyse, tüm In-Memory OLTP nesneleri bırakılsa bile bellek için iyileştirilmiş son kapsayıcı ve bellek için iyileştirilmiş dosya grubu kaldırılamaz. Sonuç olarak, In-Memory OLTP altyapısı kullanılmadığında çalışmaya devam eder.

SQL Server 2025'ten (17.x) başlayarak, In-Memory OLTP motoru, kalan In-Memory OLTP nesneleri olmayan veritabanlarındaki tüm bellek için optimize edilmiş kapsayıcılar ve dosya grupları tamamen kaldırıldığında durdurulabilir.

Bellek-iyileştirilmiş kaplar ve dosya grubunu kaldırmak ve In-Memory OLTP motorunu durdurmak için:

  1. Doğrulama adımı olarak veritabanına bağlanın ve In-Memory OLTP (XTP) altyapısının veritabanına dağıtıldığını onaylamak için aşağıdaki sorguyu yürütebilirsiniz:

    SELECT deployment_state,
           deployment_state_desc
    FROM sys.dm_db_xtp_undeploy_status;
    

    deployment_state Sütun 1 veya 2 ise, In-Memory OLTP altyapısı dağıtılır ve aşağıdaki adımlarla devam edebilirsiniz. deployment_state Sütun 0 ise, In-Memory OLTP motoru geçerli veritabanında dağıtılmamış veya zaten durdurulmuş demektir ve makalenin geri kalan kısmı geçerli olmaz.

  2. Veritabanında, bellek ile iyileştirilmiş tablolar ve tablo türleri ile yerel olarak derlenmiş saklı yordamlar da dahil olmak üzere tüm In-Memory OLTP nesnelerini kaldırın.

    Dikkat

    Bu adım, geçerli veritabanındaki bellek için iyileştirilmiş tablolarda kalıcı veri kaybına neden olabilir. Devam etmeden önce verilerin gerekli olmadığından emin olun ve veritabanının yedeğini alın.

    Veritabanındaki In-Memory OLTP nesnelerini bulmak için aşağıdaki T-SQL deyimlerini yürütür:

    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;
    

    Daha fazla bilgi için bkz . DROP TABLE, DROP PROCEDURE ve DROP TYPE.

  3. ALTER DATABASE ... REMOVE FILE ifadesini kullanarak bellek için iyileştirilmiş tüm kapsayıcıları kaldırın. Daha fazla bilgi için bkz. ALTER DATABASE Dosya ve Dosya Grubu Seçenekleri. Ayrıca, SQL Server Management Studio'da (SSMS) veritabanınızın Veritabanı Özellikleri iletişim kutusundaki Dosyalar sayfasını kullanarak bellek için iyileştirilmiş kapsayıcıları kaldırabilirsiniz.

    Veritabanı için bellek iyileştirmeli son kapsayıcının kaldırılması, In-Memory OLTP motorunun kaldırılmasını başlatır. Bu, ek adımlar gerektirebilecek uzun süre çalışan bir işlemdir. Daha fazla bilgi için bu makalenin devamında bellek için iyileştirilmiş kapsayıcı kaldırma işlemini tamamlama adımları bölümüne bakın.

    Bellek ile optimize edilmiş son kapsayıcıyı kaldırma işlemi sırasında, uzun süredir çalışmakta olan ALTER DATABASE ... REMOVE FILE ifadesini iptal eder veya durdurursanız, kaldırma işlemi kısmen tamamlanmış olabilir. Kaldırma işlemini tamamlamak için ALTER DATABASE ... REMOVE FILE ifadesini daha sonra yürütebilirsiniz.

  4. deyimini kullanarak ALTER DATABASE ... REMOVE FILEGROUP veya SSMS'deki Veritabanı Özellikleri iletişim kutusundaki Dosya Grupları sayfasını kullanarak bellek için iyileştirilmiş dosya grubunu kaldırın.

Bellek için iyileştirilmiş kapsayıcıların ve dosya grubunun kaldırılması başarılı olur ve içindeki sütundaki deployment_statesys.dm_db_xtp_undeploy_status değer 0 olduğunda In-Memory OLTP altyapısı durdurulur.

Uyarı

Veritabanında veritabanı anlık görüntüleri olduğunda bellek için optimize edilmiş kapsayıcının kaldırılması desteklenmez. Bellek için iyileştirilmiş kapsayıcıları kaldırmadan önce tüm anlık görüntüleri silin.

Bellek için optimize edilmiş son kapsayıcıyı kaldırma adımları

Bellek için iyileştirilmiş son kapsayıcıyı kaldırma işlemi hemen tamamlanmazsa ek adımlar gerekir.

sys.dm_db_xtp_undeploy_status DMV, In-Memory OLTP altyapısı kaldırma işleminin durumunu sağlar. Aşağıdaki adımlarda, geçerli durumu ve gerekli eylemleri belirlemek için bu sorguyu kullanın:

SELECT deployment_state,
       deployment_state_desc,
       undeploy_lsn,
       start_of_log_lsn
FROM sys.dm_db_xtp_undeploy_status;
  1. deployment_state Değer 3 ve sütundaki undeploy_lsn değer 0 ise aşağıdaki komutu yürütür:

    CHECKPOINT;
    
  2. Eğer deployment_state değeri 3 ve undeploy_lsn sütunundaki değer 0'dan farklıysa, kapsayıcı kaldırma işlemi, start_of_log_lsn sütunundaki günlük dizisi numarasının (LSN), undeploy_lsn sütunundaki LSN değerinin ötesine geçmesini bekler. Bunun için işlem günlüğünün kısaltılması gerekir. Günlüğü kesmek için:

    • Aşağıdaki komutu yürütür:

      CHECKPOINT;
      

      'nin ötesine start_of_log_lsngeçmek undeploy_lsn için bu komutu birkaç kez yürütmeniz ve her komut yürütmeden bir dakika sonra beklemeniz gerekebilir.

    • Veritabanı Tam veya Toplu günlüğe kaydedilenkurtarma modelini kullanıyorsa, CHECKPOINT komutlarını yürütmenin yanı sıra, log_reuse_wait_desc katalog görünümündeki sys.databases sütununda bildirilen günlük kesilmesindeki gecikmenin nedenini belirlemeniz ve gidermeniz gerekebilir.

      deployment_state Komutlar yürütülürken CHECKPOINT değer 3 olarak kalırsa aşağıdaki deyimi yürütür:

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

      Günlük kesilmesindeki gecikmenin nedenini öğrendiğinizde, daha fazla bilgi edinmek ve uygun eylemi belirlemek için Günlük kesilmesini geciktirebilecek faktörler bölümüne bakın ve uygun eylemi belirleyin.

      Etkin veritabanlarında, işlem günlük kaydı genellikle herhangi bir ek kullanıcı müdahalesi olmadan bir süre sonra kısaltılır. Örneğin, log_reuse_wait_desc içindeki sys.databasesLOG_BACKUP ise, zamanlanmış veya isteğe bağlı günlük yedeklemeleri günlüğü keser. Daha fazla bilgi için bkz . İşlem günlüğünü yedekleme.

      sütunundaki değer log_reuse_wait_desc ise NOTHINGancak sütundaki deployment_state değer 3 olarak kalırsa işlem günlüğünü yedekleyin. İşlem günlüğünü kısaltmak için birden fazla işlem günlüğü yedeklemesi yapmanız gerekebilir.

  3. deployment_state Değer 4 ise, etkin işlem günlüğü bölümünün başlangıcı, dağıtım kaldırma LSN'sinin ötesine geçmiştir ve kapsayıcı kaldırma işlemi son kaldırma günlüğü kaydını bekliyor. Çoğu durumda, bu adım ek bir eylem olmadan birkaç saniye içinde tamamlar.

    Veritabanı kullanılabilirlik replikaları varsa, kaldırılma kaydının yayılması ve tüm replikalara uygulanması gerekir. 4 değeri uzun süre devam ederse, Birincil kopyadaki değişikliklerin neden bir Always On kullanılabilirlik grubu için ikincil kopyaya yansıtılmadığını belirleme bölümüne bakın.

  4. deployment_state Değer 5 ise kapsayıcı kaldırma işlemi son XTP denetim noktası işleminin tamamlanmasını bekler. Bir denetim noktasını hemen başlatmak için aşağıdaki komutu yürütür:

    CHECKPOINT;
    

    İşlem günlüğü belirli bir eşiğe ulaştığında XTP denetim noktası otomatik olarak gerçekleşir. Daha fazla bilgi için bkz. Memory-Optimized Tabloları için Denetim Noktası İşlemi.

  5. Son XTP denetim noktası işlemi tamamlandıktan sonra bellek için iyileştirilmiş son kapsayıcının kaldırılması başarıyla tamamlanır ve sütundaki deployment_state değer 0 olur.

  6. deployment_state değeri 6 ise, bu, son bellek için iyileştirilmiş kapsayıcıya ait ALTER DATABASE ... REMOVE FILE ifadesinin iptal edildiğini veya durdurulduğunu belirtir. Kapsayıcı kaldırma işlemini tamamlamak için komutu yeniden yürütün.