Partilhar via


Remoção de contêineres e grupos de arquivos com otimização de memória

Aplica-se a: SQL Server 2025 (17.x) e versões posteriores

No SQL Server 2022 (16.x) e versões mais antigas, se In-Memory OLTP estiver habilitado para um banco de dados, o último contêiner com otimização de memória e o grupo de arquivos com otimização de memória não poderão ser removidos, mesmo que todos os objetos OLTP In-Memory sejam descartados. Como resultado, o mecanismo OLTP In-Memory continua a ser executado quando não está em uso.

A partir do SQL Server 2025 (17.x), o motor OLTP In-Memory pode ser interrompido removendo completamente todos os contentores e grupos de ficheiros otimizados para memória em bases de dados, sem objetos OLTP In-Memory restantes.

Para remover os contêineres e o grupo de arquivos com otimização de memória e parar o mecanismo OLTP In-Memory:

  1. Como etapa de validação, conecte-se ao banco de dados e execute a seguinte consulta para confirmar se o mecanismo In-Memory OLTP (XTP) está implantado no banco de dados:

    SELECT deployment_state,
           deployment_state_desc
    FROM sys.dm_db_xtp_undeploy_status;
    

    Se a deployment_state coluna for 1 ou 2, o mecanismo OLTP In-Memory será implantado e você poderá prosseguir com as etapas a seguir. Se a deployment_state coluna for 0, o mecanismo OLTP In-Memory não será implantado no banco de dados atual ou já foi interrompido, e o restante deste artigo não se aplica.

  2. Exclua todos os objetos OLTP In-Memory na base de dados, incluindo tabelas otimizadas para memória, tipos de tabelas e procedimentos armazenados compilados nativamente.

    Atenção

    Esta etapa pode causar perda permanente de dados nas tabelas com otimização de memória no banco de dados atual. Antes de prosseguir, certifique-se de que os dados não são necessários e faça um backup do banco de dados.

    Para localizar In-Memory objetos OLTP em um banco de dados, execute as seguintes instruções 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;
    

    Para obter mais informações, consulte DROP TABLE,DROP PROCEDURE e DROP TYPE.

  3. Remova todos os contêineres com otimização de memória usando a ALTER DATABASE ... REMOVE FILE instrução. Para obter mais informações, consulte ALTER DATABASE File and Filegroup Options. Você também pode remover contêineres com otimização de memória usando a página Arquivos na caixa de diálogo Propriedades do Banco de Dados do seu banco de dados no SQL Server Management Studio (SSMS).

    A remoção do último contêiner otimizado para memória para o banco de dados inicia a remoção do mecanismo OLTP In-Memory. Esta é uma operação de longa duração que pode exigir etapas adicionais. Para obter mais informações, consulte Etapas para concluir a última remoção de contêiner com otimização de memória mais adiante neste artigo.

    Se você cancelar ou abortar uma instrução de longa execução ALTER DATABASE ... REMOVE FILE ao remover o último contêiner otimizado para memória, a remoção poderá ser parcialmente concluída. Para concluir a remoção, você pode executar a ALTER DATABASE ... REMOVE FILE instrução mais tarde.

  4. Remova o grupo de arquivos com otimização de memória usando a ALTER DATABASE ... REMOVE FILEGROUP instrução ou usando a página Grupos de arquivos na caixa de diálogo Propriedades do Banco de Dados no SSMS.

A remoção dos contêineres e do grupo de arquivos com otimização de memória é bem-sucedida e o mecanismo OLTP In-Memory é interrompido quando o deployment_state valor na coluna in sys.dm_db_xtp_undeploy_status é 0.

Observação

A remoção de contêiner com otimização de memória não é suportada quando o banco de dados tem instantâneos de banco de dados. Elimine todos os snapshots antes de remover contentores otimizados para memória.

Etapas para concluir a última remoção de contêiner com otimização de memória

