Все мы знаем, что у транзакций есть 4 характеристики: атомарность, непротиворечивость, изоляция и долговечность.Операции в транзакции либо выполняются все, либо не выполняются вообще.Это цель транзакции. Изоляция транзакции достигается за счет механизма блокировки, а атомарность, согласованность и устойчивость гарантируются журналом повторов и журналов отмены транзакции. Итак, в этой статье мы обсудим несколько вопросов о повторении и отмене транзакций:
- Что такое журналы повторов и журналы отмен?
- Как повтор обеспечивает надежность транзакции?
- Является ли журнал отмен обратным процессом журнала повторов?
redo log
Типы повторов
Журнал повторов используется для обеспечения устойчивости транзакции, то есть D в ACID транзакции. На самом деле его можно разделить на следующие два типа:
- Физический журнал повторов
- Логический журнал повторов
В механизме хранения InnoDBВ большинстве случаев Redo - это физическая запись журнала - это страницы данных физического изменения.而逻辑Redo日志,不是记录页面的实际修改,而是记录修改页面的一类操作,比如新建数据页时,需要记录逻辑日志。关于逻辑Redo日志涉及更加底层的内容,这里我们只需要记住绝大数情况下,Redo是物理日志即可,DML对页的修改操作,均需要记录Redo.
Что делает Редо
Основная функция журнала повторов — восстановление после сбоя базы данных.
Композиция Redo
Журнал повторов можно просто разделить на следующие две части:
- Одним из них является буфер журнала повторного выполнения в памяти (буфер журнала повторного выполнения), который является энергозависимым и находится в памяти.
- Второй — файл журнала повторов (файл журнала повторов), который является постоянным и хранится на диске.
Когда был написан Redo?
Время записи в Redo:
- После завершения модификации страницы данных, до того, как грязная страница будет сброшена на диск, записывается журнал повторов. Обратите внимание, что сначала изменяются данные, а затем записывается журнал.
- журналы повторов записываются на диск перед страницами данных
- Изменение кластеризованного индекса, вторичного индекса и страницы отмены необходимо записывать в журнал повторов.
Общий процесс Redo
Давайте возьмем транзакцию обновления в качестве примера, чтобы макроскопически понять процесс потока журнала повторов, как показано на следующем рисунке:
- Шаг 1: Сначала прочитайте исходные данные с диска в память и измените копию данных в памяти.
- Шаг 2: Создайте журнал повторов и запишите его в буфер журнала повторов, в котором записывается измененное значение данных.
- Шаг 3: Когда транзакция фиксируется, сбрасывайте содержимое буфера журнала повторов в файл журнала повторов и используйте дополнительную запись в файл журнала повторов.
- Шаг 4. Периодически сбрасывайте измененные данные из памяти на диск.
Как повтор обеспечивает надежность транзакции?
InnoDB — это механизм хранения транзакций, которыйМеханизм Force Log at CommitЧтобы обеспечить постоянство транзакции, то есть когда транзакция зафиксирована, буфер журнала повторов сначала записывается в файл журнала повторов для сохранения, и транзакция завершается, когда операция фиксации транзакции завершена. Эта практика также известна какЖурнал с опережающей записью (сохранение до журнала), прежде чем сохранять страницу данных, сохраните соответствующую страницу журнала в памяти.
Чтобы гарантировать, что каждый журнал записывается в файл журнала повторов, после того, как каждый буфер повторов записывается в файл журнала повторов, по умолчанию механизм хранения InnoDB должен вызываться один раз.операция fsync, Поскольку журнал повторов включен и параметр O_DIRECT отсутствует, журнал повторов сначала записывается в кэш файловой системы. Чтобы журналы повторов записывались на диск, необходимо выполнить операцию fsync. fsync — это операция системного вызова, и эффективность fsync зависит от производительности диска, поэтому производительность диска также влияет на производительность отправки транзакций, то есть на производительность базы данных.(Опция O_DIRECT — это опция в системе Linux. После использования этой опции над файлом выполняется прямая операция ввода-вывода, и он напрямую записывается на диск, минуя кеш файловой системы)
упомянутый вышеМеханизм Force Log at CommitЭто зависит от параметров, предоставляемых механизмом хранения InnoDB.innodb_flush_log_at_trx_commit
Для контроля этот параметр может управлять стратегией сброса журнала повторного выполнения на диск. Установка значения этого параметра также может позволить пользователям устанавливать непостоянство следующим образом:
- Когда для параметра установлено значение 1 (по умолчанию 1), это означает, что он должен вызываться один раз при фиксации транзакции.
fsync
Эксплуатация, самая безопасная конфигурация, гарантированная долговечность - Когда параметр установлен на 2, только когда транзакция фиксируетсяwriteоперации, в кэш страниц системы гарантированно записывается только буфер журнала повторов, а операция fsync не выполняется, поэтому при выходе из строя базы данных MySQL транзакции не будут потеряны, но если операционная система выйдет из строя, транзакции могут быть потеряны.
- Когда параметр установлен в 0, это означает, что операция журнала повторов не выполняется, когда транзакция зафиксирована.Эта операция завершается только в главном потоке, а операция fsync журнала повторов выполняется каждую 1 секунду в главном потоке. поток, поэтому сбой экземпляра теряется не более чем транзакциями за 1 секунду. (Главный поток отвечает за асинхронную передачу данных из пула буферов на диск для обеспечения согласованности данных)
fsync
иwrite
Операция на самом деле является функцией системного вызова, которая используется во многих сценариях сохранения.Например, две функции также используются в сохранении AOF Redis.fsync
Операция Отправьте данные на жесткий диск, принудительно синхронизируйте жесткий диск, он будет заблокирован до тех пор, пока жесткий диск не будет записан и возвращен, и будет выполнено большое количество операций.fsync
операция имеет узкое место в производительности, иwrite
Операция возвращается сразу после записи данных в страничный кеш системы, а затем полагается на механизм планирования системы для сброса кэшированных данных на диск в следующей последовательности: пользовательский буфер --> страничный кеш --> диск.
Как Redo реализован в InnoDB? Ссылка на мини-транзакцию?
Реализация Redo на самом деле тесно связана с мини-транзакцией.Мини-транзакция — это внутренний механизм, используемый InnoDB.Обеспечение согласованности данных на страницах данных при параллельных транзакционных операциях и исключениях базы данных., но это не часть транзакции.
Чтобы мини-транзакция обеспечивала согласованность данных страницы данных, мини-транзакция должна следовать следующим трем протоколам.:
- The FIX Rules
- Write-Ahead Log
- Force-log-at-commit
The FIX Rules
При изменении страницы данных вам необходимо получить x-защелку (монопольную блокировку) страницы, а при получении страницы данных вам потребуется s-защелку (блокировку чтения или общую блокировку) страницы или x-защелку, удержание s-защелки страницы (блокировка чтения или общая блокировка) Блокировка до тех пор, пока изменение или доступ к странице не будут завершены.
Write-Ahead Log
Журнал упреждающей записи упоминался в предыдущем изложении. Перед сохранением страницы данных необходимо сохранить соответствующую страницу журнала в памяти. Каждая страница имеет LSN (порядковый номер журнала), представляющий порядковый номер журнала (LSN занимает 8 байт, монотонно увеличиваясь), когда страницу данных необходимо записать на постоянное устройство, требуется память меньше, чем LSN Журнал сначала записывается на постоянное устройство. Журнал записывается последовательно в методе append, который является последовательным методом.По сравнению со случайной записью, последовательная запись может в полной мере использовать производительность диска.
Force-log-at-commit
Это также содержание того, как обеспечить долговечность транзакции, упомянутой выше.Вот снова резюме, которое перекликается с вышеуказанным содержанием. В транзакции можно изменить несколько страниц. Журнал упреждающей записи может гарантировать согласованность одной страницы данных, но не может гарантировать надежность транзакции. Журнал транзакций должен быть сброшен на диск.Если база данных выходит из строя до того, как страницы в пуле буферов будут сброшены на постоянное запоминающее устройство после сброса журнала, журнал можно использовать для обеспечения целостности данных при перезапуске базы данных.
Процесс записи журнала повторов
На приведенном выше рисунке показан процесс записи журнала повторов.Каждая мини-транзакция соответствует каждой операции DML, например оператору обновления, который гарантируется мини-транзакцией.После изменения данных создается redo1, и он записывается первым , В приватном буфере мини-транзакции после завершения оператора обновления скопируйте redo1 из приватного буфера в общедоступный буфер журнала. Когда вся внешняя транзакция зафиксирована, буфер журнала повторов сбрасывается в файл журнала повторов.
undo log
Определение журнала отмены
Журнал отмен в основном фиксирует логические изменения данных.Чтобы откатить предыдущую операцию при возникновении ошибки, необходимо записать все предыдущие операции, а затем откатиться при возникновении ошибки.
Роль журнала отмены
undo — это логический журнал с двумя функциями:
- для отката транзакции
- MVCC
Про MVCC (управление многоверсионным параллелизмом) здесь особо нечего сказать, в этой статье основное внимание уделяется журналу отмены для отката транзакции.
Журнал отмен только логически восстанавливает базу данных в исходное состояние. При откате он фактически выполняет противоположную работу. Например, INSERT соответствует DELETE. Каждому UPDATE соответствует противоположное UPDATE. Верните предыдущую строку назад . Журнал отмены используется для операций отката транзакций, чтобы обеспечить атомарность транзакции.
Запись времени отмены журнала
- Прежде чем операция DML изменит кластеризованный индекс, запишите журнал отмены.
- Изменение записей вторичного индекса, журнал отмены не записывается
Следует отметить, что изменение страницы отмены также необходимо записывать в журнал повторов.
отменить место хранения
В механизме хранения InnoDB отмена хранится в сегменте отката, каждый сегмент отката записывает 1024 сегмента журнала отката, и страницы отката применяются в каждом сегменте сегмента журнала отката.До 5.6 сегмент отката находится в общем табличном пространстве.После 5.6 .3 место хранения отката можно задать через innodb_undo_tablespace.
тип отмены
В механизме хранения InnoDB журнал отмены разделен на:
- insert undo log
- update undo log
Журнал отмены вставки относится к журналу отмены, сгенерированному во время операции вставки, поскольку запись об операции вставки видна только самой транзакции, но не другим транзакциям. Таким образом, журнал отмены можно удалить сразу после фиксации транзакции, и операция очистки не требуется.
Журнал отмены обновления записывает журнал отмены, сгенерированный операциями удаления и обновления.В журнале отмены может потребоваться механизм MVCC, чтобы его нельзя было удалить при фиксации транзакции. Поместите его в список журнала отмены при отправке и подождите, пока поток очистки выполнит окончательное удаление.
Дополнение: Двумя основными функциями потока очистки являются: очистка страницы отмены и очистка строки данных с флагом Delete_Bit на странице. В InnoDB операция Delete в транзакции на самом деле не удаляет строку данных, а является операцией Delete Mark, которая идентифицирует Delete_Bit в записи, не удаляя запись. Это своего рода «фальшивое удаление», просто пометка, реальная работа по удалению должна выполняться потоком фоновой очистки.
Является ли журнал отмен обратным процессом журнала повторов?
Является ли журнал отмен обратным процессом журнала повторов? Собственно, ответ можно извлечь из предыдущей статьи: журнал отмен — это логический журнал, при откате транзакции он лишь логически восстанавливает базу данных в исходное состояние, а журнал повторов — это физический журнал, в который записывается физические изменения страниц данных.Очевидно, что журнал отмены не является обратным процессом журнала повторов.
redo & undoСводка
Ниже приведен упрощенный процесс журнала повторов + журнал отмены, в котором легко понять процесс двух видов журналов:
假设有A、B两个数据,值分别为1,2.
1. 事务开始
2. 记录A=1到undo log
3. 修改A=3
4. 记录A=3到 redo log
5. 记录B=2到 undo log
6. 修改B=4
7. 记录B=4到redo log
8. 将redo log写入磁盘
9. 事务提交
На самом деле, в операциях вставки/обновления/удаления содержимое и объемы, записанные повтором и отменой, различаются. В памяти InnoDB общий порядок следующий:
- написать отменить повторить
- написать отменить
- Изменить страницу данных
- написать повторить
резюме
В этой статье анализируются журналы повторов и отмен в транзакции, а также ссылки на некоторые материалы и книги, и в некоторых местах это может быть неясно. Если что-то не так, пожалуйста, укажите это.