15 votes

Est-il possible de reproduire la base de données `mysql` ?

Quand j'ai initialement configuré ma réplication maître-maître, j'ai utilisé :

binlog-ignore-db=mysql

et j'ai synchronisé manuellement les comptes d'utilisateurs et les autorisations. C'est simplement comme ça que ça a été fait dans le tutoriel que j'utilisais à l'époque. Mais y a-t-il une raison pour laquelle je ne devrais pas supprimer cette ligne et permettre à la base de données mysql de se répliquer elle-même?

Si c'est le cas : Avant que je fasse le changement, en plus de m'assurer que toutes les autorisations sont les mêmes des deux côtés (ou mieux dit, que l'intégralité de la base de données mysql est identique), y a-t-il autre chose que je devrais vérifier en double ou dont je devrais être conscient?

0 votes

Au cours des 4,5 dernières années, j'ai constamment eu du mal avec les problèmes de réplication lors de la mise à niveau de MySQL, même pour des mises à jour mineures. La raison est que apt-get upgrade (en fait, le script postinst du paquet mysql-server .deb) exécute des déclarations ALTER TABLE user qui ne peuvent pas être répliquées. J'ai posté une solution fonctionnelle sur serverfault.com/questions/686025/…

12voto

Adam Points 11

Il est tout à fait possible de vous donner des autorisations mysql sans connaître les commandes SQL GRANT.

Exemple : Voici comment créer votre propre utilisateur avec tous les privilèges en utilisant SQL GRANT depuis n'importe où, appelé superdba avec un mot de passe de ClarkKent :

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

Voici comment vous pouvez le faire sans la commande GRANT :

Tout d'abord, voici mysql.user pour 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)

Il suffit d'exécuter ces commandes 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;

Cet INSERT est une déclaration SQL légale qui peut atterrir dans un journal binaire. Voulez-vous que quelqu'un exécute cela et qu'un mot de passe soit visible lors des transferts sur le réseau ? qu'il reste dans un journal binaire sur le maître ? qu'il reste dans un journal relais sur l'esclave ?

Avoir cette directive

binlog-ignore-db=mysql       

empêche de donner des autorisations mysql en utilisant de telles commandes SQL. Cependant, les GRANTs ne peuvent pas être arrêtés de cette manière. Par conséquent, assurez-vous de réaliser des accords de cette manière :

SET SQL_LOG_BIN=0;
GRANT ...

pour empêcher les GRANTs de traverser du maître à l'esclave.

0 votes

Oh, attendez... Je suis confuse : Vous dites que les déclarations GRANT se répliquent quoi qu'il arrive, peu importe la configuration binlog-ignore-db ? Je sais que si je crée un nouvel utilisateur sur un serveur, cet utilisateur n'apparaît pas sur l'autre. Peut-être voulez-vous dire que le GRANT est transmis et stocké mais simplement non appliqué sur l'esclave ?

0 votes

Les SUBVENTIONS sont appliquées sans aucun obstacle. C'est pourquoi vous devez exécuter SET SQL_LOG_BIN=0; dans la session mysql pour empêcher que les commandes de SUBVENTION n'entrent dans les journaux binaires.

0 votes

Les SUBVENTIONS sont appliquées sans aucun obstacle sur le maître et l'esclave. C'est pourquoi vous devez exécuter SET SQL_LOG_BIN=0; dans la session mysql pour empêcher que des commandes GRANT n'entrent dans les journaux binaires et se propagent vers les journaux de relais de l'esclave.

4voto

Scott Points 397

Je n'ai eu aucun problème à répliquer la base de données mysql, mais encore une fois, mon infrastructure prête à un niveau supplémentaire de sécurité avec des pare-feu et des appareils proxy où il est impossible pour quiconque autre que les gens de l'infrastructure de se connecter même sur l'un des ports utilisés par MySQL. Cela ajoute un niveau de commodité supplémentaire en sachant que vous n'avez qu'à accorder les permissions une fois et les faire répliquer. En fin de compte, tant que vous avez correctement défini l'hôte de manière à ne pas l'exposer à quiconque autre que prévu (par exemple, vous, l'esclave, etc...), vous devriez être bien.

Si vous êtes trop préoccupé par les interceptions de l'homme du milieu, il y a toujours l'option d'envoyer la réplication via SSL.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X