2012-03-30 2 views
5

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

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

ответ

9

Вы, безусловно, находитесь на правильном пути здесь.

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

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

При перезагрузке MySQL, все несохраненные элементы в ib_logfile0 и ib_logfile1 воспроизводятся как часть восстановления после сбоя в InnoDB, чтобы принести InnoDB в гармоничное состояние (Это соответствует и Прочные части ACID Compliance)

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

См. MySQL Documentation for a detailed explanation of InnoDB.

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

Что касается MyISAM, crash recovery is not automatic. It crashes rather easily. Вот почему существует команда SQL REPAIR TABLE. Вот почему утилита MySQL myisamchk имеет параметр -r для выполнения REPAIR TABLE для таблиц MyISAM, которые не находятся в сети.

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

+0

Я понимаю, что эти файлы журналов предназначены для восстановления после сбоя, но не являются ли механизмы MVCC ответственными за «транзакцию», чтобы нормально работать, когда не происходит сбой? MyISAM имеет некоторую степень восстановления после сбоя, в то время как у него нет транзакций вообще. – karatedog

+0

Благодарим вас за подробный и своевременный ответ. Я немного запутался в воспроизведении записей в журналах.Если произошел сбой в середине транзакции, до того, как была выпущена фиксация, я бы подумал, что вы не захотите воспроизводить записи, так как транзакции все или ничего (вы не хотите, чтобы часть транзакции быть совершены). Или вы говорите, что они будут воспроизведены только в том случае, если произошел коммит, но произошел сбой до того, как транзакция была передана базе данных, но после того, как она была сохранена в файлах журнала? – alfredough

Смежные вопросы