Nota
O acceso a esta páxina require autorización. Pode tentar iniciar sesión ou modificar os directorios.
O acceso a esta páxina require autorización. Pode tentar modificar os directorios.
Se aplica a: SQL Server 2025 (17.x) y versiones posteriores
En SQL Server 2022 (16.x) y versiones anteriores, si In-Memory OLTP está habilitado para una base de datos, el último contenedor optimizado para memoria y el grupo de archivos optimizados para memoria no se pueden quitar incluso si se quitan todos los objetos OLTP de In-Memory. Como resultado, el motor de In-Memory OLTP continúa ejecutándose cuando no está en uso.
A partir de SQL Server 2025 (17.x), el motor In-Memory OLTP se puede detener quitando completamente todos los contenedores y grupos de archivos optimizados para memoria en bases de datos sin objetos In-Memory OLTP restantes.
Para quitar los contenedores y grupos de archivos optimizados para memoria y detener el motor OLTP de In-Memory:
Como paso de validación, conéctese a la base de datos y ejecute la siguiente consulta para confirmar que el motor olTP (XTP) de In-Memory está implementado en la base de datos:
SELECT deployment_state, deployment_state_desc FROM sys.dm_db_xtp_undeploy_status;Si la
deployment_statecolumna es 1 o 2, se implementa el In-Memory motor OLTP y puede continuar con los pasos siguientes. Si ladeployment_statecolumna es 0, el motor de In-Memory OLTP no se implementa en la base de datos actual o ya se ha detenido y el resto de este artículo no se aplica.Quite todos los objetos OLTP In-Memory de la base de datos, incluidas las tablas y tipos de tabla optimizadas para memoria, y los procedimientos almacenados compilados de forma nativa.
Precaución
Este paso puede provocar una pérdida permanente de datos en las tablas optimizadas para memoria de la base de datos actual. Antes de continuar, asegúrese de que los datos no son necesarios y realice una copia de seguridad de la base de datos.
Para buscar In-Memory objetos OLTP en una base de datos, ejecute las siguientes instrucciones 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 obtener más información, vea DROP TABLE, DROP PROCEDURE y DROP TYPE.
Quite todos los contenedores optimizados para memoria mediante la
ALTER DATABASE ... REMOVE FILEinstrucción . Para más información, consulte Opciones File y Filegroup de ALTER DATABASE. También puede quitar contenedores optimizados para memoria mediante la página Archivos del cuadro de diálogo Propiedades de la base de datos de la base de datos en SQL Server Management Studio (SSMS).Al quitar el último contenedor optimizado para memoria de la base de datos, se inicia la eliminación del motor OLTP de In-Memory. Se trata de una operación de larga duración que puede requerir pasos adicionales. Para obtener más información, consulte Pasos para completar la última eliminación del contenedor optimizado para memoria más adelante en este artículo.
Si cancela o anula una instrucción de ejecución
ALTER DATABASE ... REMOVE FILEprolongada al quitar el último contenedor optimizado para memoria, es posible que la eliminación se complete parcialmente. Para completar la eliminación, puede ejecutar laALTER DATABASE ... REMOVE FILEinstrucción más adelante.Quite el grupo de archivos optimizados para memoria mediante la
ALTER DATABASE ... REMOVE FILEGROUPinstrucción o use la página Grupos de archivos del cuadro de diálogo Propiedades de la base de datos en SSMS.
La eliminación de los contenedores y grupos de archivos optimizados para memoria se realiza correctamente y el motor OLTP de In-Memory se detiene cuando el valor de la deployment_state columna de sys.dm_db_xtp_undeploy_status es 0.
Nota:
No se admite la eliminación de contenedores optimizados para memoria cuando la base de datos tiene instantáneas de base de datos. Elimine todas las instantáneas antes de quitar los contenedores optimizados para la memoria.
Pasos para completar la eliminación del último contenedor optimizado para memoria
Si la ALTER DATABASE ... REMOVE FILE instrucción para quitar el último contenedor optimizado para memoria no se completa inmediatamente, se requieren pasos adicionales.
El sys.dm_db_xtp_undeploy_status DMV ofrece el estado del proceso de eliminación del motor OLTP de In-Memory. En los pasos siguientes, use esta consulta para determinar el estado actual y las acciones necesarias:
SELECT deployment_state,
deployment_state_desc,
undeploy_lsn,
start_of_log_lsn
FROM sys.dm_db_xtp_undeploy_status;
Si el
deployment_statevalor es 3 y el valor de laundeploy_lsncolumna es 0, ejecute el siguiente comando:CHECKPOINT;Si el
deployment_statevalor es 3 y el valor de laundeploy_lsncolumna es distinto de 0, el proceso de eliminación del contenedor espera a que el número de secuencia de registro (LSN) de lastart_of_log_lsncolumna avance más allá del valor LSN de laundeploy_lsncolumna. Esto requiere que se trunquen los registros de transacciones. Para truncar el registro:Ejecute el siguiente comando:
CHECKPOINT;Para avanzar
start_of_log_lsnmás alláundeploy_lsn, es posible que tenga que ejecutar este comando varias veces, esperando un minuto después de cada ejecución del comando.Si la base de datos usa el modelo de recuperacióncompleto o optimizado para cargas masivas de registros, además de ejecutar los
CHECKPOINTcomandos, es posible que tenga que determinar y solucionar el motivo del retraso en el truncamiento del registro, que se notifica en la columna de lalog_reuse_wait_descvista desys.databasescatálogo.Si
deployment_stateel valor sigue siendo 3 después de ejecutar losCHECKPOINTcomandos, ejecute la instrucción siguiente:SELECT name, log_reuse_wait_desc FROM sys.databases WHERE database_id = DB_ID();Una vez que sepa el motivo del retraso en el truncamiento del registro, consulte Factores que pueden retrasar el truncamiento del registro para obtener más información y determinar la acción adecuada.
En las bases de datos activas, el registro de transacciones normalmente se trunca después de algún tiempo sin ninguna acción de usuario adicional. Por ejemplo, si
log_reuse_wait_descensys.databasesesLOG_BACKUP, las copias de seguridad de registros programadas o a petición truncan el registro. Para obtener más información, consulte Copia de seguridad de un registro de transacciones.Si el valor de la
log_reuse_wait_desccolumna esNOTHING, pero el valor de ladeployment_statecolumna sigue siendo 3, realice una copia de seguridad del registro de transacciones. Para truncar el registro de transacciones, es posible que tenga que realizar más de una copia de seguridad del registro de transacciones.
Si el valor
deployment_statees 4, entonces el inicio de la parte activa del registro de transacciones ha superado el LSN de desimplementación y el proceso de eliminación del contenedor está esperando el registro de desimplementación final. En la mayoría de los casos, este paso se completa en unos segundos sin ninguna acción adicional.Si la base de datos tiene réplicas de disponibilidad, el registro de no implementación debe propagarse y aplicarse a todas las réplicas. Si el valor 4 persiste durante mucho tiempo, consulte Determinar por qué los cambios de la réplica principal no se reflejan en la réplica secundaria en un grupo de disponibilidad Always On para obtener más información.
Si el
deployment_statevalor es 5, el proceso de eliminación del contenedor espera a que se complete la operación de punto de comprobación XTP final. Para iniciar un punto de control inmediatamente, ejecute el siguiente comando:CHECKPOINT;Un punto de control XTP se produce automáticamente una vez que el registro de transacciones ha crecido por un umbral determinado. Para obtener más información, consulte Operación de punto de control para tablas Memory-Optimized.
Una vez completada la última operación de punto de comprobación de XTP, la eliminación del último contenedor optimizado para memoria se completa correctamente y el valor de la
deployment_statecolumna se convierte en 0.Si el
deployment_statevalor es 6, significa que laALTER DATABASE ... REMOVE FILEinstrucción del último contenedor optimizado para memoria se canceló o anuló. Vuelva a ejecutar la instrucción para completar la eliminación del contenedor.