Як урізати транзакційні логи в SQL Server 2012

Транзакційні логи в SQL Server 2012 із плином часу неминуче ростуть, і в якийсь момент часу можуть зайняти весь доступний місце на диску. Щоб уникнути такої ситуації, в SQL Server є засоби для урізання (Truncate) транзакційних логів, що дозволяють вивільнити місце для повторного використання. Список урізаються автоматично в залежності від моделі відновлення:

  • Simple (Проста модель) - журнали урізаються після досягнення контрольної точки
  • Full (Модель повного відновлення) - після виконання резервної копії логів, якщо після останнього бекапа було досягнуто контрольна точка

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

В цьому випадку при підключенні до БД MS SQL з'являється така помилка:

Microsoft OLE Provider for SQL Server: The transaction log for database "DBName" is full. To find out why space in the log can not be reused, see the log_reuse_wait_desc column is sys.database
HRESULT = 80040E14, SQLSTATE = 4 2000, native = 9002

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

Як правило це ситуація може виникнути при використанні повної моделі відновлення (Full). У цій моделі файли журнали не скорочуються, поки все транзакційні логи не потраплять в бекап. Це потрібно для того, щоб гарантувати безперервну послідовність номерів записів (LSN) в журналі. Таким чином, щоб журнали урізалися, потрібно виконати повний бекап БД, або (швидше), на час змінити модель відновлення на Simple.

Отже, щоб урізати транзакційний лог, запустіть консоль SQL Server Management Studio (SSMS), виберіть потрібну БД, і відкрийте її властивості в контекстному меню. Потім перейдіть на вкладку Options і змініть модель відновлення БД (Recovery model) на Simple.

Потім в контекстному меню БД виберіть Tasks -> Shrink -> Files. В полі File type виберіть Log, а в поле File name - ім'я файлу логів. В полі Shrink action потрібно вказати Reorganize pages before releasing unused space, і вкажіть до якого розміру потрібно стиснути файл і натисніть OK.

Після урізання балки, знову перейдіть на повну (Full) модель відновлення БД.

Всі розглянуті вище операції можна виконати простим скриптом з Query Analizer (скрипт працює в SQL Server, починаючи з 2008 версії).
USE "DBName"
ALTER DATABASE "DBName" SET RECOVERY SIMPLE
DBCC SHRINKFILE ( "DBName", "Розмір до якого урізати лог");
ALTER DATABASE "DBName" SET RECOVERY FULL

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