Как вы можете остановить MySQL Slave от репликации изменений в базу данных «MySQL»?

9

Мой подчиненный настроен так, чтобы не реплицировать базу данных mysql, как описано в этом SHOW SLAVE STATUS\G;

           Slave_IO_State: Waiting for master to send event
              Master_Host: 127.0.0.1
              Master_User: replication
              Master_Port: 3306
            Connect_Retry: 60
          Master_Log_File: master-bin.000001
      Read_Master_Log_Pos: 1660
           Relay_Log_File: mysql-relay-bin.000004
            Relay_Log_Pos: 478
    Relay_Master_Log_File: master-bin.000001
         Slave_IO_Running: Yes
        Slave_SQL_Running: Yes
          Replicate_Do_DB: 
      **Replicate_Ignore_DB: mysql**
       Replicate_Do_Table: 
   Replicate_Ignore_Table: 
  Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
               Last_Errno: 0
               Last_Error: 
             Skip_Counter: 0
      Exec_Master_Log_Pos: 1660
          Relay_Log_Space: 633
          Until_Condition: None
           Until_Log_File: 
            Until_Log_Pos: 0

Теперь, если я иду на сервер MASTER и выдаю GRANTи FLUSH PRIVILEGES:

GRANT SELECT ON *.* TO `foo`@`localhost` IDENTIFIED BY 'bar';
FLUSH PRIVILEGES;

Затем я возвращаюсь на SLAVE- сервер и выдаю:

SHOW GRANTS FOR `foo`@`localhost`;

и получите ответ:

+-------------------------------------------------------------------------------------------------------------+
| Grants for foo@localhost                                                                                    |
+-------------------------------------------------------------------------------------------------------------+
| GRANT SELECT ON *.* TO 'foo'@'localhost' IDENTIFIED BY PASSWORD '*E8D46CE25265E545D225A8A6F1BAF642FEBEE5CB' |
+-------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Как я могу остановить подчиненное устройство от репликации изменений базы данных MySQL? Я подумал, что «replicate_ignore_db» будет достаточно.

Дерек Дауни
источник

Ответы:

8

Хорошо, после нескольких часов расследования, я думаю, я понял это. Добавление моего ответа на случай, если это пригодится другим.

Согласно документации на replicate-ignore-db :

Репликация на основе операторов. Говорит подчиненному потоку SQL не реплицировать никакие операторы, где база данных по умолчанию (то есть база данных, выбранная USE) - db_name.

Конечно, репликация на основе выписок по умолчанию и то, что я использовал. Поэтому я попытался изменить формат, перезапустив мастер, binlog_format=rowчтобы посмотреть, что произойдет. Нет кости. ГРАНТЫ и аннулирует все еще были воспроизведены.

Дальнейшее изучение документов по изменениям репликации в таблице MySQL выявило

Операторы, которые изменяют базу данных mysql косвенно, регистрируются как операторы независимо от значения binlog_format. Это относится к таким операторам, как GRANT, REVOKE, SET PASSWORD, RENAME USER, CREATE (все формы, кроме CREATE TABLE ... SELECT), ALTER (все формы) и DROP (все формы).

Г! Итак, я проверил использование binlog, mysqlbinlogи в моем GRANTзаявлении не было вызова USE mysqlбазы данных (зачем это нужно?). Поэтому replicate-ignore-dbне мог с чистой совестью игнорировать это утверждение.

Мое решение было вырезать изменения в тузде таблицу из бинарного журнала полностью путем добавления binlog-ignore-db=mysqlк my.cnf и перезапустить сервер. Работал как шарм.

Дерек Дауни
источник
Внимательно изучите алгоритм, если у вас есть _do_и _ignore_пункты, и пункты. Это становится сложно.
Рик Джеймс
4

Проблема с ответом Дерека Дауни на этот пост заключается в том, что он всегда будет работать одинаково (включено или выключено).

Если вы находитесь в ситуации, когда вы хотите, чтобы большинство грантов реплицировались, но не этот - или вы не хотите отказов mysql (необходимо загрузить измененный файл my.conf), вы можете сделать это следующим образом:

SET session sql_log_bin = 0;

GRANT SELECT ON *.* TO `foo`@`localhost` IDENTIFIED BY 'bar';

SET session sql_log_bin = 1;

Пожалуйста, помните - последняя настройка строки sql_log_bin = 1очень важна, потому что без нее вы ничего не будете копировать.

user13170
источник
2
При ссылке на другие ответы, вы должны ссылаться на имя пользователя, который добавил ответ вместо «ответ выше». Порядок ответов меняется по мере того, как голосуются за и против и т. Д.
Макс Вернон,