Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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:
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_statecoluna for 1 ou 2, o mecanismo OLTP In-Memory será implantado e você poderá prosseguir com as etapas a seguir. Se adeployment_statecoluna 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.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.
Remova todos os contêineres com otimização de memória usando a
ALTER DATABASE ... REMOVE FILEinstruçã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 FILEao 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 aALTER DATABASE ... REMOVE FILEinstrução mais tarde.Remova o grupo de arquivos com otimização de memória usando a
ALTER DATABASE ... REMOVE FILEGROUPinstruçã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;
Se o valor de
deployment_statefor 3 e o valor na colunaundeploy_lsnfor 0, execute o seguinte comando:CHECKPOINT;Se o valor de
deployment_statefor 3 e o valor na colunaundeploy_lsnfor 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 colunastart_of_log_lsnavance além do valor LSN na colunaundeploy_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_lsnalém doundeploy_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
CHECKPOINTna vista de catálogolog_reuse_wait_desc.Se
deployment_stateo valor permanecer 3 após a execução dosCHECKPOINTcomandos, 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_descemsys.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_descforNOTHING, mas o valor na colunadeployment_statepermanecer 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.
Se o
deployment_statevalor 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.
Se o
deployment_statevalor 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.
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_statetorna-se 0.Se o
deployment_statevalor for 6, isso significa que aALTER DATABASE ... REMOVE FILEinstruçã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.