Estamos viendo errores de aplicación (excepciones) que informan el registro de transacciones "está lleno debido a ACTIVE_TRANSACTION". No hay transacciones pendientes reportadas por DBCC OPENTRAN
.
Al ejecutar, DBCC SQLPERF('logspace')
veo que el tamaño del registro es de solo 1,3 MB, pero el espacio de registro utilizado informa 107,7 %.
Esta base de datos está configurada con un archivo de registro Maxsize de más de 2 TB, el tamaño inicial es de 2 MB y el crecimiento automático está establecido en 10 %. El modelo de recuperación está configurado en Simple.
¿Cómo puede ser que el espacio de registro utilizado sea superior al 100% y, con tanto espacio disponible, por qué se generaría una excepción?
Respuesta1
Busque al culpable(s)
podrías corrersp_WhoIsActive
y ver quién está ejecutando qué y revisar la lógica de los procesos en ejecución/transacciones activas. Verifique si alguna consulta T-SQL se puede optimizar para ejecutarse más rápido o como transacciones más pequeñas, de modo que libere el espacio libre no utilizado en el archivo de registro más rápidamente para su reutilización.
Es posible por diseño
Modelo de recuperación simple de SQL Server
Cada transacción aún se escribe en el registro de transacciones, pero una vez que se completa la transacción y los datos se escriben en el archivo de datos, el espacio que se usó en el archivo de registro de transacciones ahora se puede reutilizar para nuevas transacciones.
He visto casos en los que una transacción de larga duración hizo crecer enormemente el registro de transacciones en una SIMPLE
configuración de modelo de recuperación. Esa transacción en realidad falló y tardó el mismo tiempo en revertirse. Por lo tanto, las transacciones prolongadas, el mal rendimiento o las consultas mal escritas y no optimizadas pueden causar este problema.
Una vez que se asigna espacio a un SIMPLE
archivo de registro de transacciones de la base de datos del modelo de recuperación conespacio libre en el registro de transacciones no utilizadoopor crecimiento automático desde el espacio libre a nivel del sistema operativo, el archivo de registro de transacciones retendrá el nuevo espacio hasta que se produzca una operación de reducción de archivos, por ejemplo DBCC SHRINKFILE (database_log, 2048)
.
Importante:Cuando se produce una operación de reducción de archivos, por ejemplo DBCC SHRINKFILE (database_log, 2048)
, solo liberará el espacio de registro no utilizado dentro del registro de transacciones como espacio libre para el sistema operativo. Las transacciones en ejecución activas escritas en el registro de transacciones no se liberarán durante una operación de reducción de archivos.
Reducir el archivo de registro
El problema de reducir el archivo de registro es que la próxima vez que se ejecute una transacción enorme o una consulta mal escrita, el archivo de registro se llenará nuevamente y será necesario repetir la operación de reducción. Encuentre y resuelva la raíz del problema para encontrar una solución permanente a este problema. Mientras tanto, continúe reduciendo el archivo de registro.
Arreglar la causa raíz
Es probable que la raíz del problema sea una consulta, por lo que determinar quién está haciendo qué y comunicarse con ellos e informarles del problema con sus hallazgos los presionaría para que arreglen su lógica para no manchar las particiones de espacio en disco del servidor; Mire la optimización de la lógica para consultar el ajuste del rendimiento.
A veces, la causa raíz no es una transacción de larga duración; por ejemplo, podría ser que alguien haya configurado la replicación y nunca la haya desmantelado correctamente. Empiece por comprobar
log_reuse_wait_desc in sys.databases
:SELECT name, log_reuse_wait_desc FROM sys.databases;
Sin embargo, tenga en cuenta que esto es sólo una instantánea de por qué el registro no se puede reducir AHORA.
Luego, si no encuentras nada interesante allí, puedesregistrar sp_WhoIsActive en una tabla para captar cuando la gente hace un
BEGIN TRAN
y dejar su sesión abierta durante horas. Busque transacciones de larga duración, hable con el propietario y vea si puede hacer su trabajo en partes más pequeñas en lugar de una transacción gigante.
Metadatos del espacio de archivos de registro
DBCC SQLPERF(logspace)
es un comando absolutamente funcional si solo está interesado en el consumo de los archivos de registro de su base de datos. Proporciona el tamaño acumulativo de cada archivo de registro para cada base de datos en la instancia de SQL Server, así como la cantidad de espacio consumido (como porcentaje del tamaño total del archivo de registro). Un inconveniente es el hecho de que los resultados son un agregado para la base de datos. Si tiene varios archivos de registro, los resultados se muestran en el nivel de la base de datos, no en el nivel del archivo.Si bien este comando DBCC es útil cuando revisa problemas que surgen de una programación inadecuada de la copia de seguridad de registros o un tamaño incorrecto del archivo de registro, no le brinda toda la información que necesita para tomar decisiones informadas sobre el tamaño de sus archivos de registro y ajustar la frecuencia de su programación de copias de seguridad. o modelo de recuperación.