«Журнал транзакций для базы данных заполнен из-за LOG_BACKUP» на общем хосте

89

У меня есть веб-сайт Asp.Net MVC 5 с подходом EntityFramework codefirst в плане общего хостинга. Он использует панель веб-сайта с открытым исходным кодом для панели управления, а его панель SQL Server несколько ограничена. Сегодня, когда я хотел отредактировать базу данных, я столкнулся с такой ошибкой:

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

Я поискал и нашел много связанных ответов, таких как это и то или это, но проблема в том, что они предлагают запустить запрос в базе данных. Я пробовал бежать

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

с визуальной студией (на HomeController), но я получаю следующую ошибку:

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

Как я могу решить свою проблему? Стоит ли мне связываться со службой поддержки (что немного плохо для моего хозяина) или я могу решить эту проблему самостоятельно?

Алиреза Нури
источник
Выполните ALTER без транзакции.
usr
@usr Как мне это сделать?
Алиреза Нури
Это проблема с базой данных, сжатие базы данных может работать. Попросите администратора базы данных помочь вам в этом.
Шашанк Чатурведи
Вы, должно быть, каким-то образом открыли транзакцию. Не знаю, может быть, EF сделает это автоматически. Вам нужно будет провести некоторое исследование EF и транзакции. Или выполните это из SSMS. Или используйте необработанный ADO.NET. Вероятно, ваш хостер все равно не разрешит это утверждение, и им нужно чаще создавать резервные копии журналов.
usr

Ответы:

38

Позвоните в свою хостинговую компанию и попросите их настроить регулярное резервное копирование журналов или установите простую модель восстановления. Я уверен, что вы знаете, что определяет выбор, но я все равно буду откровенен. Установите модель восстановления на полную, если вам нужна возможность восстановления на произвольный момент времени. В любом случае база данных неверно сконфигурирована как есть.

Бен Тул
источник
Спасибо. Я хотел сделать это сам, но связался с ними тоже, и они настроили восстановление и запустили shrinkБД. Кроме того, мне не требовалось восстановление, поэтому я сказал им перевести его в SIMPLEрежим.
Алиреза Нури
1
На этой странице MSDN объясняется, как установить простую модель восстановления!
shekhar
143

В дополнение к ответу Бена вы можете попробовать запросы ниже в соответствии с вашими потребностями

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 

Обновить кредит @ cema-sp

Чтобы найти имена файлов базы данных, используйте запрос ниже

select * from sys.database_files;
Мохит Дхармадхикари
источник
8
Дополнительно: чтобы найти {database-file-name}:select * from sys.database_files;
cema-sp
2
Я могу подтвердить, что это работает. Должен быть принятый ответ.
garrettendi
2
Спасибо @Mohit Dharmadhikari; Я пробовал много других вещей, включая выделение большего дискового пространства и увеличение размера файла журнала, но ничего не работало, пока я сначала не сжал существующий файл журнала.
Джонни
1
Спасибо, очень помогли.
Obakeng Molebatsi
2
Я полагаю, что {database-file-name} приравнивается к nameстолбцу для строки журнала из этого запроса:select * from sys.database_files
Боб Хорн,
13

Иногда, когда на диске заканчивается место, сообщение «журнал транзакций для базы данных XXXXXXXXXX заполнен из-за 'LOG_BACKUP'» будет возвращено, когда SQL-запрос обновления завершится неудачно. Проверьте свое дисковое пространство :)

Хайн Гус
источник
5

Эта ошибка возникает из-за того, что журнал транзакций заполняется из-за LOG_BACKUP. Следовательно, вы не можете выполнять какие-либо действия с этой базой данных, и в этом случае ядро ​​СУБД SQL Server выдаст ошибку 9002.

Чтобы решить эту проблему, вам необходимо сделать следующее

  • Сделайте полную резервную копию базы данных.
  • Сожмите файл журнала, чтобы уменьшить физический размер файла.
  • Создайте LOG_BACKUP.
  • Создайте план обслуживания LOG_BACKUP, чтобы часто делать резервные копии журналов.

Я написал статью со всеми подробностями об этой ошибке и о том, как ее решить. Журнал транзакций для базы данных SharePoint_Config заполнен из-за LOG_BACKUP

Мохамед
источник
8
Публикация сообщения об ошибке в качестве ответа совсем не помогает. Ответы только по ссылкам также не одобряются в StackOverflow. Вы должны извлечь соответствующий текст из ссылки и процитировать его здесь. Это особенно важно в случае, если ссылка умирает в будущем, как неизбежно умирают все ссылки.
Дэн Бечард
1

У меня такая же ошибка, но из-за серверного задания (задания SSIS). После проверки параметра увеличения файла журнала базы данных, размер файла журнала был ограничен 1 ГБ. Итак, что произошло, когда задание было запущено, и оно попросило SQL-сервер выделить больше места для журнала, но снижение предела роста журнала привело к сбою задания. Я изменил рост журнала и установил его на 50 МБ и неограниченный рост, и ошибка исчезла.

Энди
источник
1

Это также может произойти, если размер файла журнала ограничен.

Щелкните правой кнопкой мыши базу данных в обозревателе объектов

Выбрать свойства

Выбрать файлы

В строке журнала щелкните многоточие в столбце Autogrowth / Maxsize.

Изменить / проверить, что максимальный размер файла не ограничен.

введите описание изображения здесь

После перехода на безлимит, база данных ожила.

Рой Лэтэм
источник