#mysql #redo
#mysql #повторить
Вопрос:
Раньше я думал, что журнал повтора использовался для восстановления базы данных при сбое. Но я почувствовал, что был неправ, когда увидел примечание следующего содержания:
аварийное восстановление
Действия по очистке, которые происходят при повторном запуске MySQL после сбоя. Для таблиц InnoDB изменения от незавершенных транзакций воспроизводятся с использованием данных из журнала повтора. Изменения, которые были зафиксированы до сбоя, но еще не записаны в файлы данных, восстанавливаются из буфера двойной записи. Когда база данных завершает работу в обычном режиме, этот тип действий выполняется во время завершения работы с помощью операции очистки.
Во время нормальной работы зафиксированные данные могут храниться в буфере изменений в течение определенного периода времени, прежде чем быть записанными в файлы данных. Всегда существует компромисс между поддержанием файлов данных в актуальном состоянии, что приводит к увеличению производительности при нормальной работе, и буферизацией данных, что может привести к более длительному завершению работы и аварийному восстановлению. Смотрите также Изменить буфер, фиксацию, сбой, файлы данных, буфер двойной записи, InnoDB, очистка, журнал повтора.
это из mysql refman-5.7-ru.pdf.
Если это реально, я не знаю, какое использование имеет журнал повтора. Потому что, когда происходит сбой, mysql может восстановить себя через буфер двойной записи. Кажется, журнал повтора не имеет смысла. Может быть, я где-то игнорирую, но я не знаю.
Я хочу знать разницу между ними и важно ли для mysql InnoDB журнал повтора?
Ответ №1:
Журнал повтора, по-видимому, функционирует на более низком, более критическом уровне. Я использую MySQL как инструмент анализа рабочего стола, поэтому я решил, что мне не нужна защита рабочей базы данных. Я вижу заметно улучшенную производительность запросов, когда буферизация двойной записи отключена ( innodb-doublewrite=0
). Никаких проблем с этим уже более года. Журнал повтора — это другая история; в течение недели после его отключения мне пришлось перестраивать свою базу данных.
В версии 8.0.21 была введена возможность переключения журнала повтора ( ALTER INSTANCE ENABLE|DISABLE REDO_LOG
). «Почему бы не попробовать?» Я подумал. После отключения я увидел улучшение скорости загрузки на 2-5%.
Это имеет значение при загрузке больших файлов, особенно если используется утилита параллельного импорта таблиц (введенная в 8.0.17).
К сожалению, я оставил ЖУРНАЛ ПОВТОРА отключенным, и на моей рабочей станции произошел сбой при записи в таблицы, и в итоге появилось это сообщение об ошибке:
[ERROR] [MY-013578] [InnoDB] Server was killed when Innodb Redo logging was disabled. Data files could be corrupt. You can try to restart the database with innodb_force_recovery=6
Мне пришлось инициализировать новый экземпляр, так как ни одна из таблиц не позволила мне ничего записать после того, как я получил эту ошибку.
Force_recovery=6
является строгим и доступным только для чтения. Мне пришлось перестроить свою базу данных (что я в основном и делаю каждый раз, когда импортирую таблицы), но несколько таблиц констант и истории мне пришлось восстанавливать вручную.
Это задокументировано на странице документации журнала повтора страницы MySQL.Предупреждение о журнале повтора получает затененную жирным шрифтом предупреждающую выноску. Я должен был прислушаться к этому.
Я по-прежнему отключаю журнал повтора, но только изнутри кода .js, который запускает утилиту параллельного импорта:
sql
SET GLOBAL local_infile = 1;
ALTER INSTANCE DISABLE INNODB REDO_LOG;
Я всегда оставляю его включенным в коде. Я оставляю буфер двойной записи выключенным, так как любые транзакции, оказанные частичными, я могу легко исправить, перезагрузив таблицу.
Ответ №2:
Может быть, это сообщение в блоге ответит на ваш вопрос:
Нажмите здесь
Комментарии:
1. старайтесь избегать ответов только по ссылкам . Ссылки — это здорово, но, по крайней мере, попытайтесь предоставить свой оригинальный контент, объясняющий, о чем спрашивал OP.
2. Спасибо. Журнал повтора помогает мне понять особенности ACID транзакций. Журнал повтора реализует или решает согласованность при возникновении сбоя. Буфер Doublewirte также работает. Разница в том, что
3. Разница в том, что этапы, которые они обрабатывают, разные. изменить sql -> журнал повтора -> грязная страница (пул буферов) -> буфер двойной записи -> файл ibdata.
4. Наверное, я не понимаю, почему MySQL нужно записывать данные три раза. Журнал повтора, буфер двойной записи, затем файл данных. Я бы подумал, что при правильной разработке потребуется только два.