transaction transacciones saber registro quien muy log_backup log lleno limpiar grande está debido datos como borro archivos archivo sql-server

saber - Enorme registro de transacciones con base de datos de SQL Server en modo de recuperación simple



log de transacciones sql server (5)

Como se dijo en otras respuestas, las transacciones activas y las replicaciones son causas típicas de este problema.
Otra, menos visible, es Change Data Capture (CDC).

Recientemente tuve un problema similar y el procedimiento que me permitió liberar el registro fue el siguiente:

  • Deshabilitar CDC: EXEC sys.sp_cdc_disable_db
  • Cree una publicación en una tabla arbitraria dentro de la base de datos en cuestión
  • Eliminar esta / todas las publicaciones. EXEC sp_removedbreplication ''my_db'' es una forma conveniente de hacerlo.
  • Reducir el registro como se desee

No estoy seguro de por qué fue necesaria la creación / eliminación de esta publicación ficticia / nunca utilizada, pero así fue. Tentativamente, la base de datos puede haber tenido publicaciones anteriores que no se eliminaron correctamente (se dice que ocurre con frecuencia con bases de datos restauradas desde una copia de seguridad anterior).

Otro lenguaje de diagnóstico útil es verificar el log_reuse_wait_desc en sys.databases para la base de datos ofensiva. Este campo lee REPLICATION hasta que REPLICATION el procedimiento anterior.

SELECT log_reuse_wait_desc, * FROM sys.databases where name = ''my_db''

Tengo una base de datos SQL Server bastante grande que utiliza el modo de recuperación SIMPLE. Realmente no tenemos la necesidad de recuperar la segunda recuperación, así que preferiría que nos mantuviéramos en este modo.

Por alguna razón, el registro de transacciones para esta base de datos es masivo (410 GB) con el 99% del espacio sin asignar.

He intentado reducir el tamaño del archivo usando (DBCC SHRINKFILE (MyDatabase_log, 20000)) pero no parece funcionar.

¿Alguien tiene algún consejo sobre por qué una base de datos en modo de recuperación SIMPLE tendría un archivo tan grande? Realmente me gustaría hacerlo encogido.


Replicación del editor? ¿Podría ser esta la razón del enorme registro de transacciones?


Si solo tiene un archivo mdf y un archivo de registro, tal vez la forma más sencilla sea separar la base de datos, cambiar el nombre del registro y volver a adjuntar la base de datos. SQL Server creará un nuevo archivo de registro. Después de eso, su gran archivo de registro se puede eliminar de forma segura.

Aunque esto no funcionará si tiene varios archivos de datos.


Significa que una vez tuvo una sola transacción que duró tanto tiempo que obligó al registro a crecer 410GB. El registro no se puede reutilizar si hay una transacción activa ya que la información de retrotracción no se puede borrar. Tal ejemplo sería si alguien abre una consulta SSMS, inicia una transacción, actualiza un registro y luego se va de vacaciones. La transacción se activará y forzará el crecimiento del registro hasta que finalmente se confirme o se deshaga. Cuando la transacción finalmente termina, el espacio utilizado puede finalmente ser reclamado, dejando un enorme archivo de registro vacío.

Otro escenario es si tuviera aproximadamente 200 GB de datos actualizados en una sola transacción. El registro almacenará las imágenes antes y después de los cambios, lo que consumirá el doble de espacio y no podrá reutilizarse, nuevamente porque es una única transacción.

Actualizar

Olvidé mencionar la Replicación, que también es un factor que puede evitar el truncamiento del registro. Y también lo es Mirroring, una transacción distribuida (técnicamente es lo mismo que una ''transacción activa'', pero la implicación de DTC hace que sea un caso distinto). La lista completa y las explicaciones se encuentran en Factores que pueden demorar el truncamiento del registro .


Te estás perdiendo un argumento en el dbcc shrinkfile :

dbcc shrinkfile (MyDatabase_log, 20000, TRUNCATEONLY)

NOTRUNCATE es el valor predeterminado, que mueve los bloques asignados al principio del espacio no asignado. TRUNCATEONLY elimina el espacio no asignado. Así que si haces un NOTRUNCATE seguido de un TRUNCATEONLY , obtienes un registro reducido.