MariaDB : Tuning mariadb server sous debian / ubuntu et operation de maintenance sauvegarde/restauration

20 juillet 2026 — par admin_libra

MariaDB est aujourd’hui le serveur de bases de données relationnel de référence sur les distributions Debian et Ubuntu. Héritier direct de MySQL, il s’en distingue par ses performances accrues, ses moteurs de stockage améliorés et une communauté open source très active. Dans les environnements de production, une installation par défaut ne suffit pas : les paramètres initiaux sont volontairement conservateurs afin de fonctionner sur du matériel modeste et de nombreux profils d’utilisation différents.

Ce guide s’adresse aux administrateurs système qui souhaitent passer d’une configuration « out-of-the-box » à un serveur MariaDB optimisé pour la production. Nous couvrirons le tuning du fichier de configuration my.cnf, l’activation des outils de diagnostic, puis les opérations de maintenance indispensables : sauvegarde logique avec mariadb-dump, sauvegarde physique à chaud avec mariabackup, restauration, et optimisation des tables.

Les commandes et exemples qui suivent ont été validés sur Debian 12 (Bookworm), Debian 11 (Bullseye) et Ubuntu 22.04/24.04 LTS avec MariaDB 10.11 LTS et MariaDB 11.4 LTS, les deux branches maintenues à long terme au moment de la rédaction.

Installation et version LTS recommandée

Sur Debian/Ubuntu, MariaDB est disponible dans les dépôts officiels, mais la version peut être ancienne. Pour obtenir la dernière LTS :

# Ajout du dépôt officiel MariaDB (ici 11.4 LTS)
apt install -y curl gnupg2
curl -fsSL https://mariadb.org/mariadb_release_signing_key.pgp 
  | gpg --dearmor -o /usr/share/keyrings/mariadb-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/mariadb-keyring.gpg] 
  https://downloads.mariadb.com/MariaDB/mariadb-11.4/repo/debian bookworm main" 
  > /etc/apt/sources.list.d/mariadb.list

apt update && apt install -y mariadb-server mariadb-client mariadb-backup

# Vérification de la version installée
mariadb --version

Structure des fichiers de configuration

Sur Debian/Ubuntu, la configuration est fragmentée en plusieurs fichiers inclus par /etc/mysql/my.cnf :

/etc/mysql/my.cnf                   # Fichier principal (include uniquement)
/etc/mysql/mariadb.conf.d/50-server.cnf   # Configuration serveur
/etc/mysql/conf.d/                  # Surcharges personnalisées

La bonne pratique est de créer un fichier de surcharge dédié plutôt que de modifier les fichiers du paquet, qui seraient écrasés lors d’une mise à jour :

touch /etc/mysql/mariadb.conf.d/99-tuning.cnf

Tuning des paramètres clés

InnoDB — le moteur principal

InnoDB est le moteur par défaut depuis MariaDB 10.x. Son tuning est l’action la plus impactante sur les performances.

cat > /etc/mysql/mariadb.conf.d/99-tuning.cnf << 'EOF'
[mysqld]

# ─── InnoDB ─────────────────────────────────────────────────────────────────
# Allouer 60-70 % de la RAM sur un serveur dédié, 40-50 % si partagé
innodb_buffer_pool_size         = 2G
# Une instance par tranche de 1 Go (max 8)
innodb_buffer_pool_instances    = 2
# Journaux plus grands = moins d'I/O, meilleure tolérance aux pics d'écriture
innodb_log_file_size            = 512M
innodb_log_buffer_size          = 64M
# O_DIRECT réduit le double buffering OS+InnoDB sur Linux
innodb_flush_method             = O_DIRECT
# 2 = flush logs à chaque seconde (bon compromis perf/sécurité)
innodb_flush_log_at_trx_commit  = 2
# Adapté au nombre de cœurs (2x nb_vCPU est un bon point de départ)
innodb_read_io_threads          = 4
innodb_write_io_threads         = 4
innodb_io_capacity              = 400

# ─── Connexions ──────────────────────────────────────────────────────────────
max_connections                 = 150
max_connect_errors              = 1000000
connect_timeout                 = 10
wait_timeout                    = 600
interactive_timeout             = 600

# ─── Mémoire par connexion ───────────────────────────────────────────────────
# Ces valeurs sont allouées PAR connexion — ne pas sur-dimensionner
sort_buffer_size                = 4M
join_buffer_size                = 4M
read_buffer_size                = 2M
read_rnd_buffer_size            = 2M
tmp_table_size                  = 64M
max_heap_table_size             = 64M

