CHECKPOINT чи COMMIT записує на диск?


12

Скажімо, для SQLServer2008R2 і новіших версій, з базами даних повного режиму відновлення.

Я завжди думав:

  1. Коли транзакція здійснюється (COMMIT), транзакція записується в журнал транзакцій в оперативній пам'яті.

  2. Коли відбувається CHECKPOINT (через деякий час та / або деякі транзакції та інші критерії), транзакції між останньою CHECKPOINT та поточною записуються на диск.

  3. Коли відбувається BACKUP LOG, дані записуються у файл MDF.

Я прав? Деякі з моїх колег кажуть, що я помиляюся, і важко знайти правильну відповідь, навіть із BOL.

Дякую!


Відповіді:


20

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

  • Усі записи (зміни) повністю записаних даних відбуваються в точно такій послідовності (див. Розуміння того, як SQL Server виконує запит: Введення даних ):

    • Сторінка даних є виключно зафіксованою
    • Запис журналу, що описує зміни, додається до журналу, в пам'яті. Новий запис журналу генерує новий LSN, див. Що таке LSN: Номер послідовності журналу .
    • Сторінка даних модифікується (як запис даних, так і last_update_lsn на сторінці). Зараз це змінена ("брудна") сторінка.
    • Звільнено засувку сторінки даних
    • нічого не записується на диск безпосередньо в результаті оновлення
  • Комітет виконує наступні дії

    • додає новий запис із описом COMMIT до журналу в пам'яті
    • всі записи журналів, які не передаються на диск, аж до того, що було створено вище, видаляються (записуються на диск)
    • Блок потоку чекає, поки ОС звітує про вищезазначене записування як довговічне (IO завершує)
    • Завершується оператор COMMIT (або оператор DML з неявною фіксацією)
  • CHECKPOINT виконує наступні дії (спрощено), див. Як працюють контрольно-пропускні пункти та що відбувається реєстрація :

    • Всі брудні сторінки в пам'яті записуються на диск
      • Перед кожною брудною сторінкою перед тим, як почати записувати на диск, журнал до та включаючи LSN, який є останнім_update_lsn на цій сторінці, змивається (записується на диск). Зверніть увагу, що будь-яка LSN під флешином означає, що всі попередні LSN також очищені, тому для самих брудних сторінок це неоперативний режим, оскільки його власне last_update, ймовірно, вже розмито.
    • Запис журналу, що описує контрольну точку, записується в журнал і промивається
    • сторінка завантаження бази даних оновлюється LSN запису, згенерованого вище

Записує роботу по-різному для операцій з мінімально зареєстрованим журналом, див. Операції, які можуть бути мінімально введеними . Приблизно операції з мінімально зареєстрованим журналом діють наступним чином (спрощено):

  • Перш ніж вставляти рядки на сторінку як частину операції, що мінімально реєструється, створюється та додається до журналу (у пам'яті) запис журналу, що описує факт участі сторінки в мінімально зареєстрованих операціях.
  • Оновлюється мінімально зареєстрована сторінка, оскільки на ній написано багато вставок, наскільки вона підходить. Нічого не реєструється, не записується на диск.
  • Коли операція з мінімально зареєстрованим журналом вчиняється, перед тим, як вона здійсниться, потрібно, щоб усі сторінки, які брали участь в операціях, що були мінімально зареєстровані в цій транзакції, записувалися на диск. Onyl після завершення цього запису, запис журналу COMMIT може бути доданий до журналу (у пам'яті), а журнал, аж до цього нещодавно доданого запису журналу фіксування, зливається (записується) на диск.

8

Коли транзакція здійснюється (COMMIT), транзакція записується в журнал транзакцій в оперативній пам'яті.

Транзакція записується в журнал транзакцій, перш ніж навіть змінити сторінку або дані, як вимагає запит. Це називається записом вперед запису (WAL). Якщо SQL Server виходить з ладу під час оновлення сторінки в пам'яті WAL, система двигуна БД може читати журнал транзакцій і відкидати транзакцію. Це властивість кислоти RDBMS.

Коли відбувається CHECKPOINT (через деякий час та / або деякі транзакції та інші критерії), транзакції між останньою CHECKPOINT та поточною записуються на диск.

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

Коли відбувається BACKUP LOG, дані записуються у файл MDF.

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

Я хотів би, щоб ви прочитали посилання нижче

Розуміння ведення журналів та відновлення на SQL сервері Вже вказав Марк

SQL Server 2008 Внутрішня інформація та книга з усунення несправностей

Архітектура та управління журналом транзакцій


Гаразд, здається зрозумілим. Просто для певності: коли трапляється COMMIT, ви кажете, що він записується в журнал транзакцій; Ви маєте на увазі буфер або диск (LDF)?
Пататор

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

"Якщо SQL-сервер виходить з ладу під час оновлення сторінки в пам'яті WAL, система двигуна БД може читати журнал транзакцій і повертати транзакцію." Це справедливо лише в тому випадку, якщо операція не вчинена. Якщо це вже зроблено, нічого не можна повернути назад. Інформація в журналі транзакцій використовується для оновлення файлів даних. Навіть якщо буфер не був записаний у файл даних перед збоєм.
чудо173

@Miracle: Я думаю, якби оновлювалася сторінка, яка пов'язана з певною транзакцією, звичайно транзакція не була б здійснена.
Шанкі

4

Нижче буде роз'яснено речі для вас:

Коли транзакція здійснюється (COMMIT), транзакція записується в журнал транзакцій в оперативній пам'яті.

  • COMMIT (або BEGIN) не має нічого спільного з моделлю відновлення. Це на рівні транзакцій. Трансакція повинна повністю завершитися або провалитися ( пам’ятайте властивості ACID ). Отже, по суті, COMMIT позначатиме кінець успішної транзакції (неявна або явна). Заява COMMIT гарантує, що всі модифікації транзакції є постійною частиною бази даних.
  • Для того, щоб вносити будь-які зміни, SQL Server використовує WAL (Write-forward Logging), де спочатку описує в журналі всі зміни, які він збирається внести, перш ніж змінювати дані.

Коли відбувається CHECKPOINT (через деякий час та / або деякі транзакції та інші критерії), транзакції між останньою CHECKPOINT та поточною записуються на диск.

Коли відбувається BACKUP LOG, дані записуються у файл MDF.

Відноситься до :

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