Журнал транзакцій для бази даних заповнений


108

У мене тривалий процес, який відкриває транзакцію на повну тривалість.

Я не маю контролю над тим, як це виконується.

Оскільки транзакція залишається відкритою протягом усієї тривалості, коли журнал транзакцій заповнюється, SQL Server не може збільшити розмір файлу журналу.

Тож процес виходить з ладу з помилкою "The transaction log for database 'xxx' is full".

Я намагався запобігти цьому, збільшивши розмір файлу журналу транзакцій у властивостях бази даних, але я отримую ту ж помилку.

Не впевнений, що мені слід спробувати далі. Процес триває декілька годин, тому відтворити пробні та помилкові непросто.

Якісь ідеї?

Якщо когось цікавить, процес - імпорт організації Microsoft Dynamics CRM 4.0.

Дискового простору є багато, у нас є журнал у простому режимі ведення журналу, і ми створили резервну копію журналу перед початком процесу.

- = - = - = - = - ОНОВЛЕННЯ - = - = - = - = -

Дякую всім за коментарі поки що. Далі, що змусило мене повірити, що журнал не зростатиме через відкриту транзакцію:

Я отримую таку помилку ...

Import Organization (Name=xxx, Id=560d04e7-98ed-e211-9759-0050569d6d39) failed with Exception:
System.Data.SqlClient.SqlException: The transaction log for database 'xxx' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases

Тож, слідуючи цій раді, я перейшов до " log_reuse_wait_desc column in sys.databases", і це значення було " ACTIVE_TRANSACTION".

За даними Microsoft: http://msdn.microsoft.com/en-us/library/ms345414(v=sql.105).aspx

Це означає наступне:

Активація транзакції (всі моделі відновлення). • На початку резервного копіювання журналу може існувати тривала транзакція. У цьому випадку для звільнення місця може знадобитися ще одна резервна копія журналу. Для отримання додаткової інформації див. "Довготривалі активні трансакції" пізніше в цій темі.

• транзакцію відкладено (лише для SQL Server 2005 Enterprise Edition та новіших версій). Відкладена транзакція - це фактично активна транзакція, відкат якої блокується через деякий недоступний ресурс. Інформацію про причини відкладених транзакцій та про те, як вивести їх із відкладеного стану див. У розділі Відкладені транзакції.

Я щось неправильно зрозумів?

- = - = - = - ОНОВЛЕННЯ 2 - = - = - = -

Просто розпочали процес із початковим розміром файлу журналу, встановленим на 30 Гб. На це піде кілька годин.

- = - = - = - Остаточне ОНОВЛЕННЯ - = - = - = -

Проблема була насправді викликана тим, що файл журналу поглинав увесь доступний дисковий простір. В останній спробі я випустив 120 Гб, і він все-таки використав усе, і в кінцевому рахунку зазнав невдачі.

Я не усвідомлював, що це відбувається раніше, тому що, коли процес працював протягом ночі, він відкидався на провал. Цього разу мені вдалося перевірити розмір файлу журналу перед відкатом.

Дякую всім за ваш внесок.


re "... і створили резервну копію журналу" .... якщо база даних знаходиться в простому режимі, ви не зможете створити резервну копію журналу, резервні копії журналу не застосовуються для простого режиму. Це об'ємний журнал?
SqlACID

1
Я створив резервну копію всієї БД і скоротив її, в результаті чого Журнал скоротився до 1 Мб. Потім я збільшив розмір файлу журналу до 20 ГБ спочатку, а тепер - 30 ГБ.
Jimbo

Відповіді:


19

Це одноразовий сценарій чи робота, що регулярно відбувається?

Раніше для спеціальних проектів, які тимчасово вимагають багато місця для файлу журналу, я створив другий файл журналу і зробив його величезним. Після завершення проекту ми видалили додатковий файл журналу.


Я б не сказав, що це разова робота, але рідко нам доводиться це робити. Я не створив другий файл журналу, але я збільшив початковий розмір мого поточного файлу журналу до 30 Гб. Під час мого останнього запуску було встановлено 20 Гб, але він все ще не вдався.
Jimbo

Чи було б мати другий файл журналу якось краще, ніж мати один великий, враховуючи, що у мене є лише один привід для роботи?
Джимбо

Як я зараз пам’ятаю, додатковий файл здебільшого дозволив нам отримати доступ до іншого, більшого диска.
Майк Хендерсон

2
Наскільки великі дані імпортуються? Якщо ви імпортуєте 30 ГБ даних, файл журналу, можливо, повинен бути принаймні таким же великим.
Майк Хендерсон