# ─── Cache de requêtes (désactivé en 10.1.7+ par défaut, à éviter en prod) ──
query_cache_type                = 0
query_cache_size                = 0

# ─── Tables et fichiers ouverts ──────────────────────────────────────────────
table_open_cache                = 2000
open_files_limit                = 65535

# ─── MyISAM (usage réduit, tables système uniquement) ───────────────────────
key_buffer_size                 = 32M

# ─── Journaux d'erreurs et requêtes lentes ───────────────────────────────────
slow_query_log                  = 1
slow_query_log_file             = /var/log/mysql/slow.log
long_query_time                 = 2
log_queries_not_using_indexes   = 1
EOF

Après modification, rechargez MariaDB et vérifiez que les paramètres sont bien pris en compte :

systemctl restart mariadb

# Vérifier un paramètre en live
mariadb -e "SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool_size';"

# Observer l'utilisation du buffer pool
mariadb -e "SHOW ENGINE INNODB STATUSG" | grep -A5 "BUFFER POOL"

Ajustement de la swappiness pour un serveur de base de données

Pour qu’un serveur MariaDB évite de swapper ses pages mémoire actives, réduisez la tendance du noyau à utiliser le swap :

# Appliquer immédiatement
sysctl -w vm.swappiness=10

# Rendre permanent
echo "vm.swappiness = 10" >> /etc/sysctl.d/99-mariadb.conf
sysctl -p /etc/sysctl.d/99-mariadb.conf

Analyse du journal des requêtes lentes

# Analyser le slow log avec mysqldumpslow (inclus dans mariadb-client)
mysqldumpslow -s t -t 20 /var/log/mysql/slow.log

# Ou avec pt-query-digest (percona-toolkit)
apt install -y percona-toolkit
pt-query-digest /var/log/mysql/slow.log | head -100

Sauvegarde logique avec mariadb-dump

mariadb-dump (alias mysqldump) génère des fichiers SQL portables. C’est la solution universelle pour des bases de petite à moyenne taille.

# Sauvegarde d'une seule base de données
mariadb-dump --single-transaction --routines --triggers 
  -u root ma_base | gzip > /backup/ma_base_$(date +%F).sql.gz

# Sauvegarde de toutes les bases
mariadb-dump --all-databases --single-transaction --events --routines 
  -u root | gzip > /backup/all_databases_$(date +%F).sql.gz

# Restauration d'une base
zcat /backup/ma_base_2026-07-03.sql.gz | mariadb -u root ma_base

# Restauration complète (toutes les bases)
zcat /backup/all_databases_2026-07-03.sql.gz | mariadb -u root

L’option --single-transaction est indispensable pour les tables InnoDB : elle encapsule le dump dans une transaction et évite de verrouiller les tables en lecture.

Sauvegarde physique à chaud avec mariabackup

mariabackup effectue une copie physique des fichiers de données pendant que MariaDB fonctionne, sans interruption de service. Idéal pour les grandes bases (plusieurs Go) où un dump logique serait trop lent.

Préparation : utilisateur dédié

mariadb -u root << 'SQL'
CREATE USER 'mariabackup'@'localhost' IDENTIFIED BY 'MotDePasseSecurise!';
GRANT RELOAD, PROCESS, LOCK TABLES, BINLOG MONITOR ON *.* TO 'mariabackup'@'localhost';
FLUSH PRIVILEGES;
SQL

Sauvegarde complète

BACKUP_DIR="/backup/mariabackup/$(date +%F_%H%M)"
mkdir -p "$BACKUP_DIR"

mariabackup --backup 
  --target-dir="$BACKUP_DIR" 
  --user=mariabackup 
  --password='MotDePasseSecurise!'

Préparation (apply-log) et restauration

Avant toute restauration, les journaux de transactions doivent être appliqués pour rendre le backup cohérent :

# 1. Préparer le backup (apply-log)
mariabackup --prepare --target-dir=/backup/mariabackup/2026-07-03_0200

# 2. Arrêter MariaDB
systemctl stop mariadb

# 3. Vider le répertoire de données
mv /var/lib/mysql /var/lib/mysql.old

# 4. Copier les fichiers
mariabackup --copy-back --target-dir=/backup/mariabackup/2026-07-03_0200

# 5. Corriger les permissions
chown -R mysql:mysql /var/lib/mysql

# 6. Redémarrer
systemctl start mariadb

Automatisation des sauvegardes avec cron

cat > /etc/cron.d/mariadb-backup < /backup/all_db_$(date +%F).sql.gz 
  && find /backup -name "all_db_*.sql.gz" -mtime +7 -delete
CRON

Opérations de maintenance des tables