Se a ALTER DATABASE ... REMOVE FILE instrução para remover o último contêiner otimizado para memória não for concluída imediatamente, etapas adicionais serão necessárias.

O DMV sys.dm_db_xtp_undeploy_status fornece o estado do processo de remoção do motor OLTP tipo In-Memory. Nas etapas a seguir, use essa consulta para determinar o status atual e as ações necessárias:

SELECT deployment_state,
       deployment_state_desc,
       undeploy_lsn,
       start_of_log_lsn
FROM sys.dm_db_xtp_undeploy_status;
  1. Se o valor de deployment_state for 3 e o valor na coluna undeploy_lsn for 0, execute o seguinte comando:

    CHECKPOINT;
    
  2. Se o valor de deployment_state for 3 e o valor na coluna undeploy_lsn for diferente de 0, então o processo de remoção do contentor está a aguardar que o número de sequência de log (LSN) na coluna start_of_log_lsn avance além do valor LSN na coluna undeploy_lsn. Isso requer que o log de transações seja truncado. Para truncar o log:

    • Execute o seguinte comando:

      CHECKPOINT;
      

      Para avançar start_of_log_lsn além do undeploy_lsn, talvez seja necessário executar esse comando várias vezes, aguardando um minuto após cada execução do comando.

    • Caso o banco de dados utilize o modelo de recuperação completa ou bulk-logged, além de executar os comandos, pode ser necessário determinar e solucionar o motivo do atraso no truncamento do log, que é identificado na coluna CHECKPOINT na vista de catálogo log_reuse_wait_desc.

      Se deployment_state o valor permanecer 3 após a execução dos CHECKPOINT comandos, execute a seguinte instrução:

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

      Depois de saber o motivo do atraso no truncamento do log, consulte Fatores que podem atrasar o truncamento do log para obter mais informações e determinar a ação apropriada.

      Em bancos de dados ativos, o log de transações geralmente é truncado após algum tempo sem qualquer ação adicional do usuário. Por exemplo, se log_reuse_wait_desc em sys.databases é LOG_BACKUP, os backups de log agendados ou a pedido truncam o log. Para obter mais informações, consulte Fazer backup de um log de transações.

      Se o valor na coluna log_reuse_wait_desc for NOTHING, mas o valor na coluna deployment_state permanecer 3, efetue uma cópia de segurança do log de transações. Para truncar o log de transações, talvez seja necessário fazer mais de um backup do log de transações.

  3. Se o deployment_state valor for 4, o início da parte ativa do log de transações avançou além do LSN de desimplantação e o processo de remoção de contêiner está aguardando o registro final do log de desimplantação. Na maioria dos casos, esta etapa é concluída em poucos segundos sem qualquer ação adicional.

    Se o banco de dados tiver réplicas de disponibilidade, o registo de remoção deve propagar-se e aplicar-se a todas as réplicas. Se o valor 4 persistir por muito tempo, consulte Determinar a razão pela qual as alterações na réplica primária não são refletidas na réplica secundária num grupo de disponibilidade Always On para obter mais informações.

  4. Se o deployment_state valor for 5, o processo de remoção do contêiner está aguardando a conclusão da operação final do ponto de verificação XTP. Para iniciar um ponto de verificação imediatamente, execute o seguinte comando:

    CHECKPOINT;
    

    Um ponto de verificação XTP ocorre automaticamente quando o log de transações cresce em um determinado limite. Para obter mais informações, consulte Operação de ponto de verificação para tabelas Memory-Optimized.

  5. Quando a operação final do ponto de verificação XTP for concluída, a remoção do último contêiner otimizado para memória se completa com sucesso, e o valor na coluna deployment_state torna-se 0.

  6. Se o deployment_state valor for 6, isso significa que a ALTER DATABASE ... REMOVE FILE instrução para o último contêiner otimizado para memória foi cancelada ou anulada. Execute a instrução novamente para concluir a remoção do contêiner.