3
Розмір журналу є ключовим. Поточне завдання знову не вдалося, і я не міг повірити своїм очам, коли побачив розмір файлу журналу в той момент, що він не вдався. Він обробив лише половину рахунків і вже був на рівні 53 Гб. Схоже, мені доведеться очистити десь близько 60-70 Гб, щоб мати змогу завершити цей процес.
Джимбо

95

Щоб виправити цю проблему, змініть модель відновлення на просту, а потім зменшити журнал файлів

1. Властивості бази даних> Параметри> Модель відновлення> Просте

2. Завдання бази даних> Зменшити> Файли> Журнал

Зроблено.

Потім перевірте розмір файлу журналу db у розділі Властивості бази даних> Файли> Файли баз даних> Шлях

Щоб перевірити повний журнал сервера sql: відкрийте програму перегляду файлів журналу в SSMS> База даних> Управління> Журнали SQL Server> Поточні


10
Ні, це не вирішує проблему. Проблема полягала в тому, що файл журналу рос під час тривалого запущеного процесу, поки не вичерпалося місця на диску. Це було виправлено тимчасовим переміщенням файлу журналу на інший диск, у якому було доступно 1 ТБ місця. Ви не можете зменшити файл журналу під час тривалого процесу - відкритої транзакції. Цей процес був виключно відповідальним за зростання файлів.
Джимбо

Як вже говорив @Jimbo, це не виправляє проблеми ОП. Це може звільнити деякий невикористаний на даний момент простір, але як тільки довга транзакція знову запуститься, простір буде зайнято знову (і, ймовірно, не вдасться навіть раніше)
Марсель

Ідеально! Дякую!
Юрій Монтейро

Це не вирішило проблему. У моєму журналі лише 500 байт. Я думаю, що ця проблема почалася після того, як я вчора зробив резервну копію.
Рікардо Франса

Це, безумовно, виправлення, якщо у вас залишилося пару мегабайт для запасного на повному диску.
Стів Бауман

36

У мене була помилка один раз, і в кінцевому підсумку це був жорсткий диск сервера, у якого не вистачає місця на диску.


1
Прочитайте оновлення ОП. Це виявилося проблемою.
Колм

18

Чи увімкнено функцію автоматичного зростання та необмежене зростання файлів для файлу журналу? Ви можете редагувати їх через SSMS у розділі "Властивості бази даних> Файли"


Так. Він встановлений для автоматичного зростання 10%, без обмежень. Проблема полягає в тому, що автоматичне зростання не буде працювати, поки є відкрита транзакція.
Джимбо

1
Чи маєте ви уявлення, наскільки великою буде транзакція? спробуйте встановити розмір журналу транзакцій, що перевищує цю оцінку, у будь-якому випадку, якщо розподіл диска не є проблемою, виділіть на початку достатньо місця для даних і журналу. Це покращує продуктивність. Не збільшуйте нас на 10% , зробіть це на кілька ГБ, тож продуктивність буде досить хорошою.
Луїс ЛЛ

3
SQL Server автоматично зробить журнал під час транзакції, якщо йому потрібно більше місця для завершення транзакції.
Росс Макнаб

Привіт Росс, я висловив свою логіку, коли відкрита транзакція перешкоджає зростанню оновлень питання. Чи я неправильний у своїх міркуваннях?
Джимбо

1
@ Jimbo SQL Server не вимагає, щоб ви його резервували. Якщо у вас є автоматичне зростання, SQL Server виконує автоматичне зростання під час транзакції. Якщо вона досить велика, це може заощадити багато часу, але це не повинно впливати на процес.
Луїс ЛЛ

10

Це підхід до старої школи, але якщо ви виконуєте ітераційне оновлення або вставку операцій у SQL, що працює тривалий час, корисно періодично (програмно) викликати "контрольну точку". Виклик "контрольної точки" призводить до того, що SQL записує на диск всі ті зміни, що стосуються лише пам'яті (брудні сторінки, вони називаються) та елементи, що зберігаються в журналі транзакцій. Це призводить до періодичного очищення журналу транзакцій, запобігаючи таким чином проблеми, як описана.


1
На жаль, я не маю контролю над тим, як виконується процес. Dynamics CRM - це програма Microsoft, і процес імпорту організації є частиною цього додатка.
Джимбо

1

Далі буде усічено журнал.

USE [yourdbname] 
GO

-- TRUNCATE TRANSACTION LOG --
DBCC SHRINKFILE(yourdbname_log, 1)
BACKUP LOG yourdbname WITH TRUNCATE_ONLY
DBCC SHRINKFILE(yourdbname_log, 1)
GO