Avec le temps, les tables InnoDB accumulent des pages fragmentées. Les opérations de maintenance permettent de récupérer de l’espace et d’actualiser les statistiques de l’optimiseur.

# Vérification de l'intégrité de toutes les tables
mariadb-check --all-databases --check -u root

# Analyse des statistiques (met à jour les index stats pour l'optimiseur)
mariadb-check --all-databases --analyze -u root

# Optimisation des tables (récupère l'espace fragmenté)
mariadb-check --all-databases --optimize -u root

# Sur une base spécifique uniquement
mariadb-check --optimize ma_base -u root

Depuis le shell MariaDB, vous pouvez cibler des tables précises :

mariadb -u root ma_base < 0
ORDER BY data_free DESC;

-- Optimiser une table spécifique
OPTIMIZE TABLE ma_table;

-- Mettre à jour les statistiques
ANALYZE TABLE ma_table;
SQL

Rotation et archivage des logs binaires

# Activer les binary logs dans 99-tuning.cnf
# log_bin = /var/log/mysql/mariadb-bin
# expire_logs_days = 7     # MariaDB = 11.0 (7 jours)

# Lister les binary logs actifs
mariadb -u root -e "SHOW BINARY LOGS;"

# Purger manuellement les logs antérieurs à une date
mariadb -u root -e "PURGE BINARY LOGS BEFORE '2026-06-26 00:00:00';"

Surveillance et état du serveur

# Variables globales de statut : requêtes, connexions, cache
mariadb -u root -e "SHOW GLOBAL STATUS LIKE 'Threads%';"
mariadb -u root -e "SHOW GLOBAL STATUS LIKE 'Queries';"
mariadb -u root -e "SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';"

# Processus en cours
mariadb -u root -e "SHOW FULL PROCESSLIST;"

# Ratio de hit du buffer pool (doit être > 99 %)
mariadb -u root -e "
SELECT ROUND(
  (SELECT variable_value FROM information_schema.global_status
   WHERE variable_name='Innodb_buffer_pool_read_requests') /
  (SELECT variable_value FROM information_schema.global_status
   WHERE variable_name='Innodb_buffer_pool_read_requests') * 100, 2
) AS buffer_hit_ratio;"

À lire également

Références

Index complet

Tous les articles (58)

