Posso reduzir o arquivo de log de transações em um banco de dados espelho?

9

Esta é uma pergunta de acompanhamento para uma pergunta anterior sobre por que não pude reduzir o arquivo de log no banco de dados principal.

Para encurtar a história, configurei o espelhamento de banco de dados, mas esqueci de me certificar de que o trabalho que fazia o backup do log de transações estava sendo executado novamente e o log de transações cresceu para quase 60 GB.

Desde que o espelhamento foi configurado, esse aumento de tamanho foi duplicado no servidor espelhado e, eventualmente, ocupou todo o espaço em disco e tornou o banco de dados inutilizável.

Por esta pergunta sobre manutenção do log de transações em um banco de dados espelho, não é possível fazer backup do log no espelho, mas quando perguntado especificamente nos comentários sobre como reduzir um arquivo de log cheio em um banco de dados espelho, foi deixado um comentário que

Uma maneira de fazer isso seria fazer o failover no banco de dados espelhado e diminuir o conteúdo lá. Teste completamente isso em um ambiente de não produção para garantir que ele tenha o comportamento que você deseja / espera.

Isso parece sugerir que pode haver outras maneiras de reduzir o arquivo de log em um espelho, e esse método pode não ser necessariamente seguro em um servidor de produção.

Existe uma maneira de reduzir com segurança o arquivo de log de transações em um espelho de banco de dados?

Rachel
fonte
2
A única maneira suportada é reduzir o arquivo no principal, que também reduzirá o arquivo no espelho. Se o seu espelho não for mais o mesmo que o principal, você realmente não deseja tentar o failover no espelho. Interrompa o espelhamento e recrie-o, como você disse na pergunta anterior.
Max Vernon

Respostas:

6

O DBCC SHRINKFILEcomando será espelhado do principal para o banco de dados espelhado. Aqui estão algumas provas.

Crie um banco de dados de amostra no principal:

create database MirroredDb;
go

Crie o mesmo banco de dados a partir de um backup com NORECOVERY:

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

Configure sua sessão de espelhamento da maneira que você escolher.

No banco de dados principal, observe os tamanhos dos arquivos de banco de dados:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

Meu conjunto de resultados se parece com o seguinte:

name            size
MirroredDb      392
MirroredDb_log  104

No banco de dados espelho , crie uma captura instantânea e observe as mesmas informações:

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;

Meu conjunto de resultados é semelhante ao seguinte:

name            size
MirroredDb      392
MirroredDb_log  104

Agora, aumente o arquivo de log de transações no banco de dados principal (eu o trouxe para 1 GB):

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

Observando o tamanho do log de transações do banco de dados principal , agora vemos o tamanho ajustado:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

Meu conjunto de resultados é semelhante ao seguinte:

name            size
MirroredDb      392
MirroredDb_log  131072

Crie outro instantâneo no banco de dados espelhado e observe o tamanho do arquivo do log de transações:

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;

Meu conjunto de resultados é semelhante ao seguinte:

name            size
MirroredDb      392
MirroredDb_log  131072

Agora faça DBCC SHRINKFILEo principal :

use MirroredDb;
go

dbcc shrinkfile('MirroredDb_log', 0);
go

select
    name,
    size
from sys.database_files;

Meu conjunto de resultados é o seguinte:

name            size
MirroredDb      392
MirroredDb_log  104

Crie um terceiro e último instantâneo no banco de dados espelhado e observe o tamanho:

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;

E recebo o seguinte conjunto de resultados:

name            size
MirroredDb      392
MirroredDb_log  104

Portanto, como você pode ver aqui, o DBCC SHRINKFILEcomando é de fato espelhado no banco de dados espelho.

Thomas Stringer
fonte
Obrigado, não percebi que o tamanho do arquivo de log também foi copiado do servidor principal. Mas, no caso de o espelho não estar funcionando devido ao tamanho do log de transações, a única solução para excluir e recriar o espelho? Não há como reduzir com segurança o log do espelho quando o processo de espelhamento não estiver funcionando?
22413 Rachel
Você não pode se conectar ao banco de dados espelhado; portanto, não é possível executá DBCC SHRINKFILE-lo. Quanto a se você pode consertar sua sessão de espelhamento sem remover o espelhamento nesse banco de dados, há um pouco mais de investigação que teria que ocorrer lá. Parece que foi suspenso por causa do tamanho do arquivo. Você tentou retomar o parceiro?
Thomas Stringer
Sim, mas imediatamente voltou a ser suspenso. Presumo que isso ocorra porque muito tempo se passou desde que o espelhamento parou, portanto muitos dados ainda precisam ser transferidos antes de chegarem à parte "reduzir o arquivo de log". Eu esperava que houvesse alguma outra maneira que eu simplesmente não soubesse, como algo que eu poderia executar no banco de dados espelho para reduzir o arquivo ou alguma manipulação do sistema de arquivos, mas isso não parece ser o caso. A sua resposta ainda é muito útil, porém, assim obrigado :)
Rachel
Espero que não mais. Depois que o banco de dados é suspenso / desconectado e um backup de log é executado no primário, você praticamente consegue recuperar o espelho em sincronia sem uma reinicialização.
Jason Cumberland