У меня есть простая установка 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] на каждом раб. Я предпочитаю фильтрацию на ведомых устройствах, потому что изменения в двоичных журналах ведущего устройства могут иметь потенциальную ценность для устранения неполадок в будущем.