-- CHECK DATABASE HEALTH --
ALTER FUNCTION [dbo].[checker]() RETURNS int AS BEGIN  RETURN 0 END
GO

4
Привіт Pinal, цю функціональність було повністю видалено з SQL Server 2008 і вище: brentozar.com/archive/2009/08/…
Conor

3
З пізнішими версіями спробуйте BACKUP LOG <myDB> TO DISK = N'NUL: '
HansLindgren

1

Якщо модель відновлення вашої бази даних повна і у вас не було плану обслуговування резервного копіювання журналу, ви отримаєте цю помилку, оскільки журнал транзакцій стає повним через LOG_BACKUP.

Це запобіжить будь-які дії з цією базою даних (наприклад, зменшення), і двигун бази даних SQL Server призведе до помилки 9002.

Щоб подолати таку поведінку, радимо перевірити цей журнал транзакцій для бази даних "SharePoint_Config" заповнений завдяки LOG_BACKUP, який показує детальні кроки для вирішення проблеми.


0

Я зіткнувся з помилкою: "Журнал транзакцій для бази даних" ... "заповнений завдяки" ACTIVE_TRANSACTION "під час видалення старих рядків із таблиць моєї бази даних для звільнення дискового простору. Я зрозумів, що ця помилка виникне, якщо кількість рядків до У моєму випадку видалення було більше 1000000. Тож замість використання 1 оператора DELETE я розділив завдання видалення за допомогою оператора DELETE TOP (1000000) ....

Наприклад:

замість використання цього твердження:

DELETE FROM Vt30 WHERE Rt < DATEADD(YEAR, -1, GETDATE())

використовуючи наступне твердження кілька разів:

DELETE TOP(1000000) FROM Vt30 WHERE Rt < DATEADD(YEAR, -1, GETDATE())

0

Мою проблему вирішили з кількома виконанням обмежених видалень, як-от

До цього

DELETE FROM TableName WHERE Condition

Після

DELETE TOP(1000) FROM TableName WHERECondition

-1

Відповідь на питання - це не видалення рядків з таблиці, але саме простір tempDB займає активна транзакція. це відбувається в основному, коли відбувається злиття (upsert), де ми намагаємося вставити оновлення та видалити транзакції. Єдиний варіант полягає в тому, щоб переконатися, що БД встановлено на просту модель відновлення, а також збільшити файл до максимального простору (Додати іншу групу файлів). Хоча це має свої переваги і недоліки, це єдині варіанти.

Інший варіант, який у вас є, - це розділити злиття (upsert) на дві операції. той, що робить вставку, і інший, який робить оновлення та видалення.


Якщо ви читаєте питання, то знаєте, що БД вже знаходився в простому режимі відновлення, оскільки це відбувалося. Це не допомагає, коли у вас є одна тривала відкрита транзакція. Файл продовжує зростати, поки транзакція не буде здійснена або повернута назад. Прочитайте перший рядок питання "У мене тривалий процес, який відкриває транзакцію на повну тривалість".
Джимбо

-1

Спробуйте це:

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

Я сподіваюся, що це допомагає.


Це було однією з перших спробу, і це навіть згадується в тексті запитання. Це не вирішує проблему єдиної відкритої транзакції, заповнення журналу та використання всього наявного дискового простору. Весь цей процес проходив у простому режимі. Тим НЕ менше, ви один з багатьох людей , які запропонували цей точну відповідь того , не читав це питання ...
Джимбо

-1

Ось мій код героя. Я зіткнувся з цією проблемою. І використовуйте цей код, щоб виправити це.

 USE master;

    SELECT 
        name, log_reuse_wait, log_reuse_wait_desc, is_cdc_enabled 
    FROM 
        sys.databases 
    WHERE 
        name = 'XX_System';

    SELECT DATABASEPROPERTYEX('XX_System', 'IsPublished');


    USE XX_System;
    EXEC sp_repldone null, null, 0,0,1;
    EXEC sp_removedbreplication XX_System;


    DBCC OPENTRAN;
    DBCC SQLPERF(LOGSPACE);
    EXEC sp_replcounters;



    DBCC SQLPERF(LOGSPACE);

Будь ласка, завжди вкладайте свою відповідь у контекст, а не просто вставляючи код. Дивіться тут для більш детальної інформації.
gehbiszumeis

-1

Спробуйте це:

Якщо можливо, перезапустіть служби MSSQLSERVER і SQLSERVERAGENT .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.