Come si può impedire allo slave MySQL di replicare le modifiche al database "mysql"?


9

Ho il mio slave impostato per non replicare il database 'mysql' come descritto in questo 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

Ora, se vado sul server MASTER e lancio un GRANTe FLUSH PRIVILEGES:

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

Quindi torno al server SLAVE ed emetto:

SHOW GRANTS FOR `foo`@`localhost`;

e ricevi la risposta:

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

Come posso impedire allo slave di replicare le modifiche al database mysql? Ho pensato che 'replicate_ignore_db' sarebbe stato sufficiente.

Risposte:


8

Bene, dopo qualche ora in più di indagine, penso di averlo capito. Aggiungendo la mia risposta nel caso in cui ciò sia utile ad altri.

Secondo i documenti su replicate-ignore-db :

Replica basata su istruzioni. Indica al thread SQL slave di non replicare alcuna istruzione in cui il database predefinito (ovvero quello selezionato da USE) è nome_db.

Naturalmente, la replica basata su istruzioni è l'impostazione predefinita e ciò che stavo usando. Quindi ho fatto il tentativo di cambiare il formato riavviando il master con binlog_format=rowper vedere cosa sarebbe successo. Niente da fare. GRANTS e REVOKES erano ancora replicati.

Ulteriori indagini la documentazione sui cambiamenti di replica sul tavolo mysql rivelato

Le istruzioni che modificano indirettamente il database mysql vengono registrate come istruzioni indipendentemente dal valore di binlog_format. Ciò riguarda dichiarazioni come GRANT, REVOKE, SET PASSWORD, RENAME USER, CREATE (tutti i moduli tranne CREATE TABLE ... SELECT), ALTER (tutti i moduli) e DROP (tutti i moduli).

Gah! Ok, quindi ho controllato il binlog usando mysqlbinloge la mia GRANTdichiarazione non stava emettendo una USE mysqlchiamata al database (perché dovrebbe?). Quindi replicate-ignore-dbnon è possibile in buona coscienza ignorare l'affermazione.

La mia soluzione era di eliminare completamente le modifiche alla tabella mysql dal registro binario aggiungendo binlog-ignore-db=mysqla my.cnf e riavviando il server. Ha funzionato come un fascino.


Studia attentamente l'algoritmo se hai entrambe _do_e _ignore_clausole. Diventa complicato.
Rick James,

4

Il problema con la risposta di Derek Downey su questo post è che funzionerà sempre allo stesso modo (acceso o spento).

Se ti trovi in ​​una situazione in cui desideri replicare la maggior parte delle sovvenzioni, ma non questa, oppure non vuoi far rimbalzare mysql (necessario per caricare il file my.conf modificato), puoi farlo in questo modo:

SET session sql_log_bin = 0;

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

SET session sql_log_bin = 1;

Ricorda: l'ultima impostazione della riga sql_log_bin = 1è molto importante perché senza di essa non replicherai nulla.


2
quando si fa riferimento ad altre risposte, è necessario fare riferimento con il nome dell'utente che ha aggiunto la risposta anziché "la risposta sopra". L'ordine delle risposte cambia man mano che le risposte vengono votate su e giù, ecc.
Max Vernon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.