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.
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.
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.