Назад | Перейти на главную страницу

Помогите! Файл журнала для базы данных tempdb заполнен. Создайте резервную копию журнала транзакций для базы данных, чтобы освободить место для журнала.

Мы работаем с SQL Server 2000. В нашей базе данных есть таблица «Заказы», ​​содержащая примерно 750 000 строк. Мы можем выполнять простые операторы SELECT для этой таблицы. Однако, когда мы хотим выполнить запрос типа SELECT TOP 100 * FROM Orders ORDER BY Date_Ordered DESC, мы получаем следующее сообщение:

Ошибка: 9002, уровень серьезности: 17, состояние: 6 Файл журнала для базы данных tempdb заполнен. Создайте резервную копию журнала транзакций для базы данных, чтобы освободить место для журнала.

У нас есть другие таблицы в нашей базе данных, размер которых аналогичен количеству записей в таблицах (то есть 700 000 записей). В этих таблицах мы можем запускать любые запросы, которые захотим, и никогда не получаем сообщения о том, что tempdb заполнен.

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

Размер нашего файла журнала настроен на автоматический рост.

Мы не уверены, куда идти дальше. Есть ли идеи, почему мы все еще можем получать это сообщение?

Ошибка: 9002, уровень серьезности: 17, состояние: 6 Файл журнала для базы данных tempdb заполнен. Создайте резервную копию журнала транзакций для базы данных, чтобы освободить место для журнала.

В соответствии с Эта статья, временная БД используется, если для сортировки требуется больше памяти, чем выделил SQL Server.

Если вы сортируете столбец, который не проиндексирован, сервер базы данных выполнит полное сканирование таблицы и будет отслеживать все значения Date_Ordered (и значения первичного ключа) всех записей в таблице.

Создайте ИНДЕКС для Orders.Date_Ordered, чтобы ускорить сортировку и уменьшить использование памяти.

В дополнение к совету Devio, примите во внимание:

  • Вам действительно нужно делать SELECT *, если вам нужно всего несколько столбцов, укажите их по буквам; если стол заказов очень широкий, накладные расходы на сортировку выше; если есть блобы / текстовые поля, их тащат за собой в поездку.
  • Можете ли вы добавить выбор даты, например WHERE Date_Ordered> getdate () -1; даже если вы получите больше записей, чем вам нужно, всю таблицу не придется копировать в Tempdb; ты мог бы сделать что-то вроде

    ВЫБРАТЬ ТОП 100 * из (выбрать * из заказов, где date_ordered> getdate () - 10) упорядочить по date_ordered desc

  • Но добавление индекса для date_ordered - безусловно, лучшее решение.

Итак, первая проблема, вам нужно больше оперативной памяти в вашем SQL Server. Сколько оперативной памяти установлено в машине.

После этого вам нужно увеличить размер жесткого диска, на котором размещена база данных tempdb. Эта база данных используется для самых разных вещей, и вам необходимо, чтобы она была полностью функциональной для правильной работы всего SQL Server.

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

Достаточно ли у вас места на диске, содержащем файлы tempdb.

попробуйте выполнить тот же запрос без предложения order by и посмотрите, исчезнет ли ошибка.