Reducir el archivo de registro no reduce el tamaño

24

Tengo una base de datos que tiene un archivo de datos de 350 MB (.mdf) y un archivo de registro de 4.9 GB (.ldf). El modelo de recuperación está configurado en FULL.

Cuando trato de reducir el archivo de registro, no se reduce.

Sé que reducir una base de datos no es bueno y no debería hacerse. Pero todavía estoy tratando de hacerlo por reducir el archivo de registro.

Cuando corrí

DBCC SQLPerf(logspace) 

¡Encontré que el tamaño de registro es 4932 MB y el espacio de registro utilizado es 98.76% !

Entonces probé este comando

USE <databasename>;
DBCC loginfo;

Ahora, casi todos los VLF tienen "estado 2", lo que significa que todos están en uso.

Traté de hacer una copia de seguridad del registro y luego reducir el archivo de registro. La reducción no redujo el tamaño.

Cambié el modelo de recuperación SIMPLEe intenté reducirlo nuevamente, pero esto tampoco ayudó.

Revisé las transacciones abiertas

DBCC opentran (database);

y descubrí que ninguna transacción está abierta ahora.

¿Qué me impide reducir el archivo de registro? ¿Como puedo resolver esto?

Navaneet
fuente

Respuestas:

12

Aquí está la respuesta a mi propia pregunta.

Ejecute la consulta a continuación para obtener información sobre la espera de reutilización del archivo de registro:

SELECT log_reuse_wait_desc
FROM sys.databases
WHERE name = 'DBName'

Obtuve el siguiente resultado:

log_reuse_wait_desc
-------------------
REPLICATION 

Quedaban algunos objetos relacionados con la replicación en la base de datos, incluso después de eliminar la replicación.

Para eliminar la replicación de la base de datos, sp_removedbreplicationse puede utilizar. Pero no funcionó para nosotros, ya que la replicación no estaba activa en ese momento y en realidad la replicación se había eliminado mucho antes.

La solución fue importar el contenido de la base de datos a otra base de datos utilizando la opción de importación de SQL Server.

Navaneet
fuente
Tuve el mismo problema y usé esto para ver que había una transacción activa en la base de datos. log_reuse_wait_descdio ACTIVE_TRANSACTION. Tan pronto como se completó la transacción, la reducción funcionó bien.
Squillman
10

Los pasos para reducir el registro van a ser

Copia de seguridad del registro de transacciones a través de SSMS o T-SQL y luego realiza una reducción

los comandos para SSMS están bajo las tareas si hace clic derecho en el nombre de la base de datos

BACKUP LOG <Databasename> TO DISK N'<path\database_log.ldf';
GO

DBCC SHRINKFILE (<FileName>, <TargetSize>) WITH NO_INFOMSGS

Probablemente tengas que hacer esto varias veces

Si hay una transacción o trabajo que bloquea la acción, use el Monitor de actividad para identificar el proceso y eliminarlo, o use el monitor de actividad de trabajo del Agente SQL para finalizar el trabajo.

fuente: http://support.microsoft.com/kb/907511

Puma9000
fuente
Pero el problema que encontré es diferente. Vea mi respuesta a continuación
Navaneet
Me alegra saber que lo entendiste, ¡gracias por la actualización!
Cougar9000
Sintaxis incorrecta: falta un signo igual: BACKUP LOG <Databasename> TO DISK = N '<path \ database_log.ldf';
Ingeniero invertido
9

Lea Cómo reducir el registro de SQL Server para obtener una explicación de cómo la naturaleza circular del registro puede evitar la reducción después del truncamiento. Es posible que registre el último punto LSN en un VLF que se encuentra en la cola del LDF. Contrarrestar intuitivamente debe avanzar el registro, generando escrituras de registro, para permitir que se reduzca.

Remus Rusanu
fuente
0

Primero debe crear una copia de seguridad, que depende del modelo de copia de seguridad configurado para la base de datos antes de poder reducirla.

Puedes intentar ejecutar esto:

USE <databasename>
GO

BACKUP DATABASE <databasename> TO DISK '<absolute path goes here>\<databasename>.bak';
GO

O puede hacerlo desde SSMS y utilizar las herramientas gráficas disponibles (consulte aquí para obtener más detalles: http://msdn.microsoft.com/en-us/library/ms187510.aspx )

Una vez que haya hecho una copia de seguridad de su base de datos, puede comprimirla. Sin embargo, reducir la base de datos no es una buena idea ya que se producirá una gran fragmentación del índice y la búsqueda de datos será lenta.

Espero que esto ayude.

Toni Kostelac
fuente
Sé cómo hacer una copia de seguridad y truncar el registro y reducir el tamaño del archivo de registro. Pero para esta base de datos tengo un problema. Acabo de ejecutar la consulta, seleccione log_reuse_wait_desc de sys.databases donde name = 'dbname' y descubrí que la replicación está causando el problema. Pero no tengo la replicación configurada. Entonces, ¿cómo eliminar la replicación de esta base de datos que se muestra en log reuse wait_desc?
Navaneet
¿Qué versión de SQL Server estás usando?
Toni Kostelac
La replicación se puede configurar como un trabajo, por lo tanto, abra la carpeta del Agente SQL Server y expanda la carpeta Trabajos, verifique si hay un trabajo de replicación configurado y, de ser así, desactívelo haciendo clic derecho y seleccionando Detener trabajo
Toni Kostelac
Si está utilizando SQL Server 2005 y versiones posteriores, sp_removedbreplication 'DB_NAME' eliminará la replicación. Para el servidor SQL 2000 .. consulte blogs.msdn.com/b/repltalk/archive/2010/11/17/…
Kin Shah
Pero el problema que encontré es diferente
favor,
0

He descubierto que tengo que realizar 2 o 3 copias de seguridad tanto de la base de datos como del registro de transacciones para que el registro de transacciones realmente se reduzca de tamaño. Tengo una base de datos que se creó con el modelo de recuperación completa. Todas las noches realiza copias de seguridad de la base de datos y el registro de transacciones, pero inevitablemente el registro de transacciones parece crecer continuamente durante 2-3 semanas. Cuando el espacio en disco restante llegue a 1 GB, veré que el registro de transacciones es de aproximadamente 30 GB. Seguí los pasos recomendados por Microsoft y después de la cuarta o quinta iteración de la copia de seguridad de la base de datos y el registro de transacciones, el registro de transacciones finalmente liberará su espacio extra y se reducirá. Luego vuelvo y elimino las múltiples copias de seguridad que he creado.

SQL King
fuente
Creo que estás haciendo algo mal. Si realiza una copia de seguridad del registro correctamente, el registro no utilizado debe truncarse. Los comandos dados en mi pregunta pueden ayudarlo a resolver el problema.
Navaneet
-8

Mi trabajo para la Replicación que está bloqueando la reducción del archivo de registro es:

  1. Establecer el modelo de recuperación de DB a simple
  2. Poner DB fuera de línea
  3. Crear copia de seguridad del archivo de registro (por si acaso)
  4. Eliminar archivo de registro
  5. Poner DB en línea

En mi caso funcionó. Después de traer DB, el registro en línea se creó automáticamente y su tamaño era de 512 kb en lugar de 70 GB. Pero esto es solo una solución. El problema raíz no está resuelto. En mi caso estamos usando replicación.

mecool
fuente
44
Este es un consejo terrible, nunca elimine su registro de transacciones, todo tipo de problemas pueden provenir de esto, como la corrupción
Tom V - Team Monica