Журнал транзакций MySQL - PullRequest
6 голосов
/ 31 марта 2012

Я работаю над проектом, для которого нам необходимо использовать «ведение журнала транзакций» в нашей СУБД (MySQL). Мы уже перешли на использование InnoDB, чтобы использовать транзакции для другого требования. Я пытаюсь понять, что такое ведение журнала транзакций. Я искал больше дня, включая чтение документации MySQL. Может быть, я просто не ищу правильные ключевые слова, я не уверен. Или, возможно, «ведение журнала транзакций» является неуместной терминологией.

Насколько я понимаю, ведение журнала транзакций базы данных похоже на файловую систему журналирования в том смысле, что изменения вносятся в журнал до того, как они будут зафиксированы в файловой системе. Из того, что я прочитал, похоже, что движок InnoDB хранит транзакции в каком-то журнале, прежде чем они записываются на диск. Это звучит точно? Если это так, где находится журнал транзакций? Это ib_logfile0 и ib_logfile1?

1 Ответ

10 голосов
/ 31 марта 2012

Вы определенно на правильном пути.

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

Это очень помогает в случае сбоя MySQL или сервера.

Когда вы перезапускаете mysql, все незафиксированные записи в ib_logfile0 и ib_logfile1 воспроизводятся как часть аварийного восстановления InnoDB, чтобы привести InnoDB в гармоничное состояние (Это согласованные и долговечные части Соответствие ACID )

Если вы удалите ib_logfile0 и ib_logfile1 и запустите mysql, любая незафиксированная транзакция, содержащаяся в этих файлах, будет потеряна. Если во время цикла восстановления после сбоя файлы журнала отсутствуют, они восстанавливаются на основе параметра innodb_log_file_size .

Пожалуйста, обратитесь к документации MySQL для подробного объяснения InnoDB .

@ karatedog Часть MVCC InnoDB находится в системном табличном пространстве, более известном как ibdata1. Какие бы данные ни отображались до начала транзакции, они записываются, чтобы позволить другим, имеющим доступ к нужным строкам, просматривать данные до того, как будут применены какие-либо обновления. Это позволяет для того, что называется REPEATABLE-READ. Это подпадает под I соответствие ACID, я имею в виду изоляцию. Я писал сообщения об этом в StackExchange администратора баз данных в отношении различных сценариев, в которых изоляция транзакций является хорошей, плохой или ужасной.

Что касается MyISAM, восстановление после сбоя не является автоматическим. Вылетает довольно легко . Вот почему команда SQL REPAIR TABLE существует. Вот почему утилита MySQL myisamchk имеет опцию -r для выполнения REPAIR TABLE для таблиц MyISAM, которые не подключены.

MariaDB и Aria предпринимали попытки сделать отказоустойчивый механизм хранения в качестве замены MyISAM.

...