From 588dd1727c9a03d7d1efe214080f5ceddf662aa2 Mon Sep 17 00:00:00 2001 From: btatu Date: Wed, 11 May 2022 10:39:42 +0200 Subject: [PATCH] =?UTF-8?q?concision=20+=20mise=20=C3=A0=20jour=20chemin?= =?UTF-8?q?=20de=20conf=20dans=20mariadb.conf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HowtoMySQL.md | 94 ++++++++++++++++++++------------------------------- 1 file changed, 37 insertions(+), 57 deletions(-) diff --git a/HowtoMySQL.md b/HowtoMySQL.md index b3d583ea..d06746c8 100644 --- a/HowtoMySQL.md +++ b/HowtoMySQL.md @@ -1521,47 +1521,41 @@ mysql> SET sql_log_bin = 0; ## Multiples instances MySQL -Il est possible de faire fonctionner plusieurs instances de MySQL sur un serveur ; chacune avec ses propres données, sa propre configuration et son utilisateur dédié. +Il est possible de faire fonctionner plusieurs instances de MySQL sur un serveur où chacune à ses propres données, sa propre configuration et son utilisateur dédié. +> On préfère utiliser le port 3307 pour la première instance afin de ne pas confondre une configuration avec et sans instance. ### Installation -Avant toute opération, **il est nécessaire de commenter cette ligne** dans le `/etc/mysql/my.cnf` : +Pour éviter l'héritage de paramètres issue de l'instance principale, **il est nécessaire de commenter cette ligne** dans le `/etc/mysql/my.cnf` : ~~~{.ini} #user = mysql ~~~ -Et de rajouter ces lignes dans `/etc/mysql/conf.d/50-multi.cnf` : +Ainsi que rajouter ces lignes dans `/etc/mysql/conf.d/50-multi.cnf` : ~~~{.ini} [mysqld_multi] user = mysqladmin ~~~ -Créer un utilisateur pour l'instance (il doit avoir un shell valide comme `/bin/sh`) : +Créer un utilisateur dédié pour l'instance : ~~~ # useradd mysqld1 ~~~ -Créer le dossier qui va accueillir le *datadir* et donner les bons droits : +Créer les dossiers qui vont accueillir le *datadir* et les données temporaire avec les bons droits : ~~~ -# mkdir -p /srv/mysqld_instances/mysqld1 +# mkdir -vp /srv/mysqld_instances/mysqld1 /home/mysqld1-tmp # touch /var/log/mysqld1.log # chmod 755 /srv /srv/mysqld_instances -# chown -R mysqld1:mysqld1 /srv/mysqld_instances/mysqld1 /var/log/mysqld1.log +# chown -R mysqld1:mysqld1 /srv/mysqld_instances/mysqld1 /home/mysqld1-tmp /var/log/mysqld1.log ~~~ -Créer un repertoire temporaire dédié à cette instance : - -~~~ -# mkdir /home/mysqld1-tmp -# chown mysqld1:mysqld1 /home/mysqld1-tmp -~~~ - -Ajouter ces lignes dans `/etc/mysql/conf.d/zzz_mysqld1.cnf` : +Ajouter ces lignes dans `/etc/mysql/mariadb.conf.d/zzz_mysqld1.cnf` : ~~~{.ini} [mysqld1] @@ -1574,30 +1568,28 @@ datadir = /srv/mysqld_instances/mysqld1 log_error = /var/log/mysqld1.log ~~~ +L'ajout de ces directives permet de désactiver l'héritage des valeurs issue de l'instance principale : + +~~~{.ini} +skip-slave-start +log_bin = 0 +slow_query_log = 0 +~~~ + Ajuster les permissions du fichier de configuration : ~~~ # chmod 644 /etc/mysql/conf.d/zzz_mysqld1.cnf ~~~ -Créer ensuite le *datadir* : +Créer manuellement le *datadir* : ~~~ -# mysql_install_db --user=mysqld1 --datadir=/srv/mysqld_instances/mysqld1 --defaults-file=/etc/mysql/mariadb.conf.d/zzz-mysqld1.cnf +# mysql_install_db --user=mysqld1 --datadir=/srv/mysqld_instances/mysqld1 --defaults-file=/etc/mysql/mariadb.conf.d/zzz_mysqld1.cnf # chmod 700 /srv/mysqld_instances/mysqld1 ~~~ -> *Note 1* : même si l'on ne prévoit pas de faire tourner le mysqld principal sur le port 3306, -on préfère tout de même utiliser le port 3307 pour la première instance afin de ne pas -confondre une configuration avec et sans instance. - -> *Note 2* : dans le cas où une réplication est déjà active sur l'instance principale, la nouvelle instance créée va automatiquement hériter des paramètres de réplication. -Pour éviter ça, il suffit de rajouter : - -~~~{.ini} -[mysqld1] -skip-slave-start -~~~ +### Démarrer une instance avec systemd On créé une unité systemd multi-instances pour mysql dans `/etc/systemd/system/mysqld@.service` @@ -1622,19 +1614,14 @@ RuntimeDirectory=mysqld%i WantedBy=multi-user.target ~~~ -On recharge le daemon systemd pour que l'unité soit prise en compte : +On recharge le daemon systemd pour que l'unité soit prise en compte et on lance la nouvelle instance dont le "1" est une sorte d'alias de mysqld**1** : ~~~ # systemctl daemon-reload -~~~ - -Puis lancer la nouvelle instance : - -~~~ # systemctl start mysqld@1 ~~~ -On peut voir le status de l'instance comme une unité systemd classique avec : +On s'assure qu'elle fonctionne bien : ~~~ # systemctl status mysqld@1 @@ -1657,40 +1644,33 @@ août 18 15:49:27 huit mysqld_multi[16403]: 2020-08-18 15:49:27 0 [Note] /usr/sb août 18 15:49:27 huit systemd[1]: Started MySQL Multi Server for instance 1. ~~~ -"1" est une sorte d'alias de mysqld**1** +> Pour stopper une instance, on évite la commande « mysqld_multi stop 1 » qui n'est pas assez fiable et peut laisser l'instance dans un état incorrect, difficile à récupérer. -Enfin, n'oubliez pas de définir un mot de passe root/mysqladmin pour la nouvelle instance ! - -Pour se conneter à la nouvelle instance, il faut utilisé la socket, par exemple : - -~~~ -# mysql -P3307 --socket=/var/run/mysqld1/mysqld1.sock -u root -p -~~~ - -**N'oubliez pas de mettre un mot de passe, ou supprimer l'utilisateur root et le remplacer par un utilisateur mysqladmin**, de la même manière quand dans une installation mono-instances : [HowtoMySQL#installation](). - -Et pour stopper une instance, on évite la commande « mysqld_multi stop 1 » qui n'est que rarement fiable et peut laisser l'instance dans un état incorrect, difficile à récupérer. - -On préfère passer la commande « shutdown » en interne : +On préfère passer la commande « shutdown » en interne qui devrait envoyer un signal SIGTERM (kill -15) au process mysqld : ~~~ # mysqladmin -h 127.0.0.1 -P3307 shutdown ~~~ -> **Note** : a priori cela revient à envoyer un signal SIGTERM (kill -15) au process mysqld - -> **Note2** : Avec l'unité systemd on peux stopper l'unité systemd en faisant : +Avec l'unité systemd on peux stopper l'unité systemd en faisant : ~~~ # systemctl stop mysqld@1 ~~~ - ### Connexion aux instances et création du fichier *~/.my.cnf* -Lors de la création de plusieurs instances MySQL, on préférera donner un mot de passe différents, par instances, à l’utilisateur `mysqladmin` +Lors de la création de plusieurs instances MySQL, on préférera donner à chacune un mot de passe différents à l’utilisateur `mysqladmin` -Pour utilisé le multi client, on configurera le fichier ~/.my.cnf comme ceci : +On sécurise la nouvelle instance en définissant un mot de passe au compte mysqladmin : + +~~~ +# mysql -P3307 --socket=/var/run/mysqld1/mysqld1.sock -u root -p +~~~ + +On supprime l'utilisateur root pour le remplacer par l'utilisateur mysqladmin dont [les requêtes sont identiques à une installation mono-instances](HowtoMySQL#installation). + +Pour utiliser le multi client, on configurera le fichier ~/.my.cnf comme ceci : ~~~ [client1] @@ -1706,13 +1686,13 @@ user = mysqladmin password = bar ~~~ -Avec cette configuration, on doit se connecter a l'instance mysql avec l'option `--defaults-group-suffix=$NUM` par exemple : +Cette configuration permettra de se connecter à l'instance mysql avec l'option `--defaults-group-suffix=$NUM` par exemple : ~~~ mysql --defaults-group-suffix=1 ~~~ -**Attention** : Si on utilise cela, il faut modifier vos scripts de mysqldump ou de création de base en conséquence. +> **Attention** : Si on utilise cela, il faut modifier vos scripts de mysqldump ou de création de base en conséquence. ### Nettoyage