Establecer manualmente el tamaño del archivo de registro después de reducir SQL Server 2008 R2

10

Me estoy convirtiendo en un DBA algo involuntario en el trabajo en ese momento y realmente necesito ayuda en algo.

Tenemos una base de datos de 40 GB en modo de recuperación completa, sin respaldo de registro configurado y un gran archivo de registro de 84 GB. Mi plan hasta ahora para salvar esta situación es ejecutar una copia de seguridad de registro completa en la base de datos, reducir el archivo de registro e instigar un plan de mantenimiento para ejecutar una copia de seguridad de registro todas las noches con la copia de seguridad de la base de datos para ayudar a mantenerla bajo control.

Mi problema es que no quiero que el archivo de registro se reduzca a nada y pase la primera mañana del lunes en constante crecimiento. Tengo una estimación aproximada de lo que debería ser el archivo (aproximadamente el 20% de la base de datos) y me gustaría configurarlo desde el principio para garantizar la mayor cantidad de espacio contiguo posible. ¿Es solo un caso de cambiar el "Tamaño inicial" en Propiedades de la base de datos -> Archivos? ¿Supongo también que la base de datos necesitaría estar fuera de línea para que esto ocurra?

Gracias por adelantado

Tim Alexander
fuente
2
¿Planea hacer una copia de seguridad de la base de datos una vez por noche y ejecutar una copia de seguridad de registro una vez por noche? Tal vez debería considerar un modelo de recuperación simple para que el registro se gestione solo.
Aaron Bertrand
Aaron, estoy de acuerdo con usted en el punto de vista de recuperación de recuperación ante desastres, pero para la recuperación operativa aún pueden querer que esté lleno. No olvide que a pesar de que solo están haciendo una copia de seguridad del registro una vez al día, todavía permite la recuperación en un momento determinado.
Kenneth Fisher
1
@Kenneth, así que si haces una copia de seguridad completa a medianoche, luego una copia de seguridad de registro a las 12:05, eso me parece bastante espurio. YMMV.
Aaron Bertrand
@Aaron nuevamente, todo operativo, pero a menos que me equivoque, puede usar la copia de seguridad completa de la noche anterior y el registro tomado a las 12:05 y para una recuperación en cualquier momento del día anterior. Además, si se encuentran con un problema, no es un gran problema volver a iniciar sesión, restaurar desde la noche anterior y hacer un punto en el tiempo para volver hace unos minutos. No estoy diciendo que deberían mantenerlo lleno, solo digo que hay más involucrado que el punto de vista de RD. Dicho esto, si se mantienen tan llenos, deberían hacer copias de seguridad de registros con más frecuencia que una vez al día.
Kenneth Fisher
2
@Kenneth, pero si solo está haciendo una copia de seguridad del registro una vez al día, ¡es por eso que es enorme en primer lugar! Si necesita recuperarse hasta las 12:07 de la mañana de ayer, debe cargar todo el registro durante todo el día para recuperar 2 minutos. No muy útil
Aaron Bertrand

Respuestas:

6

Simplemente reduzca a lo que cree que es el tamaño óptimo. No use la interfaz de usuario, solo haga esto, digamos que 200 MB es su tamaño óptimo:

USE yourdb;
GO
DBCC SHRINKFILE(yourdb_log, 200);

Si solo está interesado en hacer una copia de seguridad del registro una vez al día, y no está interesado en la recuperación en un punto en el tiempo, entonces debe cambiar al modelo de recuperación simple. Esto significará que las copias de seguridad del registro son innecesarias (de hecho imposibles), pero el contenido del registro se autogestionará.

Si desea que las copias de seguridad de registros sean significativas, no planee realizar una copia de seguridad completa por la noche y luego una única copia de seguridad de registro inmediatamente después. Esto lo mantiene en el modelo de recuperación completa, hace que el registro trabaje realmente duro y no le compra nada. Entonces, si desea una recuperación en un punto en el tiempo, ejecute copias de seguridad de registros con mayor frecuencia a una velocidad que satisfaga su tolerancia a la pérdida de datos. Si no desea perder más de 15 minutos de datos, ejecute una copia de seguridad de registro cada 15 minutos.

