web-dev-qa-db-fra.com

Comment arrêter l'esclave MySQL de répliquer les modifications apportées à la base de données 'mysql'?

J'ai mon esclave réglé pour ne pas reproduire la base de données "mysql" comme décrit dans cette 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

Maintenant, si j'y vais au [~ # ~ # ~] [~ # ~] serveur et émettez un GRANT et FLUSH PRIVILEGES:

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

Je retourne ensuite à la [~ # ~] esclave [~ # ~ # ~] serveur et numéro:

SHOW GRANTS FOR `foo`@`localhost`;

et recevoir la réponse:

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

Comment puis-je arrêter l'esclave de répliquer les modifications de la base de données MySQL? Je pensais que "Replate_ignore_DB" aurait suffi.

9
Derek Downey

D'accord, après quelques heures supplémentaires d'enquête, je pense que je l'ai compris. Ajout de ma réponse au cas où cela est utile pour les autres.

Selon le Docs sur Replicat-Ignore-DB :

Réplication basée sur l'instruction. indique le fil esclave SQL de ne pas reproduire aucune déclaration dans laquelle la base de données par défaut (c'est-à-dire celle sélectionnée par l'utilisation) est db_name.

Bien entendu, la réplication basée sur la déclaration est la valeur par défaut et ce que j'utilisais. J'ai donc fait la tentative de changer le format en redémarrant le maître avec binlog_format=row Pour voir ce qui se passerait. Pas de dé. [~ # ~] subve [~ # ~ ~] et [~ # ~] révoque [~ # ~ # ~] toujours répliqué.

Une enquête plus approfondie sur la DOCS sur la réplication change sur la table MySQL révélée

Des déclarations qui modifient indirectement la base de données MySQL sont connectées en tant que relevés indépendamment de la valeur de Binlog_Format. Cela concerne des déclarations telles que la subvention, révoquer, définir le mot de passe, renommer l'utilisateur, créer (tous les formulaires sauf Créer une table ... Sélectionnez), Alter (tous les formulaires) et Drop (tous les formulaires).

Gah! OK, alors j'ai vérifié le binlog en utilisant mysqlbinlog _ et mon énoncé GRANT n'émettait pas un USE mysql Appel de base de données (pourquoi devrait-il?). Alors replicate-ignore-db ne pouvait pas en bonne conscience ignorer la déclaration.

Ma solution consistait à réduire les modifications apportées au MySQL Tableau hors du journal binaire complètement en ajoutant binlog-ignore-db=mysql to my.cnf et redémarrez le serveur. Travaillé comme un charme.

8
Derek Downey

Le problème avec Réponse de Derek Downey sur ce poste Est-ce que cela fonctionnera toujours de la même manière (ON ou OFF).

Si vous êtes dans une situation où vous souhaitez que la plupart des subventions soit répliquée, mais pas celle-ci - ou vous ne voulez pas rebondir MySQL (nécessaire pour charger le fichier My.conf modifié), vous pouvez le faire de cette façon:

SET session sql_log_bin = 0;

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

SET session sql_log_bin = 1;

S'il vous plaît rappelez-vous - cette dernière ligne réglage sql_log_bin = 1 est très important car sans cela, vous ne répliquez rien.

4
user13170