Mysql-community-server personnalisé

Soumis par drupal_admin le dim 20/11/2016 - 16:20

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.