У меня есть 3-узловой кластер galera с несколькими сотнями баз данных, обслуживающих различных клиентов.
Я использую galera только как простой способ справиться с репликацией и падением. На самом деле я не использую сразу несколько мастеров.
Мне нужно запустить довольно дорогой ALTER для некоторых таблиц в каждой базе данных. Как правило, у меня есть сценарий, который запускает сценарий обновления для каждой базы данных, один за другим, и просто отключает каждый сайт по одному.
Но с этим кластером galera любой медленный DDL приводит к полной блокировке всех баз данных, а не только той, с которой он запущен. По сути, это означает, что всякий раз, когда мне нужно запустить обновление, все отключаются от сети на все время, необходимое мне, чтобы запустить обновление для всех.
Я знаю есть wsrep_OSU_method, но изменение этого параметра на RSU имеет собственные проблемы, и я не думаю, что это помогает.
Есть ли способ отключить блокировку? Или, по крайней мере, сделать его блокировкой на уровне базы данных, а не на уровне сервера?
Что, если бы я отключил другие мои узлы в кластере во время выполнения запроса - все равно это приведет к глобальной блокировке? Как я уже сказал, я на самом деле не использую несколько мастеров, поэтому в этом случае, если другие узлы отключены на несколько минут, это нормально (при условии, что происходит обычный автоматический процесс повторного присоединения, когда я их вернул).
Тебе повезло! Percona производит инструмент под названием pt-online-schema-change
как раз для такой ситуации.
pt-online-schema-change имитирует способ, которым MySQL изменяет таблицы внутренне, но работает с копией таблицы, которую вы хотите изменить. Это означает, что исходная таблица не заблокирована, и клиенты могут продолжать читать и изменять данные в ней.
pt-online-schema-change работает, создавая пустую копию таблицы для изменения, изменяя ее по желанию, а затем копируя строки из исходной таблицы в новую таблицу. Когда копия завершена, исходная таблица удаляется и заменяется новой. По умолчанию также удаляется исходная таблица.
Хотя он создан Percona, он работает с любым из основных вариантов MySQL.