Como reduzo o arquivo de log de transações físico quando ele é o principal em um espelho?

8

Configuramos o espelhamento de banco de dados no fim de semana e esquecemos de reativar o trabalho que faz backup dos logs de transações. Quando cheguei hoje de manhã, o log de transações aumentara para 58 GB e ocupava a maior parte do espaço em disco.

Fiz um backup manual do log de transações em disco para que o banco de dados fosse executado novamente. No entanto, a execução do DBCC SHRINKFILE não parece diminuir o tamanho físico do arquivo de log de transações.

DBCC SHRINKFILE (N'MyDatabaseName_Log', 1000)

Se eu verificar o uso do log usando

DBCC SQLPERF(LOGSPACE)

Percebo que apenas 22% do log atual está sendo usado

Nome do banco de dados Tamanho do log (MB) Espaço de log usado (%) Status
MyDatabaseName 55440.87 22.38189 0

Se eu fizer check-out log_reuse_wait_descem sys.databses, o único registro que vejo é DATABASE_MIRRORING, portanto, acho que o espelho está desempenhando um papel no motivo pelo qual o tamanho físico do arquivo de log não diminui?

SELECT log_reuse_wait_desc
FROM sys.databases
WHERE name = N'MyDatabaseName';

Também notei que meu estado principal de espelhamento de banco de dados é suspenso e a tentativa de retomar imediatamente falha com o seguinte erro:

O parceiro de espelhamento remoto do banco de dados 'MyDatabaseName' encontrou o erro 5149, status 1, gravidade 25. O espelhamento de banco de dados foi suspenso. Resolva o erro no servidor remoto e retome o espelhamento ou remova o espelhamento e restabeleça a instância do servidor espelho.

Os logs de erro no servidor espelho também contêm esse erro, mas também contêm erros sobre a unidade de arquivo de log estar cheia

O arquivo MODIFY FILE encontrou o erro do sistema operacional 112 (não há espaço suficiente no disco.) Ao tentar expandir o arquivo físico.

e

F: \ Databaselogs \ MyDatabaseName_1.ldf: Erro 112 do sistema operacional (Não há espaço suficiente no disco.) Encontrado.

O servidor principal possui 60 GB na unidade de arquivo de log (existem outros bancos de dados hospedados aqui), enquanto o servidor espelhado possui apenas 45 GB.

O backup do arquivo de log tornou o banco de dados utilizável novamente, no entanto, também quero diminuir o tamanho do arquivo de log físico no disco e recuperar o espelhamento.

Como posso reduzir o tamanho do meu arquivo de log de transações físicas sem comprometer o espelhamento ou a cadeia de backup?

Estou executando o SQL Server 2005

Rachel
fonte
O que o servidor secundário possui no log de erros do SQL Server? Você deve ter algumas mensagens de log de erro que determinam o que aconteceu com a suspensão da sessão de espelhamento.
Thomas Stringer
@ThomasStringer Na verdade, eu estava prestes a postar minha própria resposta a essa pergunta ... Acho que minha resposta é que não posso, pelo menos não sem desativar o espelho e configurá-lo novamente. O espaço no servidor espelhado reservado para arquivos de log é menor que o espaço no servidor principal (o principal hospeda outros bancos de dados) e não tenho como reduzir o tamanho do log de transações espelhadas. Eu também atualizou a minha pergunta com as mensagens de erro do servidor espelhado embora
Rachel

Respostas:

2

Pelo que sei, não posso.

Acredito que grande parte do arquivo de log esteja aguardando para ser espelhado no servidor espelho, mas o espelho está inoperante e não pode ser retomado porque o log de transações espelhadas também cresceu para ocupar todo o espaço no disco.

Essa teoria é reforçada pelo fato de que, depois de remover o espelhamento, o DBCC SHRINKFILEcomando reduz corretamente o arquivo de log físico e log_reuse_wait_descvolta a aguardarLOG_BACKUP

Não consigo encolher o arquivo de log no servidor espelhado porque ele está atuando como um espelho e não pode ser aberto; portanto, acho que o espelho é irrecuperável.

Então, eu vou excluir o espelho completamente e configurar tudo de novo (processo muito lento com um banco de dados de 300 GB). E dessa vez, assegurarei que o tamanho do log de transações seja bastante pequeno antes de iniciar o espelho e que os backups do log de transações estejam em execução assim que o espelho voltar a funcionar.

Também vou definir um limite de quão grande o log de transações pode crescer no servidor de produção, para que o espelho nunca tente aumentar seu log de transações além do tamanho disponível no disco.

Rachel
fonte
11
Outra opção pode ser fazer um backup diff e restaurá-lo no espelho. Pode não funcionar, mas vale a pena tentar se você ou qualquer outra pessoa encontrar isso novamente.
Cfradenburg
@cfradenburg Sim, eu tentei fazer isso, mas não funcionou no meu caso por causa do tempo dos meus backups no fim de semana e do espaço em disco ser maximizado no espelho. Definitivamente, vale a pena tentar antes de decidir excluir completamente o espelho e recomeçar.
Rachel
1

Hoje enfrentamos o mesmo problema com nossos bancos de dados, que por algum motivo pararam de fazer backup dos logs de transações nos últimos 3 meses e os logs aumentaram para 200 GB no total.

Exatamente os mesmos códigos de erro da sua situação e o espelhamento não seriam retomados. A unidade de registro estava completamente cheia no espelho.

Felizmente, consegui liberar espaço excluindo alguns logs antigos perdidos na unidade de registro. Depois disso, foi possível retomar o espelhamento.

Em seguida, entrou nos backups do plano de manutenção e acionou os backups do banco de dados e do log de transações manualmente. Mesmo após o backup, os arquivos de log de transações ainda eram enormes. Por isso, tive que dizer repetidamente ao SQL Studio para reduzir os arquivos de log (liberar qualquer espaço não utilizado) e, após algumas tentativas ao longo de algumas horas, reduziu-os a um tamanho mais gerenciável.

Espero que isto ajude.

Nancy
fonte