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
- Tuning kernel Linux — paramètres sysctl essentiels pour la production
- Mémoire Swap et paramétrage swappiness
- Mémoire : Utilisation des Huge Pages et implémentation
- Analyse de la mémoire sur Linux — vmstat, free, smem