« MySQL/Réplication » : différence entre les versions

468 octets ajoutés ,  il y a 2 ans
m
<source> -> <syntaxhighlight> (phab:T237267)
m (typo)
m (<source> -> <syntaxhighlight> (phab:T237267))
 
Dans <code>/etc/mysql/my.cnf</code>, section <code>[mysqld]</code> :
* Définir un identifiant de serveur ; par exemple <code>1</code> :
<sourcesyntaxhighlight lang=bash>
server-id = 1
</syntaxhighlight>
</source>
* La réplication est basée sur les logs binaires, donc les activer :
<sourcesyntaxhighlight lang=bash>
log-bin
# ou log-bin = /var/log/mysql/mysql-bin.log
</syntaxhighlight>
</source>
 
Créer un nouvel utilisateur pour que le slave puisse se connecter :
<sourcesyntaxhighlight lang=sql>
CREATE USER 'myreplication';
SET PASSWORD FOR 'myreplication' = PASSWORD('mypass');
GRANT REPLICATION SLAVE ON *.* to 'myreplication';
</syntaxhighlight>
</source>
 
Vérifier l'identifiant de serveur :
<sourcesyntaxhighlight lang=sql>
SHOW VARIABLES LIKE 'server_id';
</syntaxhighlight>
</source>
 
=== Configuration de chaque slave ===
Dans <code>/etc/mysql/my.cnf</code>, section <code>[mysqld]</code> :
* Définir un identifiant de serveur différent du master et des autres slaves :
<sourcesyntaxhighlight lang=bash>
server-id = 2
</syntaxhighlight>
</source>
* Vérifier avec :
<sourcesyntaxhighlight lang=sql>
SHOW VARIABLES LIKE 'server_id';
</syntaxhighlight>
</source>
* Il est aussi possible de déclarer le nom de la machine slave dans le master (cf. <code>SHOW SLAVE HOSTS</code>) :
<sourcesyntaxhighlight lang=bash>
report-host=slave1
</syntaxhighlight>
</source>
Déclarer le master :
<sourcesyntaxhighlight lang=sql>
CHANGE MASTER TO MASTER_HOST='master_addr', MASTER_USER='myreplication', MASTER_PASSWORD='mypass';
</syntaxhighlight>
</source>
 
Si la réplication sert de backup, spécifier le point de départ :
<sourcesyntaxhighlight lang=sql>
MASTER_LOG_FILE='<binary_log_from_master>', MASTER_LOG_POS=<master_binary_log_position>;
</syntaxhighlight>
</source>
 
Démarrer la réplication :
<sourcesyntaxhighlight lang=sql>
START SLAVE;
</syntaxhighlight>
</source>
Cela va créer un fichier <code>master.info</code>, typiquement dans <code>/var/lib/mysql/master.info</code> ; contenant la configuration et le statut.
 
 
==== Sur le slave ====
<sourcesyntaxhighlight lang=sql>
SHOW SLAVE STATUS;
</syntaxhighlight>
</source>
Ou bien pour avoir un résultat formaté plus lisible :
<sourcesyntaxhighlight lang=sql>
SHOW SLAVE STATUS\G
</syntaxhighlight>
</source>
Exemple :
<sourcesyntaxhighlight lang=sql>
*************************** 1. row ***************************
Slave_IO_State:
Master_Port: 3306
...
</syntaxhighlight>
</source>
Vérifier en particulier :
<sourcesyntaxhighlight lang=sql>
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
</syntaxhighlight>
</source>
On peut supposer une nature réplication asynchrone :
<sourcesyntaxhighlight lang=sql>
Seconds_Behind_Master: 0
</syntaxhighlight>
</source>
Voir aussi :
<sourcesyntaxhighlight lang=sql>
mysql> SHOW GLOBAL VARIABLES LIKE "%SLAVE%";
</syntaxhighlight>
</source>
 
==== Sur le master ====
Vérifier les connexions des slaves :
<sourcesyntaxhighlight lang=sql>
mysql> SHOW PROCESSLIST\G
[...]
+-----------+---------+------+-------------------+-----------+
1 row in set (0.00 sec)
</syntaxhighlight>
</source>
 
=== Consistance ===
 
Dans ce cas, regarder la trace dans le log (généralement <code>/var/log/syslog</code>) :
<sourcesyntaxhighlight lang=bash>
Oct 15 21:11:19 builder mysqld[4266]: 101015 21:11:19 [ERROR] Slave: Error 'Table 'mybase.form'
doesn't exist' on query. Default database: 'mybase'. Query:
'INSERT INTO `form` (`form_id`,`timestamp`,`user_id`) VALUES ('abed',1287172429,0)',
Error_code: 1146
</syntaxhighlight>
</source>
La meilleure façon et de relancer la réplication entièrement.
 
On peut aussi tenter de réparer, par exemple faire sauter à MySQL la commande <code>1</code> :
<sourcesyntaxhighlight lang=sql>
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
</syntaxhighlight>
</source>
Attention en définissant ce nombre car il contient toutes les commandes, pas seulement les erreurs.
 
 
Pour supprimer une réplication :
<sourcesyntaxhighlight lang=sql>
mysql> RESET SLAVE;
</syntaxhighlight>
</source>
* MySQL met le slave en pause et remplace la configuration avec les valeurs par défaut. <code>master.info</code> est effacé.
* Relancer MySQL pour effacer toute la configuration.
 
Attention : <code>STOP SLAVE</code> arrêt la réplication. Elle peut être relancée manuellement ensuite, ou bien automatiquement lors de la relance du serveur MySQL. Pour éviter ce lancement automatique :
<sourcesyntaxhighlight lang=sql>
slave-skip-start
</syntaxhighlight>
</source>
 
Pour arrêter d'utiliser la réplication, vérifier que la configuration est bien vide :
<sourcesyntaxhighlight lang=sql>
mysql> SHOW SLAVE STATUS;
Empty set (0.00 sec)
</syntaxhighlight>
</source>
 
== Hints SQL ==
Sur MySQL 8<ref>https://dev.mysql.com/doc/refman/8.0/en/federated-create-server.html</ref> et sur MariaDB depuis la version 10.0<ref>https://mariadb.com/kb/en/federated-storage-engine/</ref>, une alternative à la réplication et au clustering existe. Il s'agit du moteur de stockage ''{{w|Federated}}'', qui permet de créer une table sur un serveur qui se synchronisent avec la même sur un autre.
 
<sourcesyntaxhighlight lang=mysql>
CREATE TABLE `ma_table_federee` (
`id` int(10) UNSIGNED NOT NULL
) ENGINE=FEDERATED DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci CONNECTION='mysql://mon_login:mon_mot_de_passe@ip_du_serveur:3306/ma_base/ma_table';
 
</syntaxhighlight>
</source>
 
=== CREATE SERVER ===
Pour éviter de définir le mot de passe du serveur distant dans la requête SQL, on peut utiliser :
<sourcesyntaxhighlight lang=mysql>
CREATE SERVER mon_serveur
FOREIGN DATA WRAPPER mysql
`id` int(10) UNSIGNED NOT NULL
) ENGINE=FEDERATED DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci CONNECTION='mon_serveur/ma_table';
</syntaxhighlight>
</source>
 
Ces serveurs sont stockés dans :
<sourcesyntaxhighlight lang=mysql>
select * from mysql.servers;
</syntaxhighlight>
</source>
 
Pour en supprimer un :
<sourcesyntaxhighlight lang=mysql>
DROP SERVER mon_serveur;
</syntaxhighlight>
</source>
 
== Partitionnement ==
1 535

modifications