Aaron Bertrand
fuente
Gracias por esto. Entiendo completamente todos los comentarios sobre cambiar a un modelo de recuperación simple. desafortunadamente, esta es una decisión que no puedo tomar y que debo ejecutar en varios niveles de burocracia. Sin embargo, es algo que sugeriré.
Tim Alexander
12

Su gestión de archivos puede ser una operación completamente en línea. Tiene dos rutas, dependiendo de su necesidad de retener su información de registro para fines de recuperación:

No es necesario recuperar el punto en el tiempo

  1. Convierta la base de datos a SIMPLErecuperación. Ejecute un punto de control para escribir transacciones en el disco.
  2. Acoplar el registro.
  3. Cambie el tamaño del registro al tamaño apropiado.

También recomiendo establecer una cantidad de crecimiento fija y un crecimiento ilimitado (para ayudar a administrar mejor su registro). Tenga en cuenta que la cantidad de crecimiento fijo es muy dependiente, recomiendo ir con 1-2 GB inicialmente dependiendo de cuánto crecimiento pueda esperar ese registro. Idealmente, su registro no crecerá mucho, por lo que esto no debería tener un gran impacto. Si su registro crece regularmente, es posible que deba revisar su tamaño.

Logrado usando:

ALTER DATABASE [foo] 
SET RECOVERY SIMPLE;

CHECKPOINT;

DBCC SHRINKFILE (foo_log,0);

ALTER DATABASE [foo]
MODIFY FILE (NAME=foo_log,SIZE=8000MB,MAXSIZE=UNLIMITED,FILEGROWTH=1000MB);

--Optional if you want the database in full recovery mode 
--for point in time recovery going forward
ALTER DATABASE [foo] 
SET RECOVERY FULL;

Punto de recuperación de tiempo necesario

El mayor problema será que no puede reducir su archivo de registro más allá de su segmento VLF actualmente activo. Para ver esto, puede usarlo DBCC LOGINFOen el contexto de la base de datos. Cualquier segmento con un Estado = 2 está activo. Para borrar segmentos activos, deberá ejecutar una copia de seguridad del registro de transacciones cuando no haya transacciones activas en ese segmento. Tus pasos son:

  1. Ejecute una copia de seguridad del registro de transacciones.
  2. Reduce tu archivo. (Idealmente, aplanar, pero si su base de datos está activa, será difícil hacerlo).
  3. Repita los pasos 1 y 2 hasta que su registro tenga el tamaño adecuado, idealmente lo más pequeño posible.
  4. Cambie el tamaño del registro al tamaño apropiado.

Logrado usando:

BACKUP LOG [foo] TO DISK='<Location of t-log backup>';

DBCC SHRINKFILE (foo_log,0);

--Repeat the above until your log file is small "enough"

ALTER DATABASE [foo]
MODIFY FILE (NAME=foo_log,SIZE=8000MB,MAXSIZE=UNLIMITED,FILEGROWTH=1000MB);

Algunos recursos adicionales para comprender lo que está sucediendo aquí:

Mike Fal
fuente
2

En realidad no, la base de datos no necesita estar fuera de línea para reducir el registro. Y diré que este es probablemente uno de los pocos casos en los que reducir el registro es una buena idea. Puede establecer el tamaño inicial, pero sería más fácil hacer el encogimiento y decirle que se reduzca a un tamaño específico.

USE [DBName]
GO
DBCC SHRINKFILE (N'LogName' , SizeInMg)
GO

También puede hacerlo utilizando la GUI y el segundo botón de opción y la casilla de verificación que dice qué tan grande desea que sea el registro al final. Puede acceder a la GUI haciendo clic derecho en la base de datos en el explorador de objetos en SSMS, seleccionando tareas, reducir, archivos.

Kenneth Fisher
fuente
2

Como complemento de la respuesta de Aaron sobre el modo simple , puede programar 2 (o más) copias de seguridad diferenciales por día, reduciendo así la ventana de pérdida de datos de la operación de su base de datos mientras mantiene el modo SIMPLE.

Fabricio Araujo
fuente