Date Article Tags
20/07/2026 SSL : Certificat Let's Encrypt avec Certbot sur Debian/Ubuntu (sans Snap) apache certbot certificat 20/07/2026 MariaDB : Tuning mariadb server sous debian / ubuntu et operation de maintenance sauvegarde/restauration debian innodb maintenance 20/07/2026 MariaDB : Mise en place d'une réplication Master → Slave base-de-données binlog debian 20/07/2026 OpenSVC : piloter des conteneurs LXC sur datasets ZFS avec snapshots et réplication sous Debian/Ubuntu conteneurs debian haute-disponibilité 20/07/2026 SCREEN : utilisation et cas d'usage des screens sous Linux administration bash debian 20/07/2026 EtherPAD : installation et configuration d'Etherpad collaboration debian editeur-collaboratif 20/07/2026 Wazuh 4.14 : déployer un SIEM/XDR open source sur Debian/Ubuntu compliance debian fim 20/07/2026 Incus 7.x : gérer conteneurs système et VMs sur Debian/Ubuntu — le successeur communautaire de LXD conteneurs debian incus 20/07/2026 Restic : sauvegardes incrémentielles chiffrées sur Debian et Ubuntu backup chiffrement debian 20/07/2026 Restic : sauvegardes chiffrées et dédupliquées sur Debian/Ubuntu automatisation backup chiffrement 30/06/2026 PHP : gérer plusieurs versions PHP-FPM avec les dépôts Sury sur Debian/Ubuntu administration apache debian 22/06/2026 OS : Cycle de vie LTS et mise à jour des distributions — apt dist-upgrade et do-release-upgrade sous Debian / Ubuntu apt cycle-de-vie debian 17/06/2026 APT : Guide complet de la gestion des paquets sous Debian et Ubuntu administration apt debian 17/06/2026 SHELL : Guide des commandes les plus usuelles et commandes couteau suisse awk bash commandes 17/06/2026 SUDO : implémentation et sécurisation des accès sur Debian/Ubuntu administration audit authentification 17/06/2026 ProFTPd : authentification MySQL centralisée, FTPs (SSL) et SFTP sur Debian/Ubuntu authentification debian ftp 09/06/2026 Fail2ban — configuration avancée et filtres personnalisés bruteforce debian fail2ban 07/06/2026 Docker : comment récupérer de l'espace disque cache conteneurs debian 07/06/2026 Graylog 7 — Centralisation et analyse de logs : l'alternative à ELK sur Debian/Ubuntu centralisation debian elk 07/06/2026 OpenZFS : tiering avec L2ARC et SLOG pour les workloads mixtes cache l2arc nvme 07/06/2026 Scripting Bash avancé — pièges, bonnes pratiques et optimisation automatisation bash bonnes-pratiques 07/06/2026 AppArmor sur Debian/Ubuntu : profils, modes et confinement applicatif apparmor audit confinement 07/06/2026 Durcissement SSH — au-delà des clés publiques 2fa authentification cryptographie 27/05/2026 LXD 6.x : orchestration de conteneurs Linux avec profils et clustering administration clustering conteneurs 27/05/2026 Keepalived — VIP flottante et load balancing sans matériel dédié debian failover haute-disponibilité 27/05/2026 Btrfs sur Linux — snapshots, sous-volumes et compression en pratique administration btrfs compression 21/05/2026 CVE-2026-42945 (NGINX Rift) : analyse et remédiation sur Debian/Ubuntu cve debian heap-overflow 21/05/2026 Tuning kernel Linux — paramètres sysctl essentiels pour la production debian kernel mémoire 21/05/2026 DRBD : réplication de blocs entre deux serveurs en temps réel cluster debian drbd 15/05/2026 CVE-2026-23918 — vulnérabilité Apache 2.4.66 : analyse et correctifs sur Debian/Ubuntu (hors Debian 11) apache cve debian 15/05/2026 CVE-2026-31431 (Copy Fail) — Analyse et remédiation sur Debian/Ubuntu algif_aead copy-fail cve 12/05/2026 Pacemaker et Corosync — cluster haute disponibilité Linux cluster corosync debian 12/05/2026 WireGuard : monter un VPN mesh entre plusieurs serveurs Linux chiffrement linux mesh 12/05/2026 Netdata — monitoring temps réel sans configuration complexe alertes dashboard linux 12/05/2026 nftables en pratique — remplacer iptables sur Debian/Ubuntu debian firewall iptables 12/05/2026 Podman : alternative rootless à Docker — installation et migration conteneurs docker kubernetes 02/05/2026 Prometheus et Grafana sur Debian — installation, configuration et dashboards pratiques alertmanager dashboard debian 02/05/2026 Ansible : automatiser la gestion de serveurs Linux avec des playbooks administration ansible automation 28/04/2026 ZFS sur Linux : snapshots, clones et RAID-Z en pratique administration compression filesystem 28/04/2026 eBPF sur Linux : observabilité et traçage kernel avec bpftrace et BCC bcc bpftrace diagnostic 23/04/2026 Analyse de la mémoire sur Linux — vmstat, free, smem diagnostic mémoire monitoring 23/04/2026 Sécurité Linux — Firewall iptables et nftables firewall iptables nftables 23/04/2026 ZFS sur Linux — Installation et gestion avancée administration filesystem stockage 23/04/2026 Gestion des services avec systemd sur Debian et Ubuntu administration debian services 23/04/2026 Gestion des ressources cgroups v1/v2 avec LXC cgroups conteneurs lxc 23/04/2026 Centralisation logs avec ELK Stack — Elasticsearch, Kibana, Filebeat elasticsearch elk filebeat 23/04/2026 Supervision avec Zabbix 7.0 LTS sur Debian/Ubuntu debian monitoring supervision 23/04/2026 Plusieurs versions PHP-FPM sur Apache Debian/Ubuntu apache debian php-fpm 23/04/2026 Sécurisation avancée PHP-FPM — Multi-VirtualHosts Apache/Nginx apache nginx php-fpm 23/04/2026 Optimisation PHP-FPM — Guide de tuning d'un pool optimisation performance php-fpm 29/07/2025 Docker sur Debian/Ubuntu : Installation, Configuration et Utilisation conteneurs debian docker 03/07/2025 Serveur VPN WireGuard sous linux réseau sécurité vpn 03/07/2025 Authentification par clé publique sur un serveur SSH authentification cryptographie sécurité 27/06/2025 Surveillance et diagnostic d’un serveur Linux avec vmstat, iotop et htop diagnostic htop monitoring 27/06/2025 Mémoire : Utilisation des Huge Pages et implémentation hugepages mémoire noyau 27/06/2025 Mémoire Swap et paramétrage swappiness mémoire noyau performance 18/06/2025 Installation et Configuration des Conteneurs LXC sur Linux administration conteneurs lxc 18/06/2025 Gestion des journaux avec syslog et journalctl administration journalctl logs