Optimisation MySQL/MariaDB

Quelques notes pour l’optimisation d’un serveur MySQL/MariaDB.

Cela se passe dans le fichier /etc/mysql/mariadb.conf.d/50-server.cnf sur un serveur Ubuntu 22.04

innodb_buffer_pool_size devrait être à 80% de la RAM allouée à MySQL/MariaDB

Utiliser le script MySQLTuner disponible ici : https://github.com/major/MySQLTuner-perl

Il y a probablement beaucoup d’autres choses à faire, si vous en connaissez n’hésitez pas à laisser un commentaire (je ne suis pas DBA).

Redémarrer automatiquement Apache/MySQL avec monit

Sur un serveur web LAMP il peut arriver que la processus Apapche 2 ou MariaDB/MySQL se termine de façon anormale ou soit terminé par OOM Killer.

Pour surveiller ces processus il existe monit qui est très simple d’utilisation. Voici comment l’installer sur un Ubuntu Server 22.04 :

sudo apt install monit

Aller dans le répertoire de configuration de monit :

cd /etc/monit/conf.d/

Créer un fichier pour Apache, apache.conf contenant :

check process apache with pidfile /run/apache2/apache2.pid
    start program = "/usr/sbin/service apache2 start"
    stop program = "/usr/sbin/service apache2 stop"
    if failed host 127.0.0.1 port 80 protocol http then restart
    if 5 restarts within 5 cycles then timeout

Créer un second fichier pour MariaDB/MySQL, mysql.conf :

check process mysqld with pidfile /run/mysqld/mysqld.pid
    start program = "/usr/sbin/service mysql start"
    stop program = "/usr/sbin/service mysql stop"
    if failed host 127.0.0.1 port 3306 protocol mysql then restart
    if 5 restarts within 5 cycles then timeout

Puis redémarrer monit et vérifier que celui-ci fonctionne bien :

sudo service monit restart
sudo service monit status
● monit.service - LSB: service and resource monitoring daemon
     Loaded: loaded (/etc/init.d/monit; generated)
     Active: active (running) since Wed 2023-06-07 08:14:53 CEST; 4s ago
       Docs: man:systemd-sysv-generator(8)
    Process: 58545 ExecStart=/etc/init.d/monit start (code=exited, status=0/SUCCESS)
      Tasks: 1 (limit: 9518)
     Memory: 1.7M
        CPU: 31ms
     CGroup: /system.slice/monit.service
             └─58551 /usr/bin/monit -c /etc/monit/monitrc

Jun 07 08:14:53 ip-172-31-26-128 systemd[1]: Starting LSB: service and resource monitoring daemon...
Jun 07 08:14:53 ip-172-31-26-128 monit[58545]:  * Starting daemon monitor monit
Jun 07 08:14:53 ip-172-31-26-128 monit[58545]:    ...done.
Jun 07 08:14:53 ip-172-31-26-128 systemd[1]: Started LSB: service and resource monitoring daemon.

Et voilà, c’est en place. monit vérifie toutes les 2 minutes que les processus fonctionnent et les redémarre si besoin.

Recopier les bases données d’un serveur MySQL/MariaDB vers un autre

Voici un script Bash très simple qui permet de migrer toutes les bases de données d’un serveur MySQL/MariaDB vers un autre serveur.

Celui-ci peut servir par exemple pour migrer vers un serveur AWS RDS.

#!/bin/bash

# configuration de la machine hébergeant le serveur MySQL source
DB_HOST_PROD="srv.source.com"
# configuration de l'utilisateur MySQL et de son mot de passe
DB_USER_PROD="root"
DB_PASS_PROD="PASSWORD"

# configuration de la machine hébergeant le serveur MySQL de destination
DB_HOST_RDS="srv.dest.com"
# configuration de l'utilisateur MySQL et de son mot de passe
DB_USER_RDS="admin"
DB_PASS_RDS="PASSWORD"

# récupération de la liste des bases
DATABASES=`MYSQL_PWD=$DB_PASS_PROD mysql -h $DB_HOST_PROD -u $DB_USER_PROD -e "SHOW DATABASES;" | tr -d "| " | grep -v -e Database -e _schema -e mysql`
# boucle sur les bases pour les dumper
for DB_NAME in $DATABASES; do
    # Pour créer les bases de données
    echo "create database if not exists $DB_NAME;" | MYSQL_PWD=$DB_PASS_RDS mysql -h $DB_HOST_RDS -u $DB_USER_RDS

    now=$(date +"%T")
    echo $now $DB_NAME
    #MYSQL_PWD=$DB_PASS_PROD mysqldump -u $DB_USER_PROD --column-statistics=0 --single-transaction --skip-lock-tables $DB_NAME -h $DB_HOST_PROD | MYSQL_PWD=$DB_PASS_RDS mysql -h $DB_HOST_RDS -u $DB_USER_RDS -D $DB_NAME # en fonction de la version de MySQL/MariaDB
    MYSQL_PWD=$DB_PASS_PROD mysqldump -u $DB_USER_PROD --single-transaction --skip-lock-tables $DB_NAME -h $DB_HOST_PROD | MYSQL_PWD=$DB_PASS_RDS mysql -h $DB_HOST_RDS -u $DB_USER_RDS -D $DB_NAME
done

Passer simplement de CentOS 8 à Stream

Le support de CentOS 8 va s’arrêter fin 2021 au lieu de fin 2029 il faut donc migrer vers une autre distribution ou passer à CentOS Stream potentiellement moins stable.

Voici la procédure pour passer à CentOS Stream :

dnf upgrade
dnf install centos-release-stream
dnf swap centos-{linux,stream}-repos
dnf distro-sync

Redémarrer

Pour vérifier que cela c’est bien passé :

cat /etc/os-release

NAME="CentOS Stream"
VERSION="8"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Stream 8"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://centos.org/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux 8"
REDHAT_SUPPORT_PRODUCT_VERSION="CentOS Stream"

En cas de problème réseau :

systemctl start NetworkManager.service
systemctl enable NetworkManager.service

CentOS 8 : Activer les mises à jours de sécurité automatique

Pour activer le téléchargement et l’installation automatique des mise à jour de sécurité sur CentOS 8 :

dnf install dnf-automatic

Puis modifier le fichier /etc/dnf/automatic.conf

upgrade_type = security
apply_updates = yes

Ensuite activer le service

systemctl enable --now dnf-automatic.timer
systemctl enable --now dnf-automatic-install.timer

Pour vérifier :

systemctl list-timers *dnf-*

Source : https://www.howtoforge.com/tutorial/how-to-configure-automatic-package-updates-on-centos-8/