Mysql-community-server personnalisé

J'ai voulu installer la version 5.7 de Mysql depuis le repository de Mysql en chargeant depuis le site le paquet "Ubuntu / Debian (Architecture Independent), DEB" qui installe notament un fichier "mysql.list" dans /etc/apt/sources-list.d, ensuite on utilise les outils standard Debian : aptitude, apt-get ou synaptic. 
Remarque : j'ai inhibé le repository "mysql-tools-preview" 
Un "apt-get update" plus loin les choses sont disponibles et on peut installer "mysql-community-client" et "mysql-community-server" version 5.7.16 
J'ai voulu réaliser une installation non "standard" en positionnant les fonctionnalités principales de la base de données sur des systèmes de fichiers différents notamment pour la partie "log" et pour la partie "données"  afin d'optimiser le fonctionnement. 
La machine est munie de :

  • CPU    CoreI3 4330
  • RAM    16G
  • 3 disques SSD

Selon le schéma suivant : 
Un système de fichier racine 
Un système de fichier /DATA/DATA1 pour les données 
Un système de fichier /LOG/LOG1 pour les logs y compris les "logbin".

J'ai configuré le fichier /etc/mysql/mysql.conf.d/mysqld.cnf de la façon suivante :

[mysqld] 
pid-file               = /run/mysqld/mysqld.pid 
socket                 = /run/mysqld/mysqld.sock 
# By default we only accept connections from localhost 
bind-address           = 0.0.0.0 
# Disabling symbolic-links is recommended to prevent assorted security risks 
symbolic-links=0 
### Deplacement des répertoires 
datadir                = /DATA/DATA1/mysql 
tmpdir                 = /LOG/LOG1/mysql_tmp 
log_bin                = /LOG/LOG1/mysql/server-bin 
general_log_file       = /LOG/LOG1/mysql/general.log 
slow-query-log-file    = /LOG/LOG1/mysql/slow_query.log 
server_id              = 11 
log_error              = /LOG/LOG1/mysql/error.log 
secure-file-priv       = /DATA/DATA1/mysql-files 
slave_load_tmpdir      = /LOG/LOG1/mysql_tmp 
### configuration InnoDB

....

Nettoyez toute trace de l'installation imposée lors du démarrage (/var/lib/mysql, /var/log/mysql). 
Vérifiez bien que tous vos répertoires "mysql" ont bien le user et le groupe "mysql" :

cd /DATA//DATA1 
ls -al 
drwxr-xr-x 6 root  root   4096 nov.  18 20:00 . 
drwxr-xr-x 4 root  root   4096 nov.  14 23:27 .. 
drwx------ 2 root  root  16384 nov.  12 22:24 lost+found 
drwxr-xr-x 5 mysql mysql  4096 nov.  18 20:26 mysql 
drwx------ 2 mysql mysql  4096 nov.  18 20:02 mysql-files 
cd /LOG/LOG1 
drwxr-xr-x 6 root  root   4096 nov.  17 23:22 . 
drwxr-xr-x 4 root  root   4096 nov.  15 00:21 .. 
drwx------ 2 root  root  16384 nov.  15 00:21 lost+found 
drwxr-xr-x 2 mysql mysql  4096 nov.  18 20:04 mysql 
drwx------ 2 mysql mysql  4096 nov.  18 20:22 mysql-files 
drwxr-xr-x 2 mysql mysql  4096 nov.  18 20:25 mysql_tmp

