CHECKPOINT или COMMIT записывает на диск?

12

Допустим, для SQLServer2008R2 и выше, с полным режимом восстановления баз данных.

Я всегда думал, что :

  1. Когда транзакция фиксируется (COMMIT), транзакция записывается в журнал транзакций в ОЗУ.

  2. Когда происходит CHECKPOINT (через некоторое время и / или некоторые транзакции и другие критерии), транзакции между последним CHECKPOINT и текущим записываются на диск.

  3. Когда происходит BACKUP LOG, данные записываются в файл MDF.

Я прав? Некоторые из моих коллег говорят, что я неправ, и трудно найти правильный ответ, даже с BOL.

Благодарность!

Patator
источник
1
Прочитайте это: technet.microsoft.com/en-us/magazine/2009.02.logging.aspx
Марк Уилкинсон

Ответы:

20

К сожалению, в ответах на вопрос о том, как работает COMMIT, есть ряд ошибок, поэтому я добавлю еще одну. Смотрите как это работает: Боб DORR в SQL Server ввода / вывода презентации для деталей и SQL Server 2000 I / O Basics . Вот как это работает:

  • Все полностью зарегистрированные записи данных (изменения) происходят в точно следующей последовательности (см. Понимание того, как SQL Server выполняет запрос: запись данных ):

    • Страница данных фиксируется исключительно
    • Запись журнала, описывающая изменение, добавляется в журнал в памяти. Новая запись журнала создает новый номер LSN, см. Что такое LSN: порядковый номер журнала .
    • Страница данных изменяется (и запись данных, и last_update_lsn на странице). Это теперь измененная («грязная») страница.
    • Защелка страницы данных выпущена
    • в результате обновления ничего не записывается на диск напрямую
  • COMMIT делает следующее

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

    • Все грязные страницы в памяти записываются на диск
      • Для каждой грязной страницы перед началом записи на диск сбрасывается журнал, включающий LSN, который является last_update_lsn на этой странице (записывается на диск). Обратите внимание, что сброс любого LSN подразумевает, что все предыдущие LSN также сбрасываются, поэтому для самых грязных страниц это не работает, так как его собственный last_update, вероятно, уже сброшен.
    • запись журнала, описывающая контрольную точку, записывается в журнал и сбрасывается
    • страница загрузки базы данных обновляется с помощью LSN записи, сгенерированной выше

Операции записи по- разному выполняются для операций с минимальной регистрацией, см. Операции, которые могут быть минимально зарегистрированы . Примерно минимально зарегистрированные операции действуют следующим образом (упрощенно):

  • Перед вставкой строк в страницу как часть минимально регистрируемой операции создается запись в журнале, описывающая тот факт, что страница участвует в минимально регистрируемых операциях, и добавляется в журнал (в памяти).
  • Страница с минимальной регистрацией обновляется, так как на нее пишется много вставок. Ничего не записывается, nothign записывается на диск.
  • Когда фиксируется минимально зарегистрированная операция, перед ее фиксацией требуется, чтобы все страницы, которые участвовали в минимально зарегистрированных операциях в этой транзакции, записывались на диск. После завершения этой записи запись журнала COMMIT может быть добавлена ​​в журнал (в памяти), и журнал, вплоть до этой новой добавленной записи журнала фиксации, сбрасывается (записывается) на диск.
Ремус Русану
источник
8

Когда транзакция фиксируется (COMMIT), транзакция записывается в журнал транзакций в ОЗУ.

Транзакция записывается в журнал транзакций еще до изменения страницы или данных в соответствии с запросом. Это называется записью перед записью (WAL). Если происходит сбой SQL Server во время обновления страницы в памяти, WAL гарантирует, что механизм БД сможет прочитать журнал транзакций и откатить транзакцию. Это свойство ACID СУБД.

Когда происходит CHECKPOINT (через некоторое время и / или некоторые транзакции и другие критерии), транзакции между последним CHECKPOINT и текущим записываются на диск.

Контрольная точка сбрасывает грязные страницы из буфера на диск. Он ведет себя немного по-другому для tempdb . Грязная страница - это страница, которая изменилась с момента чтения с диска. Этот процесс контрольной точки создает отметку в журнале транзакций до момента, когда транзакции были зафиксированы. После сбоя восстановление знает, что все транзакции до этой отметки были совершены. Вы можете выдать контрольную точку вручную с помощью команды TSQL.

Когда происходит BACKUP LOG, данные записываются в файл MDF.

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

Я хотел бы, чтобы вы прочитали ссылки ниже

Понимание ведения журнала и восстановления в SQL Server, уже отмеченное Марком

SQL Server 2008 Внутренние компоненты и книга устранения неполадок

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

Shanky
источник
Ок, кажется понятно. Просто для уверенности: когда происходит COMMIT, вы говорите, что он записан в журнал транзакций; Вы имеете в виду буфер или диск (LDF)?
Пататор
Сначала он всегда записывается в кэш журнала, а затем сбрасывается в журнал транзакций на диске. Я добавил ссылку управления журналом транзакций, чтобы узнать, как работает WAL
Shanky
«Если происходит сбой SQL Server во время обновления страницы в памяти, WAL гарантирует, что механизм БД сможет прочитать журнал транзакций и откатить транзакцию». Это верно только в том случае, если транзакция не зафиксирована. Если оно уже зафиксировано, ничего нельзя откатить. Информация в журнале транзакций используется для обновления файлов данных. Даже если буфер не был записан в файл данных до сбоя.
чудо173
@Miracle: я думаю, что если страница обновляется, которая связана с конкретной транзакцией, конечно, транзакция не была бы зафиксирована.
Шэнки
4

Ниже будут разъяснены вещи для вас:

Когда транзакция фиксируется (COMMIT), транзакция записывается в журнал транзакций в ОЗУ.

  • COMMIT (или BEGIN) не имеет ничего общего с моделью восстановления. Это на уровне транзакции. Транзакция должна либо полностью завершиться, либо завершиться неудачей ( помните свойства ACID ). По сути, COMMIT будет отмечать конец успешной транзакции (явной или неявной). Оператор COMMIT гарантирует, что все модификации транзакции станут постоянной частью базы данных.
  • Чтобы внести какие-либо изменения, SQL Server будет использовать WAL (запись в журнал с опережением записи), в котором он будет сначала описывать в журнале любые изменения, которые он собирается внести, прежде чем изменять данные.

Когда происходит CHECKPOINT (через некоторое время и / или некоторые транзакции и другие критерии), транзакции между последним CHECKPOINT и текущим записываются на диск.

Когда происходит BACKUP LOG, данные записываются в файл MDF.

Ссылаться на :

Кин Шах
источник