Compartilhar via


Remoção de contêineres e grupos de arquivos otimizados para 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 se todos os objetos OLTP In-Memory forem removidos. Como resultado, o mecanismo OLTP In-Memory continua a ser executado quando não estiver em uso.

A partir do SQL Server 2025 (17.x), o mecanismo In-Memory OLTP pode ser interrompido removendo completamente todos os contêineres e grupos de arquivos com otimização de memória em bancos 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 uma etapa de validação, conecte-se ao banco de dados e execute a seguinte consulta para confirmar se o mecanismo OLTP (XTP) In-Memory 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 In-Memory OLTP não será implantado no banco de dados atual ou já foi interrompido e o restante deste artigo não se aplicará.

  2. Exclua todos os objetos OLTP In-Memory no banco de dados, incluindo tabelas e tipos de tabela otimizados para memória e procedimentos armazenados compilados nativamente.

    Cuidado

    Essa etapa pode causar perda permanente de dados nas tabelas com otimização de memória no banco de dados atual. Antes de continuar, verifique se 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 instrução ALTER DATABASE ... REMOVE FILE . Para saber mais, confira Opções de arquivo e grupo de arquivos de ALTER DATABASE. 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 para seu banco de dados no SSMS (SQL Server Management Studio).

    A remoção do último contêiner com otimização de memória para o banco de dados inicia a remoção do mecanismo OLTP In-Memory. Essa é uma operação de execução prolongada 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 posteriormente neste artigo.

    Se você cancelar ou interromper uma instrução de ALTER DATABASE ... REMOVE FILE execução prolongada 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 otimizados para memória é bem-sucedida, e o mecanismo OLTP In-Memory é interrompido quando o valor na coluna deployment_state em sys.dm_db_xtp_undeploy_status é 0.

Observação

Não há suporte para a remoção de contêiner com otimização de memória quando o banco de dados tem instantâneos de banco de dados. Solte todos os instantâneos antes de remover contêineres 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 com otimização de memória não for concluída imediatamente, serão necessárias etapas adicionais.

A DMV sys.dm_db_xtp_undeploy_status fornece o status do processo de remoção do mecanismo OLTP In-Memory. Nas etapas a seguir, use esta 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 deployment_state valor for 3 e o valor na undeploy_lsn coluna for 0, execute o seguinte comando:

    CHECKPOINT;
    
  2. Se o deployment_state valor for 3 e o valor na undeploy_lsn coluna for diferente de 0, o processo de remoção do contêiner aguarda o LSN (número de sequência de log) na start_of_log_lsn coluna para avançar além do valor LSN na undeploy_lsn coluna. Isso requer que o log de transações seja truncado. Para truncar o log:

    • Execute o comando a seguir:

      CHECKPOINT;
      

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

    • Se o banco de dados usar o modelo de recuperação full ou bulk-logged, além de executar os comandos, talvez seja necessário determinar e resolver o motivo do atraso no truncamento de log, que é relatado na coluna CHECKPOINT da exibição de catálogo log_reuse_wait_desc.

      Se o valor deployment_state permanecer como 3 após executar os CHECKPOINT comandos, execute a seguinte instrução:

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

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

      Em bancos de dados ativos, o log de transações geralmente é truncado após algum tempo sem nenhuma ação adicional do usuário. Por exemplo, se log_reuse_wait_desc estiver sys.databasesLOG_BACKUP, os backups de log agendados ou sob demanda truncarão o log. Para obter mais informações, consulte Fazer backup de um log de transações.

      Se o valor na log_reuse_wait_desc coluna for NOTHING, mas o valor na deployment_state coluna permanecer 3, faça backup do log de transações. Para truncar o log de transações, talvez seja necessário realizar mais de um backup do log de transações.

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

    Se o banco de dados tiver réplicas de disponibilidade, o registro de desimplantação deverá se propagar e ser aplicado a todas as réplicas. Se o valor 4 persistir por um longo tempo, confira Determinar por que as alterações da réplica primária não são refletidas na réplica secundária de um grupo de disponibilidade Always On para obter mais informações.

  4. Quando o valor deployment_state for 5, o processo de remoção do contêiner aguarda pela conclusão da operação final de 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 depois que o log de transações cresce em um determinado limite. Para obter mais informações, consulte a Operação de Ponto de Verificação para tabelas de Memory-Optimized.

  5. Depois que a operação de ponto de verificação XTP final for concluída, a remoção do último contêiner com otimização de memória será concluída com êxito e o valor na deployment_state coluna se tornará 0.

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