Как получить корректный дамп с помощью mysqldump и единственную транзакцию, когда DDL используется одновременно?

recur(98)
    print "a=98"
    recur(99)
        print "a=99"
        recur(100)
            print "a=100"
            recur(101)
                do nothing
            print "a=101" // that's the value of a in recur(100) after being incremented once
        print "a=100" // that's the value of a in recur(99) after being incremented once
    print "a=99" // that's the value of a in recur(98) after being incremented once

Чего вам не хватает, так это того, что a является локальной переменной, что означает, что каждое выполнение recur() имеет свою собственную копию этой переменной, и изменение значения в одном выполнении не влияет на значение локальной переменной других исполнений.

6
задан Eddie 1 March 2009 в 01:42
поделиться

1 ответ

Открытый a mysql командное окно и дает эту команду:

mysql> FLUSH TABLES WITH READ LOCK;

Это заблокирует все таблицы во всех базах данных по этому экземпляру MySQL, пока Вы не выйдете UNLOCK TABLES (или завершите соединение клиента, которое содержит эти блокировки чтения).

Для подтверждения этого можно открыть другое командное окно и попытаться сделать ALTER, DROP, RENAME или TRUNCATE. Эти команды зависают, ожидая блокировки чтения, которая будет выпущена. Ctrl-C хита для завершения ожидания.

Но в то время как таблицы имеют блокировку чтения, можно все еще выполнить a mysqldump резервное копирование.

FLUSH TABLES WITH READ LOCK команда может совпасть с использованием --lock-all-tables опция mysqldump. Это не полностью ясно, но этот документ, кажется, поддерживает его:

Другое использование для РАЗБЛОКИРОВАЛО ТАБЛИЦЫ, должен выпустить глобальную блокировку чтения, полученную с ТАБЛИЦАМИ СБРОСА С БЛОКИРОВКОЙ ЧТЕНИЯ.

Оба FLUSH TABLES WITH READ LOCK и --lock-all-tables используйте фразу "глобальная блокировка чтения", таким образом, я думаю, что вероятно, что они делают то же самое. Поэтому необходимо смочь использовать ту опцию для mysqldump и защитите от параллельного, ИЗМЕНЯЮТ, ОТБРАСЫВАЮТ, ПЕРЕИМЕНОВЫВАЮТ, и УСЕЧЕННЫЙ.


Ре. Ваш комментарий: следующее от Guilhem Bichot в журнале ошибки MySQL, с которым Вы связались:

Привет. - lock-all-tables называет ТАБЛИЦЫ СБРОСА С БЛОКИРОВКОЙ ЧТЕНИЯ. Таким образом это, как ожидают, заблокируется, ИЗМЕНЯЮТ, ОТБРАСЫВАЮТ, ПЕРЕИМЕНОВЫВАЮТ, или УСЕЧЕННЫЙ (если нет ошибка, или я неправ). Однако - lock-all-tables - единственная транзакция не может работать (mysqldump, бросает сообщение об ошибке): потому что lock-all-tables блокирует все таблицы сервера против записей на время резервного копирования, тогда как единственная транзакция предназначается, чтобы позволить записям произойти во время резервного копирования (при помощи ВЫБОРА последовательного чтения в транзакции), они являются несовместимыми по своей природе.

От этого это кажется, что Вы не можете получить параллельный доступ во время резервного копирования, и одновременно блок ИЗМЕНЯЕТ, ОТБРАСЫВАЕТ, ПЕРЕИМЕНОВЫВАЕТ и УСЕКАЕТ.

8
ответ дан 9 December 2019 в 22:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: