Va bene replicare il database `mysql`?


15

Quando ho originariamente impostato la mia replica da master a master, ho usato:

binlog-ignore-db=mysql

e ho sincronizzato manualmente gli account utente e le sovvenzioni. Questo è semplicemente come è stato fatto nel how-to che stavo usando in quel momento. Ma c'è qualche motivo per cui non dovrei rimuovere questa linea e consentire anche al mysqldatabase stesso di replicarsi?

In tal caso: prima di apportare la modifica, oltre a assicurarmi che tutte le sovvenzioni siano uguali su entrambi (o meglio affermato, che l'intero database mysql è identico), c'è qualcos'altro che dovrei ricontrollare o conoscere?


Negli ultimi 4,5 anni ho costantemente lottato con problemi di replica durante l'aggiornamento di mysql, anche su aggiornamenti minori. Il motivo è che apt-get upgrade(in realtà, lo script postinst mysql-server .deb) esegue ALTER TABLE useristruzioni che non possono essere replicate. Ho pubblicato una soluzione funzionante su serverfault.com/questions/686025/…
dlo

Risposte:


12

È del tutto possibile concederti le autorizzazioni mysql senza conoscere i comandi SQL GRANT .

Esempio: ecco come creare il tuo utente con tutti i privilegi usando SQL GRANT da qualsiasi luogo chiamato superdba con una password di ClarkKent:

GRANT ALL PRIVILEGES ON *.* TO superdba@'%' IDENTIFIED BY 'ClarkKent' WITH GRANT OPTION; 

Ecco come puoi farlo senza il comando GRANT:

Prima di tutto, ecco mysql.user per MySQL 5.1.51

mysql> desc mysql.user;
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Field                 | Type                              | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Host                  | char(60)                          | NO   | PRI |         |       |
| User                  | char(16)                          | NO   | PRI |         |       |
| Password              | char(41)                          | NO   |     |         |       |
| Select_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Insert_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Update_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Delete_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Create_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Drop_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Reload_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Shutdown_priv         | enum('N','Y')                     | NO   |     | N       |       |
| Process_priv          | enum('N','Y')                     | NO   |     | N       |       |
| File_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Grant_priv            | enum('N','Y')                     | NO   |     | N       |       |
| References_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Index_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Alter_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Show_db_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Super_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Create_tmp_table_priv | enum('N','Y')                     | NO   |     | N       |       |
| Lock_tables_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Execute_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Repl_slave_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Repl_client_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Create_view_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Show_view_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Create_routine_priv   | enum('N','Y')                     | NO   |     | N       |       |
| Alter_routine_priv    | enum('N','Y')                     | NO   |     | N       |       |
| Create_user_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Event_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Trigger_priv          | enum('N','Y')                     | NO   |     | N       |       |
| ssl_type              | enum('','ANY','X509','SPECIFIED') | NO   |     |         |       |
| ssl_cipher            | blob                              | NO   |     | NULL    |       |
| x509_issuer           | blob                              | NO   |     | NULL    |       |
| x509_subject          | blob                              | NO   |     | NULL    |       |
| max_questions         | int(11) unsigned                  | NO   |     | 0       |       |
| max_updates           | int(11) unsigned                  | NO   |     | 0       |       |
| max_connections       | int(11) unsigned                  | NO   |     | 0       |       |
| max_user_connections  | int(11) unsigned                  | NO   |     | 0       |       |
+-----------------------+-----------------------------------+------+-----+---------+-------+
39 rows in set (0.00 sec)

Basta eseguire questi comandi SQL:

INSERT INTO mysql.user SET
Host='%',User='superdba',Password=PASSWORD('ClarkKent'),
Select_priv='Y',Insert_priv='Y',Update_priv='Y',Delete_priv='Y',
Create_priv='Y',Drop_priv='Y',Reload_priv='Y',Shutdown_priv='Y',
Process_priv='Y',File_priv='Y',Grant_priv='Y',References_priv='Y',
Index_priv='Y',Alter_priv='Y',Show_db_priv='Y',Super_priv='Y',
Create_tmp_table_priv='Y',Lock_tables_priv='Y',Execute_priv='Y',
Repl_slave_priv='Y',Repl_client_priv='Y',Create_view_priv='Y',
Show_view_priv='Y',Create_routine_priv='Y',Alter_routine_priv='Y',
Create_user_priv='Y',Event_priv='Y',Trigger_priv='Y';
FLUSH PRIVILEGES;

INSERT è un'istruzione SQL legale che può atterrare in un registro binario. Vuoi che qualcuno lo esegua e abbia una password visibile che viaggi lungo la rete? sedere in un registro binario sul master? sedere in un registro a relè sullo slave?

Avere questa direttiva

binlog-ignore-db=mysql       

impedisce di concedere autorizzazioni mysql utilizzando tale SQL. Tuttavia, i GRANT non possono essere arrestati in questo modo. Pertanto, assicurati di eseguire sovvenzioni come questa:

SET SQL_LOG_BIN=0;
GRANT ...

per impedire ai GRANT di attraversare da padrone a schiavo.


Oh, aspetta ... Sono confuso: stai dicendo che le istruzioni GRANT si replicano indipendentemente da ciò che dice la conf binlog-ignore-db? So che se faccio un nuovo utente su un server, quell'utente non viene visualizzato sull'altro. Quindi forse vuoi dire che il GRANT viene trasmesso e memorizzato ma semplicemente non applicato allo slave?
dlo,

Le SOVVENZIONI vengono applicate senza blocchi stradali. Ecco perché è necessario eseguire SET SQL_LOG_BIN = 0; nella sessione mysql per impedire a qualsiasi comando GRANT di entrare nei registri binari.
RolandoMySQLDBA,

Le SOVVENZIONI vengono applicate senza blocchi stradali su master e slave. Ecco perché è necessario eseguire SET SQL_LOG_BIN = 0; nella sessione mysql per impedire a qualsiasi comando GRANT di entrare nei registri binari e di passare ai registri di inoltro dello slave.
RolandoMySQLDBA,

1
Ok. Solo per essere chiari per gli altri, credo che mi stai avvisando che GRANTS espone le password in transito (che possono essere indirizzate con il suggerimento SSL da Scott) e che vengono archiviate in chiaro nel binlog. Stai suggerendo che se queste sono preoccupazioni per me, allora dovrei usare sia binlog-ignore-db = mysql che SET SQL_LOG_BIN = 0 ;. Ma se sono d'accordo con queste condizioni, non c'è nessun problema particolare con la replica di GRANT rimuovendo la linea binlog-ignore-db. Correggimi se questo è un riepilogo impreciso.
dlo,

@dlo - Affermativo !!!
RolandoMySQLDBA,

4

Non ho avuto problemi con la replica del database mysql, ma ancora una volta, la mia infrastruttura si presta ad un ulteriore livello di sicurezza con firewall e dispositivi proxy dove è impossibile per chiunque altro che le persone dell'infrastruttura connettersi anche su una qualsiasi delle porte utilizzate da MySQL . Aggiunge un ulteriore livello di praticità sapendo che devi concedere le autorizzazioni una sola volta e averlo replicato. Quando si riduce ad esso, fintanto che hai impostato correttamente l'host in modo da non esporlo a nessuno diverso da quello previsto (ad es. Tu, lo schiavo, ecc ...), dovresti stare bene.

Se ti preoccupi eccessivamente delle intercettazioni man in the middle, c'è sempre la possibilità di inviare repliche su SSL .

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.