Контрольні точки і активна частина журналу

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

  • Накат записаних в журнал змін, які не збережених на диску до зупинки системи.
  • Відкат всіх змін, пов'язаних з незавершеними транзакціями, такими як транзакції, для яких в журналі немає запису COMMIT або ROLLBACK.

Контрольна точка виконує в базі даних наступне.

  • Записує в файл журналу запис, що відзначає початок контрольної точки.
  • Зберігає дані, записані для контрольної точки в ланцюзі записів журналу контрольної точки.
    Одним з елементів даних, що реєструються в записах контрольної точки, є номер LSN першого запису журналу, при відсутності якої успішний відкат в масштабі всієї бази даних неможливий. Такий номер LSN називається мінімальним номером LSN відновлення (MinLSN). Номер MinLSN є найменшим значенням з:
    • номера LSN початку контрольної точки;
    • номера LSN початку найстарішої активної транзакції;
    • номера LSN початку найстарішої транзакції реплікації, яка ще не була доставлена ​​базі даних розповсюджувача.
    Записи контрольної точки містять також список активних транзакцій, що змінили базу даних.
  • Якщо база даних використовує просту модель відновлення, позначає для повторного використання простір, попереднє номеру MinLSN.
  • Записує всі змінені сторінки журналів і даних на диск.
  • Записує в файл журналу запис, що відзначає кінець контрольної точки.
  • Записує в сторінку завантаження бази даних номер LSN початку відповідного кола.

Дії, що призводять до спрацьовування контрольних точок

Контрольні точки спрацьовують в наступних ситуаціях.

  • При явному виконанні інструкції CHECKPOINT. Контрольна точка спрацьовує в поточній базі даних з'єднання.
  • При виконанні в базі даних операції з мінімальною реєстрацією, наприклад при виконанні операції масового копіювання для бази даних, на яку поширюється модель відновлення з неповним протоколированием.
  • При додаванні або видаленні файлів баз даних з використанням інструкції ALTER DATABASE.
  • При зупинці примірника SQL Server за допомогою інструкції SHUTDOWN або при зупинці служби SQL Server (MSSQLSERVER). І в тому, і в іншому випадку буде створена контрольна точка кожної бази даних в екземплярі SQL Server.
  • Якщо екземпляр SQL Server періодично створює в кожній базі даних автоматичні контрольні точки для скорочення часу відновлення бази даних.
  • При створенні резервної копії бази даних.
  • При виконанні дії, що вимагає відключення бази даних. Прикладами можуть служити присвоєння параметру AUTO_CLOSE значення ON і закриття останнього з'єднання користувача з базою даних або зміна параметра бази даних, яка потребує перезапуску бази даних.

Компонент SQL Server Database Engine створює контрольні точки автоматично. Інтервал між автоматичними контрольними точками визначається на основі використаного місця в журналі і часу, що пройшов з моменту створення останньої контрольної точки. Інтервал між автоматичними контрольними точками коливається в широких межах і може бути досить тривалим, якщо база даних змінюється рідко. При великомасштабних змінах даних частота автоматичних контрольних точок може бути набагато вище.

Використовуйте параметр конфігурації сервера recovery interval для обчислення інтервалу між автоматичними контрольними точками для всіх баз даних на екземплярі сервера. Значення цього параметра визначає максимальний час, що відводиться компоненту Database Engine на відновлення бази даних при перезапуску системи. Компонент Database Engine оцінює кількість записів журналу, які він може обробити за час recovery interval при виконанні операції відновлення.

Крім того, інтервал між автоматичними контрольними точками залежить від моделі відновлення, як показано нижче.

  • Якщо застосовується повна модель відновлення або модель відновлення з неповним протоколированием, то автоматична контрольна точка створюється кожен раз, коли число записів в журналі досягає значення, визначеного Database Engine в якості граничної кількості записів, яке воно може обробити за час, заданий параметром recovery interval.
  • Якщо використовується проста модель відновлення бази даних, автоматична контрольна точка створюється кожен раз, коли число записів в журналі досягає меншого з двох граничних умов:
    • журнал заповнюється на 70 відсотків;
    • число записів в журналі досягає значення, визначеного компонентом Database Engine в якості кількості записів, яке він може обробити за час, заданий параметром recovery interval.

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

Інструкція CHECKPOINT тепер підтримує необов'язковий аргумент checkpoint_duration. визначає час (в секундах), що відводиться контрольним точкам на завершення. Додаткові відомості див. У розділі CHECKPOINT (Transact-SQL).

Частина журналу, що починається з номера MinLSN і закінчується останнім записом, називається активною частиною журналу, або активним журналом. Цей розділ журналу необхідний для виконання повного відновлення бази даних. Жодна частина активного журналу не може бути усічена. Всі записи журналу до номера MinLSN повинні бути видалені з частин журналу.

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

Останнім записом в журналі транзакцій є запис з номером LSN, рівним 148. На момент обробки записаної контрольної точки з номером LSN 147 транзакція 1 вже зафіксована і єдиною активною транзакцією є транзакція 2. В результаті перший запис журналу, створена для транзакції 2, стає найстарішої записом активної транзакції на момент останньої контрольної точки. Таким чином, номером MinLSN стає номер LSN, рівний 142 і відповідний запис початку транзакції 2.

Активний журнал повинен включати в себе всі елементи всіх незафіксованих транзакцій. Додаток, що ініціює транзакцію і не виконує її фіксацію або відкат, не дозволяє компоненту Database Engine підвищувати MinLSN. Це може привести до проблем двох типів.

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

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