Reducir el registro de transacciones mientras se usa el grupo de disponibilidad AlwaysOn

17

Estamos utilizando la AlwaysOn Availability Groupfunción de SQL Server 2012. Las copias de seguridad completas y regulares de la base de datos y las copias de seguridad del registro de transacciones se realizan todos los días en la base de datos secundaria.

He leído aquí que hacer la copia de seguridad del registro de transacciones en la réplica principal o la réplica secundaria marcará los registros de transacciones de ambas réplicas como reutilizables. De todos modos, el tamaño de la copia de seguridad del registro de transacciones es grande y se puede reducir usando el archivo retráctil:

ingrese la descripción de la imagen aquí

He restaurado la base de datos localmente y realizo la operación de reducción. El tamaño del archivo de registro se redujo a 160 MB.

Mi pregunta es en qué base de datos debo realizar una operación de reducción sobre el archivo de registro de transacciones (primario, secundario o ambos).


Supongo que en el pasado durante varios años no se hicieron copias de seguridad del archivo de registro, por lo que se volvió tan grande. Al ejecutar DBCC SQLPERF (LOGSPACE), puedo ver que solo 0.06%se usa el archivo: no tiene sentido mantener un tamaño tan grande del archivo de registro. En [sys].[database_files]verifico que su max_sizese establece en -1la growthque 65536por lo que supongo que cuando lo necesitan más espacio que van a recibir. De todos modos, puedo reducirlo al 5%, por ejemplo, para evitar el crecimiento futuro. Estoy tratando de encontrar alguna confirmación de que no es mala idea hacerlo.


En realidad, las copias de seguridad (en la base de datos y los archivos de registro) se realizan solo en las bases de datos secundarias, por lo que será más fácil realizar el archivo de reducción en ellas, pero ¿se reducirá también el tamaño del archivo de registro primario?

gotqn
fuente

Respuestas:

21

En AGs, las escrituras solo pueden ocurrir en el primario. Las operaciones de reducción son escrituras. Por lo tanto, debe hacer el encogimiento en el primario. Tenga en cuenta que la reducción puede no reducir tanto como espera, su prueba en la base de datos restaurada probablemente haya aprovechado el modelo de recuperación simple. Lea Cómo reducir el registro de SQL Server para obtener más información.

No reducir a 160 MB. Determine por qué el registro creció a 121 Gb para que no se repita (si sospecha, sería bueno confirmarlo si es posible). Cambie el tamaño del registro a un tamaño apropiado para sus necesidades operativas. El crecimiento del registro es un problema grave, no puede utilizar la inicialización instantánea de archivos y toda la actividad de su base de datos se congelará mientras el registro crece y se inicializa en 0. Los usuarios y las aplicaciones lo odian cuando ocurre. Si comprende el impacto y sus usuarios están bien, puede reducirse una vez a una pequeña cantidad (160 MB probablemente sea demasiado pequeño) y dejar que crezca hasta que se estabilice.

Remus Rusanu
fuente
7

Puedes probar:

  1. La base de datos en todos los servidores del grupo de disponibilidad debe estar en estado sincronizado.
  2. Mueva las páginas usadas al inicio del registro de transacciones, antes de reducirlo.
  3. A veces, el espacio libre de registro disponible es del 99%, pero SQL Server no puede liberar espacio no utilizado. Intente reiniciar cada servidor en el Grupo de disponibilidad a su vez.
  4. A veces, necesita realizar una copia de seguridad y reducir el registro de transacciones 2 veces antes de que MS SQL Server libere espacio libre (No se puede reducir el archivo de registro (DB_Log) porque el archivo de registro lógico ubicado al final del archivo está en uso).

Prueba este script:

    - Establecer la base de datos actual dentro del paso de trabajo o script
    --Compruebe para ejecutar solo en primaria
    if (SELECCIONE el rol
        DE sys.dm_hadr_availability_replica_states AS a
        ÚNETE a sys.availability_replicas AS b
            ON b.replica_id = a.replica_id
    DONDE b.replica_server_name = @@ SERVERNAME) = 1
    EMPEZAR
        - Use [test_db] - No funciona para MS SQL 2014, solo comente esta línea y configure la base de datos actual dentro del paso de trabajo o script
        - 1) Bakup Trn
        BACKUP LOG [test_db] TO DISK = N'D: \ MSSQL \ Backup \ test_db.trn 'WITH NOFORMAT, INIT, NAME = N' Trn Backup ', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10
        - 2) Mover páginas usadas
        DBCC SHRINKFILE (N'test_db_log ', 3000, NOTRUNCATE)
        - 3) Registro SHRINKFILE
        DBCC SHRINKFILE (N'test_db_log ', 3000)
    FINAL
Denis P.
fuente