MySQL использует механизм буфера, чтобы избежать дискового ввода-вывода для каждого чтения и записи и повысить эффективность:
Размер одной страницы в буфере MySQL составляет 16 КБ, а размер одной страницы в файловой системе — 4 КБ, то есть MySQL сбрасывает одну страницу данных из буфера на диск, а в файл нужно записать 4 страницы. система.
Как показано на рисунке выше, страница со page=1 в MySQL физически соответствует четырем сеткам 1+2+3+4 на диске.
Итак, возникает вопрос,Эта операция не является атомарной. Будет ли проблема, если питание отключится на полпути выполнения?
Да, это называется "повреждение данных страницы".
Как показано на рисунке выше, страница со страницей = 1 в MySQL готова к сбросу на диск, а в файловой системе сброшено только 3 страницы, при отключении питания появится надпись: После перезагрузки , диску физически соответствует страница со page=1 1+2+3+4 четыре сетки, целостность данных нарушена.
_Голос за кадром: _Redo не может исправить такие исключения "повреждение данных страницы". Предпосылкой восстановления является "данные страницы верны" и журнал повторов в норме.
Как решить такую проблему «порчи данных страницы»?
Легко придумать способ иметь «копию» для восстановления исходной страницы, и место, где хранится «копия», — это буфер двойной записи.
Двойной буфер записи, но он отличается от традиционного буфера, он разделен наОЗУа такжедискдвухуровневая архитектура.
_Озвучка:__Традиционный буфер, в основном память;_А данные в DWB нужно высадить.
Как показано на рисунке выше, когда необходимо обновить данные страницы:
первый шаг: Memcopy данные страницы сначала в память DWB;
второй шаг: В памяти DWB сначала прошивается на диск DWB;
третий шаг: в память DWB, а затем прошить на диск с данными;
_Голос за кадром: _DWB состоит из 128 страниц, а емкость всего 2M.
Шаги 2 и 3 требуют записи на диск 2 раза, что является источником «двойной записи».
Почему DWB может решить проблему «порчи данных страницы»?
Если предположить, что питание отключено на шаге 2, полные данные 1+2+3+4 все еще находятся на диске.
_Голос за кадром: _Пока данные страницы заполнены, данные можно восстановить с помощью повтора.
Если питание отключается на шаге 3, полные данные сохраняются в DWB.
Следовательно, не должно быть проблемы «порчи данных страницы».
_Голос за кадром: _Я написал это дважды, и всегда есть место, где данные в порядке.
Я сам пытался десятки раз, но я все еще не могу воспроизвести «повреждение данных страницы».Когда я обнаружил «повреждение данных страницы» в Интернете, процесс перезапуска MySQL использует DWB для восстановления данных страницы.
Как видите, при запуске:
(1) InnoDB в последний раз обнаружил аварийное завершение работы;
(2) Попытка восстановить данные ibd не удалась;
(3) Восстановление недописанных страниц из DWB;
Целостность данных страницы может быть гарантирована с помощью DWB, но, в конце концов, DWB долженПриведет ли двойная запись на диск к резкому падению производительности базы данных?
Анализ трех шагов, выполняемых DWB:
(1) Первым шагом является копирование данных страницы в память DWB, что очень быстро;
(2) На втором этапе fsync памяти DWB сбрасывается на диск DWB, что представляет собой последовательную запись с добавлением, и скорость также очень высока;
(3) Третий шаг, чистка диска и случайная запись, уже необходим и не является дополнительной операцией;
Кроме того, 128 страниц (16 КБ на страницу) 2M DWB будут сброшены на диск дважды, максимум 64 страницы каждый раз, то есть 1M данных, и выполнение также очень быстрое.
Подводя итог, производительность будет затронута, но влияние невелико.
Голос за кадром:
(1) Причина, по которой упреждающая запись имеет высокую производительность, заключается в последовательном добавлении;
(2) Существует сторонняя оценка, которая оценивает потерю производительности примерно в 10%;
В частности, в InnoDB есть две переменные, которые могут просматривать ситуацию, связанную с двойным буфером записи:
Innodb_dblwr_pages_written
Записывает количество страниц, записанных в DWB.
Innodb_dblwr_writes
Записывает количество операций записи DWB.
в состоянии пройти:
show global status like "%dblwr%"
чтобы узнать.
конец
MySQL имеет сильнуюмеханизм защиты данных:
(1) В случае ненормального сбоя, если нет «порчи данных страницы», данные можно восстановить с помощью повтора;
(2) Когда происходит «повреждение данных страницы», данные страницы могут быть восстановлены через буфер двойной записи;
double write buffer:
(1) Это не буфер памяти, а двухуровневая структура памяти/диска, которая является важной частью архитектуры On-Disk в InnoDB;
(2) Это механизм обеспечения целостности страниц за счет двойной записи;
Знай это, знай почему.
Идеи важнее выводов, я надеюсь, что у каждого есть что-то получить.
Путь архитектора- Делитесь техническими идеями
Статьи по Теме: