concision + mise à jour chemin de conf dans mariadb.conf

This commit is contained in:
btatu 2022-05-11 10:39:42 +02:00
parent d3d97d9b7c
commit 588dd1727c

View file

@ -1521,47 +1521,41 @@ mysql> SET sql_log_bin = 0;
## Multiples instances MySQL ## 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 ### 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} ~~~{.ini}
#user = mysql #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} ~~~{.ini}
[mysqld_multi] [mysqld_multi]
user = mysqladmin 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 # 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 # touch /var/log/mysqld1.log
# chmod 755 /srv /srv/mysqld_instances # 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 : Ajouter ces lignes dans `/etc/mysql/mariadb.conf.d/zzz_mysqld1.cnf` :
~~~
# mkdir /home/mysqld1-tmp
# chown mysqld1:mysqld1 /home/mysqld1-tmp
~~~
Ajouter ces lignes dans `/etc/mysql/conf.d/zzz_mysqld1.cnf` :
~~~{.ini} ~~~{.ini}
[mysqld1] [mysqld1]
@ -1574,30 +1568,28 @@ datadir = /srv/mysqld_instances/mysqld1
log_error = /var/log/mysqld1.log 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: Ajuster les permissions du fichier de configuration:
~~~ ~~~
# chmod 644 /etc/mysql/conf.d/zzz_mysqld1.cnf # 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 # 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, ### Démarrer une instance avec systemd
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
~~~
On créé une unité systemd multi-instances pour mysql dans `/etc/systemd/system/mysqld@.service` 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 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 # systemctl daemon-reload
~~~
Puis lancer la nouvelle instance :
~~~
# systemctl start mysqld@1 # 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 # 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. 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 ! On préfère passer la commande « shutdown » en interne qui devrait envoyer un signal SIGTERM (kill -15) au process mysqld :
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 :
~~~ ~~~
# mysqladmin -h 127.0.0.1 -P3307 shutdown # mysqladmin -h 127.0.0.1 -P3307 shutdown
~~~ ~~~
> **Note** : a priori cela revient à envoyer un signal SIGTERM (kill -15) au process mysqld Avec l'unité systemd on peux stopper l'unité systemd en faisant :
> **Note2** : Avec l'unité systemd on peux stopper l'unité systemd en faisant :
~~~ ~~~
# systemctl stop mysqld@1 # systemctl stop mysqld@1
~~~ ~~~
### Connexion aux instances et création du fichier *~/.my.cnf* ### 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, à lutilisateur `mysqladmin` Lors de la création de plusieurs instances MySQL, on préférera donner à chacune un mot de passe différents à lutilisateur `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] [client1]
@ -1706,13 +1686,13 @@ user = mysqladmin
password = bar 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 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 ### Nettoyage