¿Está bien replicar la base de datos `mysql`?

15

Cuando configuré originalmente mi replicación de maestro a maestro, usé:

binlog-ignore-db=mysql

y he estado sincronizando las cuentas de usuario y las subvenciones manualmente Esto es simplemente cómo se hizo en el tutorial que estaba usando en ese momento. Pero, ¿hay alguna razón por la que no deba eliminar esta línea y permitir que la mysqlbase de datos misma se replique también?

Si es así: antes de realizar el cambio, además de asegurarme de que todas las subvenciones sean iguales en ambos (o mejor dicho, que toda la base de datos mysql es idéntica), ¿hay algo más que deba verificar o tener en cuenta?

dlo
fuente
En los últimos 4.5 años, he luchado constantemente con problemas de replicación al actualizar mysql, incluso en actualizaciones menores. La razón es que apt-get upgrade(en realidad, el script postinst de mysql-server .deb) ejecuta ALTER TABLE userdeclaraciones que no se pueden replicar. Publiqué
dlo

Respuestas:

12

Es completamente posible otorgarse permisos mysql sin conocer los comandos SQL GRANT .

Ejemplo: Aquí es para crear su propio usuario con todos los privilegios utilizando SQL GRANT desde cualquier lugar llamado superdba con una contraseña de ClarkKent:

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

Aquí es cómo puede hacer esto sin el comando GRANT:

En primer lugar, aquí está mysql.user para 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)

Simplemente ejecute estos comandos 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;

Ese INSERT es una declaración SQL legal que puede aterrizar en un registro binario. ¿Desea que alguien ejecute esto y que una contraseña visible viaje por la red? sentarse en un registro binario en el maestro? sentarse en un registro de retransmisión en el esclavo?

Tener esta directiva

binlog-ignore-db=mysql       

evita regalar permisos mysql usando tal SQL. Sin embargo, las CONCESIONES no se pueden detener de esta manera. Por lo tanto, asegúrese de realizar subvenciones como esta:

SET SQL_LOG_BIN=0;
GRANT ...

para evitar que las CONCESIONES atraviesen de maestro a esclavo.

RolandoMySQLDBA
fuente
Oh, espera ... Estoy confundido: ¿Estás diciendo que las declaraciones GRANT se replican sin importar lo que diga binlog-ignore-db conf? Sé que si hago un nuevo usuario en un servidor, ese usuario no aparecerá en el otro. Entonces, ¿tal vez quiere decir que el GRANT se transmite y almacena pero simplemente no se aplica al esclavo?
dlo
Las SUBVENCIONES se aplican sin bloqueos de carreteras. Es por eso que debe ejecutar SET SQL_LOG_BIN = 0; en la sesión mysql para evitar que cualquier comando GRANT ingrese a los registros binarios.
RolandoMySQLDBA
Las SUBVENCIONES se aplican sin obstáculos en el maestro y el esclavo. Es por eso que debe ejecutar SET SQL_LOG_BIN = 0; en la sesión mysql para evitar que cualquier comando GRANT ingrese a los registros binarios y atraviese los registros de retransmisión del esclavo.
RolandoMySQLDBA
1
Okay. Solo para que quede claro para los demás, creo que me está advirtiendo sobre GRANTS que exponen contraseñas en tránsito (que Scott puede abordar con la sugerencia SSL de Scott) y que se almacenan en texto sin formato en el binlog. Está sugiriendo que si eso me preocupa, entonces debería usar binlog-ignore-db = mysql y SET SQL_LOG_BIN = 0 ;. Pero si estoy de acuerdo con esas condiciones, no hay ningún problema particular con la replicación de GRANT eliminando la línea binlog-ignore-db. Corrígeme si este es un resumen inexacto.
dlo
@dlo - ¡Afirmativo!
RolandoMySQLDBA
4

No he tenido problemas con la replicación de la base de datos mysql, pero, una vez más, mi infraestructura se presta a un nivel adicional de seguridad con firewalls y dispositivos proxy donde es imposible que nadie más que la gente de la infraestructura se conecte a cualquiera de los puertos que usa MySQL . Agrega un nivel adicional de conveniencia sabiendo que solo tiene que otorgar permisos una vez y replicarlo. Cuando se reduce a eso, siempre y cuando haya configurado correctamente el host para que no lo exponga a nadie más que lo previsto (por ejemplo, usted, el esclavo, etc.), debería estar bien.

Si está demasiado preocupado con el hombre en las intercepciones intermedias, siempre existe la opción de enviar la replicación a través de SSL .

Scott
fuente