Il faut maintenant attaquer la partie "systemd" et la corriger pour éluder un script (horrible) rempli de valeurs "en dur" qui viendrait perturber la belle ordonnance de nos paramètres. 
Ce script (/usr/share/mysql/mysql-systemd-start) est à ignorer purement et simplement et à remplacer par un petit script destiné uniquement à initialiser correctement le répertoire "mysqld" dans /run (et pas /var/run qui n'est qu'un lien vers /run) ce script hyper simple (je l'ai appelé "init-mysql") il est fourni à titre d'exemple :

#!/bin/bash 
MYSQLRUN=/run/mysqld 
if [ ! -d ${MYSQLRUN} ] 
   then 
    mkdir ${MYSQLRUN} 
    chown mysql:mysql ${MYSQLRUN} 
fi


Ce n'est vraiment pas grand chose ! 
Attention ce script est exécuté par le user "mysql", le mettre dans /usr/bin par exemple pour qu'il soit accessible sans difficultés.

Modifier le script "systemd" de lancement du service (/lib/systemd/system/mysql.service) pour en extirper la référence à l'horrible "mysql-systemd-start" : 
Partie du script "systemd" modifié :

[Service] 
User=mysql 
Group=mysql 
Type=forking 
PermissionsStartOnly=true 
PIDFile=/run/mysqld/mysqld.pid 
ExecStartPre=/usr/bin/init_mysql 
ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid 
TimeoutSec=60 
LimitNOFILE = 5000 
Restart=on-abort 
RestartPreventExitStatus=1 
RuntimeDirectory=mysqld 
RuntimeDirectoryMode=755 
Ne pas oublier ensuite "systemctl daemon-reload" avant de relancer le service. 
Aller modifier le fichier /etc/mysql/conf.d/mysql.cnf (utilisé par le client mysql) pour y indiquer le nom du fichier "socket" : 
[mysql] 
socket = /run/mysqld/mysqld.sock

On doit encore réaliser un petit truc bizarre, créer un lien entre : 
/etc/mysql/mysql.conf.d/mysqld.cnf et /etc/my.cnf ??? 
On peut alors, enfin, lancer une installation "personnalisée" de l'ensemble en utilisant le paramètre "--initialize--insecure" de mysqld, adieu "mysql_install_db" on ne te regrettera pas trop. 
mysqld --initialize-insecure 
qui crée le user "root" sans mot de passe, il suffira d'en mettre un rapidement avec la commande "set password ..." pour rester correct, la commande se termine rapidement, SSD oblige. 
Cette commande a rempli les répertoires prévus /DATA/DATA1/mysql de ce qui se trouve dans /var/lib/mysql habituellement. 
Tout semble prêt on lance la commande fatidique : 
service mysql start 
qui rend la main rapidement (tout est sur des SSD), on vérifie un peu si tout va bien :

ps -ef | grep mysqld 
mysql  2733  1  2 22:52 ?  00:00:00 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid

puis :

ls -al /run/mysqld 
drwxr-xr-x  2 mysql mysql 100 nov.  18 22:52 . 
drwxr-xr-x 23 root  root  860 nov.  18 22:52 .. 
-rw-r-----  1 mysql mysql   5 nov.  18 22:52 mysqld.pid 
srwxrwxrwx  1 mysql mysql   0 nov.  18 22:52 mysqld.sock 
-rw-------  1 mysql mysql   5 nov.  18 22:52 mysqld.sock.lock

Tout à l'air parfait on lance le client mysql :

mysql 
Welcome to the MySQL monitor.  Commands end with ; or \g. 
Your MySQL connection id is 2 
Server version: 5.7.16-log MySQL Community Server (GPL)Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its 
affiliates. Other names may be trademarks of their respective 
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 
mysql>

Ouaaaah tout baigne, vite mettons un mot de passe à ce vieux "root" :

use mysql; 
mysql> set password for 'root'@'localhost' = PASSWORD('Un_BeAu_#_PaSsWoRd_ToUt%Neuf?'); 
\q 
Et on teste notre mot de passe :

mysql --user=root -p 
Enter password:  
Welcome to the MySQL monitor.  Commands end with ; or \g. 
Your MySQL connection id is 5 
Server version: 5.7.16-log MySQL Community Server (GPL)Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its 
affiliates. Other names may be trademarks of their respective 
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>\q

C'est fini, on dispose d'une base toute neuve en version 5.7.16. Montée sur des systèmes de fichiers SSD cela devrait être assez rapide ! 
A bientôt pour quelques tests.