“O log de transações do banco de dados está cheio devido a 'LOG_BACKUP'” em um host compartilhado

92

Eu tenho um site Asp.Net MVC 5 com abordagem codefirst EntityFramework em um plano de hospedagem compartilhada. Ele usa o WebbsitePanel de código aberto para painel de controle e seu painel do SQL Server é um tanto limitado. Hoje, quando quis editar o banco de dados, encontrei este erro:

The transaction log for database 'db_name' is full due to 'LOG_BACKUP'

Eu pesquisei e encontrei muitas respostas relacionadas como esta e esta ou esta, mas o problema é que eles sugerem executar uma consulta no banco de dados. Eu tentei correr

db.Database.ExecuteSqlCommand("ALTER DATABASE db_name SET RECOVERY SIMPLE;");

com o Visual Studio (no HomeController), mas recebo o seguinte erro:

System.Data.SqlClient.SqlException: ALTER DATABASE statement not allowed within multi-statement transaction.

Como posso resolver meu problema? Devo entrar em contato com a equipe de suporte (que é um pouco ruim para o meu anfitrião) ou posso resolver isso sozinho?

Alireza Noori
fonte
Execute o ALTER sem uma transação.
usr
@usr Como eu faria isso?
Alireza Noori de
É um problema de banco de dados, reduzir o banco de dados pode funcionar. Peça a um DBA para ajudá-lo nisso.
Shashank Chaturvedi de
Você deve ter aberto uma transação de alguma forma. Não sei, talvez EF faça isso automaticamente. Você precisa fazer algumas pesquisas sobre EF e transações. Ou execute-o no SSMS. Ou use o ADO.NET bruto. Provavelmente, seu hoster não permitirá essa declaração de qualquer maneira e ele precisa emitir backups de log com mais frequência.
usr de

Respostas:

39

Ligue para sua empresa de hospedagem e peça que configurem backups regulares de log ou defina o modelo de recuperação como simples. Tenho certeza que você sabe o que informa a escolha, mas serei explícito de qualquer maneira. Defina o modelo de recuperação como total se precisar da capacidade de restaurar em um momento arbitrário. De qualquer maneira, o banco de dados está configurado incorretamente como está.

Ben Thul
fonte
Obrigado. Eu queria fazer isso sozinho, mas entrei em contato com eles também e eles configuraram a recuperação e executaram um shrinkno banco de dados. Além disso, não precisava da recuperação, então disse a eles para colocá-la no SIMPLEmodo.
Alireza Noori de
1
Esta página do MSDN explica como definir o modelo de recuperação como simples!
shekhar
147

Além da resposta de Ben, você pode tentar as consultas abaixo de acordo com sua necessidade

USE {database-name};  
GO  
-- Truncate the log by changing the database recovery model to SIMPLE.  
ALTER DATABASE {database-name}
SET RECOVERY SIMPLE;  
GO  
-- Shrink the truncated log file to 1 MB.  
DBCC SHRINKFILE ({database-file-name}, 1);  
GO  
-- Reset the database recovery model.  
ALTER DATABASE {database-name}
SET RECOVERY FULL;  
GO 

Atualizar crédito @ cema-sp

Para encontrar nomes de arquivos de banco de dados, use a consulta abaixo

select * from sys.database_files;
Mohit Dharmadhikari
fonte
8
Adicional: para localizar {nome do arquivo do banco de dados}:select * from sys.database_files;
cema-sp
2
Posso confirmar que isso funciona muito bem. Deve ser a resposta aceita.
garrettendi
2
Obrigado @Mohit Dharmadhikari; Tentei muitas outras coisas, incluindo alocar mais espaço em disco e aumentar o tamanho do arquivo de log, mas nada funcionou até que eu reduzisse o arquivo de log existente primeiro.
Johnny
1
Obrigado, muito útil.
Obakeng Molebatsi
3
Eu acredito que {nome do arquivo do banco de dados} seria igual à namecoluna, para a linha do log, a partir desta consulta:select * from sys.database_files
Bob Horn
14

Ocasionalmente, quando um disco fica sem espaço, a mensagem "log de transações do banco de dados XXXXXXXXXX está cheio devido a 'LOG_BACKUP'" será retornada quando uma instrução SQL de atualização falhar. Verifique seu espaço em disco :)

Hein Gous
fonte
5

Este erro ocorre porque o log de transações fica cheio devido a LOG_BACKUP. Portanto, você não pode executar nenhuma ação neste banco de dados e, nesse caso, o Mecanismo de Banco de Dados do SQL Server gerará um erro 9002.

Para resolver este problema, você deve fazer o seguinte

  • Faça um backup completo do banco de dados.
  • Diminua o arquivo de log para reduzir o tamanho do arquivo físico.
  • Crie um LOG_BACKUP.
  • Crie um plano de manutenção LOG_BACKUP para obter logs de backup com freqüência.

Escrevi um artigo com todos os detalhes sobre esse erro e como resolvê-lo em O log de transações do banco de dados 'SharePoint_Config' está cheio devido a LOG_BACKUP

Mohamed
fonte
9
Publicar a mensagem de erro como sua resposta não é muito útil. Respostas apenas de link também são desaprovadas no StackOverflow. Você deve extrair o texto relevante do link e citá-lo aqui. Isso é especialmente importante no caso de o link morrer no futuro, como acontece inevitavelmente com todos os links.
Dan Bechard
3

Isso também pode acontecer quando o tamanho do arquivo de log é restrito.

Clique com o botão direito no banco de dados no Object Explorer

Selecione Propriedades

Selecionar arquivos

Na linha de registro, clique nas reticências na coluna Autogrowth / Maxsize

Alterar / verificar se o tamanho máximo do arquivo é ilimitado.

insira a descrição da imagem aqui

Depois de mudar para ilimitado, o banco de dados voltou à vida.

Roy Latham
fonte
1

Recebi o mesmo erro, mas de um trabalho de back-end (trabalho SSIS). Ao verificar a configuração de crescimento do arquivo de log do banco de dados, o crescimento do arquivo de log foi limitado a 1 GB. Portanto, o que aconteceu foi quando o trabalho foi executado e solicitou ao servidor SQL que alocasse mais espaço de log, mas o limite de crescimento do log diminuído causou a falha do trabalho. Modifiquei o crescimento do log e o configurei para crescer 50 MB e crescimento ilimitado e o erro foi embora.

Andy
fonte