Почему для записи блока журнала повторов MySQL InnoDB не требуется двойная запись?
Размер блока журнала повторов MySQL InnoDB составляет 512 байт (возможно, сектор на диске). Я читал, сектор диска пишет атомарно?. Похоже, что решение о том, является ли запись сектора атомарной, зависит от базового оборудования. Итак, если он не атомарный, как журнал повторов InnoDB может гарантировать, что он не будет поврежден?
Предположим, что последний блок журнала не был заполнен на диске, тогда механизм InnoDB записывает в этот блок дополнительные записи журнала и сбрасывает их на диск. Внезапное отключение питания привело к тому, что на диск была записана только часть блока. При этом контрольная сумма этого блока не совпадает. Другие ранее совершенные транзакции будут потеряны после перезапуска сервера.
1 ответ
при фиксации транзакции mysql принудительно сбрасывает блок журнала повторов (512b) на диск, если блок журнала не заполнен, mysql заполнит блок нулем (заполнение нулями) перед сбросом на диск.
если действие сброса выполнено успешно, транзакционная фиксация будет успешной; если в действии сброса есть ошибка, транзакционная фиксация будет неудачной;
поэтому, если фиксация транзакции прошла успешно, журнал повторов транзакции должен быть сброшен на диск.
если контрольная сумма блока повторного выполнения не соответствует, это означает, что операция очистки блока журнала повторного выполнения имеет ошибку (например, отключение питания), транзакция журнала повторного выполнения в этом блоке должна завершиться ошибкой.
Таким образом, зафиксированная транзакция не будет потеряна, когда mysql восстановится после потери питания, потому что успешная транзакция должна успешно сбросить журнал повторов на диск.
И наконец, почему размер блока журнала повторов составляет 512 байт? потому что он пытается использовать атомарную запись на диск (размер сектора диска 512 байт) для ускорения и меньшего количества несоответствующих контрольных сумм. если диск не поддерживает атомарную запись 512 байт, это не имеет значения.