Пожалуйста, помогите мне понять, почему требуется блокировка READ для обеспечения согласованности данных, а резервное копирование с помощью таблиц MyISAM и таблиц InnoDB не требует блокировки READ при резервном копировании.Почему MyISAM требует блокировки чтения при резервном копировании и Innodb не
ответ
Причина этой разницы в том, что у myisam нет ни транзакций, ни блокировки уровня строки. Доступна только блокировка на уровне таблицы. Хотя innodb поддерживает как транзакции, так и блокировки на уровне строк, предлагает альтернативу блокировке таблиц. Тем не менее, вы можете выбрать, чтобы читать таблицы блокировки innodb перед их поддержкой, это зависит от вас.
Как туздо руководство по backup methods говорит на MyISAM:
FLUSH TABLES tbl_list WITH READ LOCK;
Вам нужна только блокировка чтения; это позволяет другим клиентам продолжить до запрашивать таблицы при копировании файлов в каталог базы данных . Флеш необходим для того, чтобы все активные индексные страницы записывались на диск перед началом резервного копирования.
На innodb вам не нужно блокировать всю таблицу, чтобы получить последовательное считывание данных, потому что в режиме изоляции транзакции и использовании одной транзакции это обеспечивается движком innodb. Результат будет таким же, как если бы вы заблокировали таблицу, но у вас есть лучший параллелизм.
Опять же, выше, связанная документация объясняет:
Для таблиц InnoDB, можно выполнить онлайновое резервное копирование, который не имеет блокировок таблиц, используя опцию --single-транзакции MySQLDump.
Документация по выбору одной транзакции содержит более подробную информацию:
Этот параметр задает режим изоляции транзакций в REPEATABLE READ и посылает START TRANSACTION заявление SQL на сервер перед сбросом данных. Он полезен только для транзакционных таблиц, таких как InnoDB, потому что тогда он выгружает согласованное состояние базы данных в то время, когда выдается START TRANSACTION без блокировки каких-либо приложений.
При использовании этой опции вы должны иметь в виду, что только таблицы InnoDB сбрасываются в согласованном состоянии. Например, любые таблицы MyISAM или MEMORY, сбрасываемые при использовании этой опции, могут по-прежнему изменять состояние.
Хотя свалка --single-транзакция находится в процессе, чтобы обеспечить правильный файл дампа (содержимое правильно таблицы и двоичные координаты журнала), не другого соединения следует использовать следующие операторы: ALTER TABLE, CREATE TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE. Согласованное чтение не изолировано от этих утверждений, поэтому использование их в таблице , подлежащей удалению, может привести к тому, что SELECT, выполняемый mysqldump, до , извлекает содержимое таблицы для получения неправильного содержимого или сбоя.
Это я понимаю, что отдельные транзакции отправляют сигнал начала транзакции, и ничего не будет сделано до завершения резервного копирования. Но что означает ПОВТОРНОЕ ПРОЧИТАНИЕ? – coder
Это режим изоляции транзакций, его имя очень наглядное. Вы можете найти все подробности в онлайн-документации mysql на этом и других уровнях изоляции. – Shadow
MVCC сообщает, что старые копии записей должны быть _preserved_ до завершения транзакции. Он не говорит «ничего не будет» до тех пор, пока ... ». –
Поскольку MyISAM кодируется таким образом, а InnoDB - нет. Эти два двигателя сильно отличаются друг от друга. – Mjh