--single -action - параметры блокировки таблиц mysqldump - что происходит внутри? - PullRequest
2 голосов
/ 03 октября 2009

Я нашел другие посты, похожие на это, но хотел немного больше информации об этих опциях mysqldump. Я понял, что --single -action и --lock-таблицы являются взаимоисключающими операциями. Ниже приведены мои вопросы относительно этих опций.

a) Предположим, я выбрал опцию --lock-tables. В этом случае mysqldump получает блокировку чтения для всех таблиц. Таким образом, любой другой процесс, пытающийся записать данные в таблицы, перейдет в состояние блокировки (ожидания). Но если mysqldump займет действительно много времени, будут ли процессы, которые ожидают, продолжать ждать бесконечно?

Я попробовал этот эксперимент для примера - у меня есть программа Java (JDBC), пишущая в таблицу базы данных mysql с именем MY_TEST. Я вошел в консоль mysql и выдал «LOCK TABLES MY_TEST READ;» Команда вручную. Таким образом, Java-процесс заблокирован в ожидании снятия блокировки. Мой вопрос: будет ли время ожидания соединения или такая проблема, если блокировка чтения не будет снята в течение длительного времени? Я ждал две минуты и не заметил никакой ошибки, и процесс java продолжился нормально после снятия блокировки с помощью команды «UNLOCK tables». Это специфическое поведение для драйвера Java MySQL или я могу ожидать то же самое от программы на C, использующей драйвер MySQL?

b) Мой второй вопрос касается опции --single -action. Предположим, у меня есть 10 таблиц InnoDB, из которых 3 таблицы связаны друг с другом (с использованием FK), а другие независимы, но все еще используют движок InnoDB. Применяется ли отдельная транзакция только к 3 таблицам, которые связаны между собой с помощью FK? или могу ли я ожидать, что состояние 7 независимых таблиц будет точно таким, каким оно было при сбросе 3 взаимозависимых таблиц.

1 Ответ

3 голосов
/ 05 октября 2009

a.) Я полагаю, что ответ - да, на уровне mysql соединения будут бесконечно долго ждать, пока mysqldump освободит блокировки таблицы. Вы можете немного контролировать это на уровне приложения, используя пул соединений с запросом проверки, который запрашивает блокировку таблиц и устанавливая тайм-аут для извлечения того, что вы хотите. Это было бы довольно легко сделать в c3p0, например. Однако в отсутствие другой информации я бы не рекомендовал такой подход; это кажется довольно грязным. Я не использовал драйвер mysql C, поэтому я не могу этого сделать наверняка, но я бы предположил, что поведение аналогично Java. Все это является причиной того, что mysqldump не является хорошим вариантом для оперативного резервного копирования систем с нетривиальными объемами данных и активностью.

б. Все дампированные таблицы будут выгружены как часть одной транзакции, что даст согласованный снимок для всех таблиц, участвующих в дампе. Отношения первичного и внешнего ключей не будут иметь отношения к транзакции. Использование одной транзакции является жизнеспособным вариантом для оперативного резервного копирования.

...