Я не ожидал, что MySQL спросит об этом...

Java MySQL

предисловие

Текст был включен в мою избранную статью на GitHub, Welcome Star:GitHub.com/Zhongf UC очень…

Некоторое время назад мой старший брат спросил меня: «Вы знаете, как гарантируется атомарность MySQL?» Я запутался, как MySQL гарантирует атомарность? Я не буду.

Все знают, что означает атомарность в транзакции:Транзакция состоит из нескольких операций, все или ни одна из которых не выполняется."

Так что мой старший брат сказал мне: «Что используется,undo logКакие".

Я: "Блять, опять слепое пятно знаний"

Позже я посмотрел его в Интернете, и в MySQL есть несколько распространенных.log, соответственно:

  • undo log
  • binlog
  • redo log

Если вы не следовали этимlog, пожалуйста, оставьте мне сообщение в области комментариев,Заставляет меня чувствовать, что я не единственный, кто делает это, хорошо??

Позже я снова поискал, на самом деле такие журналы есть винтервьюЯ часто спрашиваю, когда я, эта статья в самом простом виде, и я надеюсь, что она будет полезна для всех.

1. Что такое бинлог

binlogНа самом деле, это много слышно в повседневной разработке, потому что во многих случаях обновление данных зависит отbinlog.

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

В одном предложении:База данных меняется, данные поисковых систем тоже нужно менять.

Так что будем следитьbinlogменяется, еслиbinlogЕсли есть изменение, то нам нужно записать изменение в соответствующий источник данных.

чтоbinlog?

binlogЗаписывает структуру таблицы базы данных и изменения данных таблицы, такие какupdate/delete/insert/truncate/create. это не будет регистрироватьсяselect(поскольку это не внесло изменений в таблицу)

binlogНа что это похоже?

binlogМы можем просто понять это как: сохранение каждого измененияSQLЗаявление (разумеется, из рисунка ниже не только SQL, но и XID «идентификатор транзакции» и т. д.)

binlogдля чего обычно используется

Есть две основные функции:Копировать и восстанавливать данные

  • MySQL часто используется в компанияхОдин хозяин, много рабовКонструктивно подчиненный сервер должен быть согласован с данными главного сервера, что черезbinlogдостигать
  • Данные в базе удалены, можем пройтиbinlogдля восстановления данных.

так какbinlogизменения в таблице базы данных записываются, поэтому мы можем использоватьbinlogВыполнение репликации (репликация master-slave) и восстановление данных.

2. Что такое журнал повторов

Предположим, у нас есть оператор sql:

update user_table set name='java3y' where id = '3'

Когда MySQL выполняет этот оператор SQL, он должен сначалаid=3чтобы узнать эту запись , а затемnameполе, которое нужно изменить. Это нормально?

Фактически, основная структура хранения Mysql такова:Страница(Все записи хранятся на странице), поэтому MySQL сначала помещает запись туда, гдеСтраницаНайдите, затем загрузите страницу в память и измените соответствующую запись.

Теперь может быть проблема:Что делать, если данные в памяти изменились, а база данных зависла, не успев сброситься на диск?? Видимо, это изменение было потеряно.

Если каждый запрос долженНемедленноПосле сброса диска скорость будет очень низкой, и MySQL может не выдержать этого. Так как же MySQL это делает?

Представлен MySQLredo log, память закончилась, а потом копия будет записанаredo log, этоredo logзаписать это времякакие изменения были сделаны на странице.

на самом деле написатьredo log, также будетbuffer, это написать сначалаbuffer, а потом действительно падают на диск. Что касается отbufferКогда диск будет сброшен, нам нужно будет настроить конфигурацию.

Писатьredo logЕму тоже нужно писать на диск, но его преимущество в том, что顺序IO(Мы все знаем, что последовательный ввод-вывод намного быстрее, чем случайный ввод-вывод).

так,redo logСуществование: когда мы модифицируем, память записывается, но данные на самом деле не записывались на диск. На данный момент наша база данных не работает, мы можемredo logдля восстановления данных. так какredo logявляется последовательным вводом-выводом, поэтомуНаписание быстроredo logЗаписи являются физическими изменениями (страница xxxx была изменена на xxx), размер файла очень мал,Восстановление быстрое.

Три, бинлог и журнал повторов

Увидев это, вы можете подумать:binlogиredo logЭти два слишком похожи, они оба используются для «восстановления».

По сути они похожи кроме "рекавери", но много и разных.Позвольте мне перечислить их ниже.

сохраненный контент

binlogзаписал, чтоupdate/delete/insertОператор SQL, подобный этому, в то время какredo logТо, что записывается, является содержанием физической модификации (xxxx страница изменена xxx).

Итак, при поиске информации будет что-то вроде этого:redo logданные записываютсяфизические изменения,binlogданные записываютсялогическое изменение

Функции

redo logрольУпорствородившийся. После записи памяти, если БД зависнет, то можно пройтиredo logДля восстановления данных, которые память не успела сбросить на диск,redo logЗагружается в память, память можно восстановить до данных до зависания.

binlogРоль - воспроизводить и восстанавливать.

  • Главный-подчиненный сервер должен поддерживать согласованность данных посредствомbinlogдля синхронизации данных.
  • Если все данные базы данных будут удалены,binlogСохраняет все изменения данных, затем вы можете пройтиbinlogдля восстановления данных.

Когда вы увидите это снова, вы подумаете: «Если данные во всей базе удалены, то я могу использоватьredo logзаписи восстанавливать? "не может

Из-за разных функций,redo logОн хранит изменения физических данных.Если данные в нашей памяти были сброшены на диск, тоredo logданные недействительны. такredo logне будет хранитьсяисторияВсе данные меняются,Содержимое файла будет перезаписано.

Детали записи binlog и redo log

redo logОн генерируется движком MySQL InnoDB.

binlogНезависимо от того, какой движок использует MySQL, он будет.

InnoDB является транзакционной, что является одной из четырех основных характеристик транзакций: постоянство зависит отredo log(Если запись в память прошла успешно, но данные фактически не были сброшены на диск, если в это время база данных зависла, мы можем полагаться наredo logдля восстановления данных в памяти, что обеспечивает постоянство).

Как упоминалось выше, при изменении данныхbinlogзапишет содержание изменения,redo logИзменения также будут записаны. (Только один хранит физические изменения, а другой хранит логические изменения). Так каков их порядок записи?

redo logбизнес начинаетсяКогда , начните записывать информацию о каждом изменении иbinlogвфиксация транзакциитолько при записи.

Итак, возникает новая проблема: я пишу один из нихlog, не получилось, что тогда будет? Теперь наша предпосылка состоит в том, чтобы сначала написатьredo log, затем написатьbinlog, Посмотрим:

  • если написатьredo logЕсли не получается, то думаем, что проблема с этой транзакцией, откатываемся и больше не пишемbinlog.
  • если написатьredo logуспехов, пишиbinlog,ПисатьbinlogЯ на полпути к написанию, но что, если я потерплю неудачу? Мы все равно сделаем это в этот разоткат транзакции, будет недействительнымbinlogудалить (потому чтоbinlogЭто повлияет на данные из библиотеки, поэтому нужно удалить)
  • если написатьredo logиbinlogЕсли они увенчаются успехом, то на этот раз сделка будет по-настоящему удачной.

Вкратце: MySQL должен гарантироватьredo logиbinlogизданные согласуютсяДа, если это не совпадает, это испорчено.

  • еслиredo logписать не получается, покаbinlogПишите успешно. Что предполагает, что данные в памяти не успели сбросить на диск, и машина зависнет. Данные главного и подчиненного серверов несовместимы. (с сервера черезbinlogполучать самые свежие данные, а главный сервер из-заredo logНет записей, нет возможности восстановить данные)
  • еслиredo logписать успешно иbinlogНаписать не удалось. Тогда вы не сможете получить последние данные с сервера.

MySQL черездвухэтапная фиксациягарантироватьredo logиbinlogданные согласуются.

процесс:

  • Фаза 1: InnoDBredo logЗапись на диск, транзакция InnoDB входитprepareгосударство

  • Этап 2:binlogЗапись на диск, транзакция InooDB входитcommitгосударство

  • за транзакциюbinlogв конце аXID event, указывающий, успешно ли совершена транзакция, то есть в процессе восстановления,binlogВсе после последнего события XID должно быть очищено.

4. Что такое журнал отмен

undo logКакая польза?

undo logЕсть две основные функции: откат и контроль многоверсионности (MVCC)

Когда данные изменяются, не только записиredo log, также записьundo log, если транзакция завершается сбоем или по какой-либо причине откатывается, вы можете использоватьundo logоткат

undo logОсновное хранилище также является логическим журналом.Например, мы хотимinsertчасть данных,undo logзапишет соответствующийdeleteбревно. мы хотимupdateКогда запись записана, она запишет соответствующийНапротивзапись обновления.

Это также должно быть легко понять, ведь откат — это обратная операция, которую необходимо изменить, чтобы можно было достичь цели отката. Поскольку мы поддерживаем операции отката, мы можем гарантировать:Транзакция состоит из нескольких операций, все или ни одна из которых не выполняется.". [атомарность]

так какundo logСохраняет данные перед модификацией, что эквивалентноПредыдущая версия, MVCC реализует неблокирующие операции чтения и записи и при чтении должен возвращать только данные предыдущей версии.

Наконец

В этой статье ставитсяbinlog /redo log/undo logБыли объяснены самые основные знания, и есть некоторые детали, которые можно дополнить самостоятельно (например,binlogЕсть несколько режимов, а также упомянутая в статье стратегия чистки и т.д.)

Если вы думаете, что узнали что-то, пожалуйста, дайте мне большой палец вверх.

Использованная литература:

если ты хочешьв реальном времениЕсли вы обратите внимание на мои обновленные статьи и галантерейные товары, которыми я делюсь, вы можете подписаться на мой публичный аккаунт "Java3y".

  • 🔥Java красивая карта мозга
  • 🔥Маршрут обучения Java
  • 🔥Разработка общих инструментов

Ответить под публичным аккаунтом"888", чтобы получить его! !

Эта книга была включена в мои избранные статьи на GitHub, добро пожаловать, звезда:GitHub.com/Zhongf UC очень…

попросить лайк Пожалуйста, следите за ️ поделитесь пожалуйста 👥 Спросите сообщение 💬верно для меняочень полезно! ! !