¿Puedo reducir el archivo de registro de transacciones en una base de datos reflejada?

9

Esta es una pregunta de seguimiento a una pregunta anterior sobre por qué no pude reducir el archivo de registro en la base de datos principal.

Para resumir, configuré la creación de reflejo de la base de datos, pero olvidé asegurarme de que el trabajo que respaldaba el registro de transacciones volviera a ejecutarse, y el registro de transacciones creció a casi 60 GB.

Como se configuró la duplicación, este aumento de tamaño se duplicó en el servidor duplicado y, finalmente, ocupó todo el espacio en disco e inutilizó la base de datos duplicada.

Según esta pregunta sobre el mantenimiento del registro de transacciones en una base de datos espejo, no puede hacer una copia de seguridad del registro en el espejo, pero cuando se le pregunta específicamente en los comentarios sobre cómo reducir un archivo de registro demasiado grande en una base de datos espejo, se dejó un comentario que

Una forma de hacerlo sería realizar una conmutación por error a la base de datos reflejada y hacer la reducción allí. Pruebe esto a fondo en un entorno que no sea de producción para asegurarse de que tenga el comportamiento que desea / espera.

Esto parece sugerir que podría haber otras formas de reducir el archivo de registro en un espejo, y este método podría no ser necesariamente seguro en un servidor de producción.

¿Hay alguna manera de reducir de forma segura el archivo de registro de transacciones en un espejo de base de datos?

Rachel
fuente
2
La única forma admitida es reducir el archivo en el principal, que también reducirá el archivo en el espejo. Si su espejo ya no es el mismo que el principal, realmente no desea intentar conmutar por error al espejo. Rompa el reflejo y recréelo, como dijo en su pregunta anterior.
Max Vernon

Respuestas:

6

El DBCC SHRINKFILEcomando se reflejará desde el principal a la base de datos reflejada. Aquí hay alguna prueba.

Cree una base de datos de muestra en el principal:

create database MirroredDb;
go

Cree la misma base de datos a partir de una copia de seguridad con NORECOVERY:

restore database MirroredDb
from disk = '\\backupdir\MirroredDb.bak'
with norecovery;
go

Configure su sesión de duplicación de cualquier manera que elija.

En la base de datos principal, mire los tamaños de archivo de la base de datos:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

Mi conjunto de resultados se ve así:

name            size
MirroredDb      392
MirroredDb_log  104

En la base de datos reflejada , cree una instantánea y observe la misma información:

create database MirroredDbss
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb.ss'
)as snapshot of MirroredDb;

use MirroredDbss;
go

select
    name,
    size
from sys.database_files;

Mi conjunto de resultados tiene el siguiente aspecto:

name            size
MirroredDb      392
MirroredDb_log  104

Ahora haga crecer el archivo de registro de transacciones en la base de datos principal (lo traje a 1 GB):

alter database MirroredDb
modify file
(
    name = MirroredDb_log,
    size = 1GB
);
go

Mirando el tamaño del registro de transacciones de la base de datos principal , ahora vemos el tamaño ajustado:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

Mi conjunto de resultados tiene el siguiente aspecto:

name            size
MirroredDb      392
MirroredDb_log  131072

Cree otra instantánea en la base de datos reflejada y observe el tamaño del archivo de registro de transacciones allí:

create database MirroredDbss2
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb2.ss'
)as snapshot of MirroredDb;

use MirroredDbss2;
go

select
    name,
    size
from sys.database_files;

Mi conjunto de resultados tiene el siguiente aspecto:

name            size
MirroredDb      392
MirroredDb_log  131072

Ahora haz lo DBCC SHRINKFILEdel director :

use MirroredDb;
go

dbcc shrinkfile('MirroredDb_log', 0);
go

select
    name,
    size
from sys.database_files;

Mi conjunto de resultados es el siguiente:

name            size
MirroredDb      392
MirroredDb_log  104

Cree una tercera y última instantánea en la base de datos reflejada y observe el tamaño:

create database MirroredDbss3
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb3.ss'
)as snapshot of MirroredDb;

use MirroredDbss3;
go

select
    name,
    size
from sys.database_files;

Y obtengo el siguiente conjunto de resultados:

name            size
MirroredDb      392
MirroredDb_log  104

Como puede ver aquí, el DBCC SHRINKFILEcomando se refleja en la base de datos reflejada.

Thomas Stringer
fuente
Gracias, no me di cuenta de que el tamaño del archivo de registro también se copió del servidor principal. Pero en el caso de que el espejo no funcione debido al tamaño del registro de transacciones, ¿es la única solución para eliminar y recrear el espejo? ¿No hay forma de reducir de forma segura el registro de espejo cuando el proceso de espejo no funciona?
Rachel
No puede conectarse a la base de datos reflejada, por lo tanto, no puede ejecutarla DBCC SHRINKFILE. En cuanto a si puede arreglar su sesión espejo sin eliminar el espejo en esa base de datos, hay un poco más de investigación que tendría que tener lugar allí. Parece que se suspendió debido al tamaño del archivo. ¿Has intentado reanudar a la pareja?
Thomas Stringer
Sí, pero inmediatamente volvió a ser suspendido. Supongo que se debe a que ha pasado demasiado tiempo desde que se detuvo la duplicación, por lo que aún es necesario transferir una gran cantidad de datos antes de llegar a la parte "reducir archivo de registro". Tenía la esperanza de que hubiera alguna otra forma de la que no estaba al tanto, como algo que podría ejecutar desde la base de datos espejo para reducir el archivo, o alguna manipulación del sistema de archivos, pero ese no parece ser el caso. Sin embargo, su respuesta sigue siendo muy útil, así que gracias :)
Rachel
La esperanza ya no. Una vez que la base de datos se suspende / desconecta y se ejecuta una copia de seguridad del registro en el primario, usted está prácticamente obligado a volver a sincronizar el espejo sin reiniciar.
Jason Cumberland el