🛡️ Installer MySQL / MariaDB sur un VPS#
Guide complet et détaillé pour installer, sécuriser et optimiser MariaDB sur un serveur VPS. Ce tutoriel approfondi vous accompagne étape par étape pour une configuration professionnelle adaptée à l'hébergement web, aux applications métier, à l'e-commerce ou aux serveurs de jeux.
🎯 Objectifs de ce guide#
- ✅ Installation propre de MariaDB sur Ubuntu/Debian
- 🔒 Sécurisation avancée avec authentification forte et isolation des services
- ⚡ Optimisation des performances pour un usage en production
- 🔧 Configuration fine adaptée à votre charge de travail
- 🛠️ Résolution des problèmes les plus courants
1️⃣ Préparation du système#
📦 Mise à jour complète du système#
# Mise à jour de la liste des paquets sudo apt update # Mise à niveau de tous les paquets installés sudo apt upgrade -y
🔧 Installation des outils essentiels#
# Outils de base pour l'administration sudo apt install -y curl wget gnupg2 software-properties-common apt-transport-https ca-certificates
🕒 Configuration du fuseau horaire#
# Voir l'heure actuelles date # Configurer le fuseau horaire (important pour les logs) sudo timedatectl set-timezone Europe/Paris # Vérifier la configuration timedatectl status
2️⃣ Installation détaillée de MySQL ou MariaDB#
Méthode 1 : Depuis les dépôts Ubuntu/Debian#
# Installation de MariaDB sudo apt install -y mariadb-server mariadb-client # Démarrage et activation sudo systemctl start mariadb sudo systemctl enable mariadb # Vérification sudo systemctl status mariadb
Méthode 2 : Depuis le dépôt officiel MariaDB (recommandé)#
# Ajout de la clé GPG MariaDB sudo apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc' # Ajout du dépôt curl -LsSO https://r.mariadb.com/downloads/mariadb_repo_setup | bash # Installation sudo apt update sudo apt install -y mariadb-server
✅ Vérification de l'installation#
# Version installée mariadb --version # Processus en cours d'exécution ps aux | grep mysql # Ports en écoute sudo netstat -tlnp | grep :3306 # Test de connexion basique sudo mysql -u root
3️⃣ Sécurisation avancée de l'installation#
🔒 Assistant de sécurisation#
sudo mysql_secure_installation
Configuration détaillée des options :
-
Validate Password Plugin :
Y
- Niveau de sécurité :
2
(STRONG) - Longueur minimale : 12 caractères
- Mélange majuscules/minuscules/chiffres/symboles
- Niveau de sécurité :
-
Mot de passe root : Créez un mot de passe fort
- Exemple :
MyS3cur3P@ssw0rd!2024
- Évitez les mots du dictionnaire
- Stockez-le dans un gestionnaire de mots de passe
- Exemple :
-
Supprimer utilisateurs anonymes :
Y
-
Désactiver connexion root distante :
Y
-
Supprimer base de données test :
Y
-
Recharger les privilèges :
Y
4️⃣ Gestion des utilisateurs et privilèges#
👤 Création des bases de données et utilisateurs locaux#
Connexion en tant que root#
sudo mysql -u root -p
Création des bases de données#
-- Création des bases de données CREATE DATABASE production_app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE DATABASE staging_app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Création d'utilisateurs pour accès local uniquement#
-- Utilisateur pour l'application (privilèges limités) CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'AppStr0ng!Pass2024'; GRANT SELECT, INSERT, UPDATE, DELETE ON production_app.* TO 'app_user'@'localhost'; -- Utilisateur pour les sauvegardes (lecture seule) CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'BackupSecur3!2024'; GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON production_app.* TO 'backup_user'@'localhost'; -- Utilisateur pour l'administration (privilèges étendus) CREATE USER 'admin_user'@'localhost' IDENTIFIED BY 'AdminP0w3r!2024'; GRANT ALL PRIVILEGES ON production_app.* TO 'admin_user'@'localhost'; GRANT ALL PRIVILEGES ON staging_app.* TO 'admin_user'@'localhost'; -- Utilisateur pour monitoring (privilèges de lecture système) CREATE USER 'monitor_user'@'localhost' IDENTIFIED BY 'M0nit0r!Secur3'; GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'monitor_user'@'localhost'; -- Application des modifications FLUSH PRIVILEGES; -- Vérification des utilisateurs créés SELECT User, Host FROM mysql.user WHERE Host = 'localhost'; EXIT;
5️⃣ Configuration des accès distants (optionnel)#
⚠️ Attention : Les accès distants présentent des risques de sécurité. Ne les activez que si nécessaire et toujours avec des restrictions d'IP.
🔧 Étape 1 : Configuration du serveur MariaDB#
Modifier la configuration pour écouter sur toutes les interfaces#
# Éditer le fichier de configuration sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
Trouvez la ligne bind-address
et modifiez-la :
# AVANT (accès local uniquement) bind-address = 127.0.0.1 # APRÈS (accès depuis toutes les interfaces) bind-address = 0.0.0.0
Redémarrer MariaDB pour appliquer les changements#
sudo systemctl restart mariadb # Vérifier que le serveur écoute sur toutes les interfaces sudo netstat -tlnp | grep :3306 # Vous devriez voir : 0.0.0.0:3306 au lieu de 127.0.0.1:3306
🔐 Étape 2 : Création d'utilisateurs pour accès distant#
# Reconnection à MariaDB sudo mysql -u root -p
-- Utilisateur avec IP spécifique (recommandé) CREATE USER 'remote_admin'@'192.168.1.100' IDENTIFIED BY 'RemoteStr0ng!2024'; GRANT SELECT, INSERT, UPDATE, DELETE ON production_app.* TO 'remote_admin'@'192.168.1.100'; -- Application des modifications FLUSH PRIVILEGES; -- Vérification des utilisateurs distants SELECT User, Host FROM mysql.user WHERE Host != 'localhost'; EXIT;
🛡️ Étape 3 : Configuration du pare-feu#
# Autoriser l'accès depuis une IP spécifique sudo ufw allow from 192.168.1.100 to any port 3306 # Vérifier les règles du pare-feu sudo ufw status numbered
🧪 Étape 4 : Test de la connexion distante#
# Depuis un autre serveur, tester la connexion mysql -h 163.5.xxx.xxx -u remote_user -p production_app # Ou avec telnet pour tester la connectivité telnet 163.5.xxx.xxx 3306
6️⃣ Optimisation avancée des performances#
📊 Outils de tuning#
Installation de MySQLTuner#
# Installation depuis les dépôts sudo apt install -y mysqltuner # Ou téléchargement de la version la plus récente wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl chmod +x mysqltuner.pl # Exécution de l'analyse sudo mysqltuner # ou sudo perl mysqltuner.pl
7️⃣ Stratégies de sauvegarde et restauration#
💾 Sauvegardes avec mysqldump#
Script de sauvegarde automatisé#
# Créer le répertoire de sauvegardes sudo mkdir -p /backup/mysql sudo chown mysql:mysql /backup/mysql # Créer le script de sauvegarde sudo nano /usr/local/bin/mysql-backup.sh
#!/bin/bash # Script de sauvegarde MySQL automatisé # Configuration BACKUP_DIR="/backup/mysql" MYSQL_USER="backup_user" # A remplacer par votre utilisateur MYSQL_PASSWORD="BackupSecur3!2024" # A remplacer par votre mot de passe DATE=$(date +%Y%m%d_%H%M%S) RETENTION_DAYS=7 # Création du répertoire avec la date mkdir -p "$BACKUP_DIR/$DATE" # Liste des bases à sauvegarder DATABASES=("production_app" "staging_app") for db in "${DATABASES[@]}"; do echo "Sauvegarde de $db en cours..." # Sauvegarde complète avec structure et données mysqldump -u $MYSQL_USER -p$MYSQL_PASSWORD \ --single-transaction \ --routines \ --triggers \ --events \ --hex-blob \ --lock-tables=false \ $db > "$BACKUP_DIR/$DATE/${db}_full.sql" # Compression de la sauvegarde gzip "$BACKUP_DIR/$DATE/${db}_full.sql" echo "Sauvegarde de $db terminée : ${db}_full.sql.gz" done # Sauvegarde des utilisateurs et privilèges echo "Sauvegarde des utilisateurs et privilèges..." mysql -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SELECT User, Host FROM mysql.user;" > "$BACKUP_DIR/$DATE/users_list.txt" # Suppression des anciennes sauvegardes find $BACKUP_DIR -type d -mtime +$RETENTION_DAYS -exec rm -rf {} + echo "Sauvegarde terminée le $(date)"
# Rendre le script exécutable sudo chmod +x /usr/local/bin/mysql-backup.sh # Test du script sudo /usr/local/bin/mysql-backup.sh
Programmation des sauvegardes avec cron#
# Éditer la crontab sudo crontab -e # Ajouter ces lignes pour des sauvegardes automatiques # Sauvegarde quotidienne à 2h du matin 0 2 * * * /usr/local/bin/mysql-backup.sh >> /var/log/mysql-backup.log 2>&1 # Sauvegarde hebdomadaire complète le dimanche à 1h 0 1 * * 0 /usr/local/bin/mysql-backup.sh >> /var/log/mysql-backup-weekly.log 2>&1
🔄 Restauration de sauvegardes#
Restauration complète d'une base#
# Décompression si nécessaire gunzip /backup/mysql/20241201_020000/production_app_full.sql.gz # Restauration mysql -u admin_user -p'AdminP0w3r!2024' production_app < /backup/mysql/20241201_020000/production_app_full.sql
Restauration sélective de tables#
# Extraire seulement une table de la sauvegarde sed -n '/^-- Table structure for table `ma_table`/,/^-- Table structure for table `/p' sauvegarde.sql > ma_table.sql # Restaurer cette table spécifique mysql -u admin_user -p production_app < ma_table.sql
🔍 Monitoring avec des outils système#
Configuration de Fail2Ban pour MySQL#
# Créer un filtre pour les tentatives de connexion MySQL sudo nano /etc/fail2ban/filter.d/mysql-auth.conf
[Definition] failregex = ^%(__prefix_line)s.*\[Warning\] Access denied for user '.*'@'<HOST>'.*$ ignoreregex =
# Configuration dans jail.local sudo nano /etc/fail2ban/jail.local
[mysql-auth] enabled = true filter = mysql-auth logpath = /var/log/mysql/error.log maxretry = 3 bantime = 3600 findtime = 600
# Redémarrer Fail2Ban sudo systemctl restart fail2ban sudo fail2ban-client status mysql-auth
8️⃣ Résolution des problèmes courants#
🚨 Erreurs d'authentification#
"Access denied for user 'root'@'localhost'"#
# Solution 1: Réinitialisation du mot de passe root sudo systemctl stop mysql sudo mysqld_safe --skip-grant-tables & mysql -u root # Dans MySQL: USE mysql; UPDATE user SET authentication_string=PASSWORD('NouveauMotDePasse') WHERE User='root'; FLUSH PRIVILEGES; EXIT; # Relancer MySQL normalement sudo systemctl start mysql
🌐 Problèmes de connectivité#
Vérification de la configuration réseau#
# Vérifier les ports en écoute sudo netstat -tlnp | grep :3306 # Tester la connectivité locale telnet localhost 3306 # Vérifier les règles de pare-feu sudo ufw status sudo iptables -L
Diagnostic des connexions#
-- Voir les connexions actives SHOW PROCESSLIST; -- Voir les variables de connexion SHOW VARIABLES LIKE 'max_connections'; SHOW VARIABLES LIKE '%timeout%'; -- État des connexions SHOW STATUS LIKE 'Connections'; SHOW STATUS LIKE 'Threads_connected'; SHOW STATUS LIKE 'Aborted_connects';
🎉 Conclusion#
Votre serveur MySQL/MariaDB est maintenant configuré de manière professionnelle avec :
- ✅ Sécurité renforcée - Authentification forte, utilisateurs dédiés, chiffrement
- ✅ Performances optimisées - Configuration fine selon votre usage
- ✅ Sauvegardes fiables - Stratégie de sauvegarde/restauration automatisée
- ✅ Résolution d'erreurs - Guide complet des problèmes courants
Cette configuration vous garantit une base de données stable, sécurisée et performante pour vos applications en production. N'oubliez pas de maintenir votre système à jour et de surveiller régulièrement les performances !