Назад | Перейти на главную страницу

Ошибка репликации MySQL при изменении `mysql`.`user`

У меня есть простая установка master-slave с MySQL 5.6, которая продолжает давать сбой всякий раз, когда я вношу изменения в таблицу mysql.user. Мастер настроен на репликацию двух баз данных, ни одна из которых не является базой данных mysql. Для binlog_format установлено значение ROW.

У меня есть несколько пользователей MySQL, настроенных на ведущем устройстве, чтобы разные коллеги могли вносить изменения в базу данных, но на ведомом устройстве у меня есть только один пользователь, которым является веб-сервер.

Когда я попытался удалить избыточного пользователя с главного устройства, подчиненное устройство не удалось со следующим сообщением:

Error 'Operation DROP USER failed for 'mysql_user'@'localhost'' on query. Default database: ''. Query: 'DROP USER 'mysql_user'@'localhost''

Я не хочу постоянно пропускать ошибки, потому что время от времени я буду вносить изменения в таблицу mysql.user, и легко забыть проверить, идет ли репликация. У меня нет никаких настроек мониторинга репликации, поэтому пару раз я вносил изменения в таблицу mysql, и в течение пары часов никто не замечал, что влияет на наш производственный веб-сервер.

Любая помощь очень ценится.

Обратите внимание на часть сообщения об ошибке: 'mysql_user'@'localhost''

После localhost слово. Когда этот оператор реплицируется, подчиненный сервер базы данных не может найти пользователя, и репликация останавливается. MySQL 5.7 имеет DROP USER IF EXISTS user форма, но в MySQL 5.6 вам лучше не делать таких ошибок или предпочесть прямое редактирование базы данных mysql.

ОБНОВЛЕНИЕ: если вы не заинтересованы в репликации учетных записей MySQL с главного сервера на подчиненные, вы можете добавить replicate-ignore-db=mysql в разделы [mysqld] на каждом раб. Я предпочитаю фильтрацию на ведомых устройствах, потому что изменения в двоичных журналах ведущего устройства могут иметь потенциальную ценность для устранения неполадок в будущем.