MySQL InnoDB: различия между WAL, буфером двойной записи, буфером журнала, журналом повторов - PullRequest
3 голосов
/ 30 июня 2019

Я изучаю архитектуру MySQL.Я придумаю следующую иллюстрацию:

enter image description here

Есть 4 понятия, которые я не очень хорошо понимаю:

  • буфер двойной записи
  • буфер журнала
  • журнал записи вперед
  • журнал восстановления

Я читаю из многих документов, журнал записи вперед (WAL) является механизмом обеспечения надежности базы данных. MySQL WAL Design Wikipedia WAL

Как и на приведенном выше изображении, при сбросе данных из пула буферов памяти на диски существует два типа буферов: двойной буфер записи и журналбуфер.Зачем нам 2 буфера и как они связаны с WAL?

И последнее, но не менее важное: чем отличаются журналы повторов от WAL.Я думаю, что WAL может помочь восстановлению базы данных, когда что-то происходит неправильно (например, отключение питания, сбой сервера ...).Что нам нужно переделывать журнал вместе с WAL?

1 Ответ

2 голосов
/ 30 июня 2019

Документ WAL, на который вы ссылаетесь, дает подсказку:

Все изменения в файлах данных регистрируются в WAL (так называемый журнал повтора в InnoDB).

Это означает, что WAL и redo log - это два разных термина для одного и того же журнала. Разницы нет.

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

  • Вы совершаете транзакцию
  • Буфер журнала заполнен (буфер журнала имеет фиксированный размер)
  • Каждую 1 секунду независимо от того, заполнен ли буфер журнала

Буфер двойной записи имеет совершенно другое назначение. На самом деле это сегмент табличного пространства InnoDB на диске, а не в оперативной памяти (я думаю, что сбивает с толку то, что термин «буфер» используется для хранения как в оперативной памяти, так и на диске).

Цель буфера двойной записи - предотвратить повреждение данных при частичной записи страницы, в то время как измененные страницы копируются из пула буферов innodb в табличное пространство. То есть, если MySQL Server аварийно завершит работу, когда InnoDB записывает данную страницу на диск, он может частично перезаписать страницу на диске. Даже с журналом повторов восстановить эту страницу невозможно.

Таким образом, InnoDB сначала записывает каждую страницу в небольшое подмножество табличного пространства, называемое буфером двойной записи. Как только он закончит запись этой страницы, он может снова сохранить страницу на нужной странице в табличном пространстве. Если это не удается частично, это нормально, потому что страница также была записана в буфер двойной записи. После того, как страница была сохранена в правильном месте в табличном пространстве, копирование этой страницы в буфере двойной записи не требуется, и ее можно перезаписать при следующей очистке страницы из пула буферов.

...