Installer MySQL tient en une commande. L'essentiel du travail vient après : un utilisateur pour l'application, un moyen d'atteindre la base depuis votre ordinateur sans exposer le port 3306 à Internet, des réglages mémoire pour un petit serveur et des sauvegardes qui tournent sans vous. Ce guide couvre les quatre sous Ubuntu 24.04. Chaque étape a été exécutée sur notre image Ubuntu 24.04, et les chiffres ci-dessous viennent de ce serveur.
Lancez les commandes avec un utilisateur qui a sudo. Le guide de configuration d'Ubuntu en crée un.
1. Installer
sudo apt update
sudo apt install -y mysql-server
mysql --version
L'installation a pris 51 secondes sur notre serveur et nous a donné MySQL 8.0.46. Il démarre tout de suite, redémarre à chaque boot et n'écoute que sur le serveur lui-même : 127.0.0.1:3306 pour les connexions normales et 127.0.0.1:33060 pour le protocole X, plus récent. Rien n'est encore joignable de l'extérieur.
2. Créer une base et un utilisateur
Le compte root de MySQL utilise sous Ubuntu l'authentification par socket, donc sudo mysql vous connecte sans mot de passe. Créez une base et un utilisateur pour votre application :
sudo mysql
CREATE DATABASE app CHARACTER SET utf8mb4;
CREATE USER 'app'@'localhost' IDENTIFIED BY 'a-long-random-password';
GRANT ALL PRIVILEGES ON app.* TO 'app'@'localhost';
EXIT;
Testez-le comme votre application se connectera :
mysql -u app -p app -e "SELECT CURRENT_USER();"
Cela doit afficher app@localhost. Un mauvais mot de passe donne ERROR 1045 (28000): Access denied for user 'app'@'localhost'. L'utilisateur peut tout faire dans app et rien en dehors.
3. Se connecter depuis votre ordinateur : tunnel SSH
Pour utiliser un client de bureau comme DBeaver, MySQL Workbench ou la ligne de commande mysql sur votre machine, n'ouvrez pas de port. Redirigez-en un par SSH :
ssh -L 3307:127.0.0.1:3306 deploy@YOUR.SERVER.IP
Sur une offre NAT, ajoutez -p et le port SSH personnel de votre tableau de bord. Tant que cette fenêtre est ouverte, pointez votre client vers l'hôte 127.0.0.1, port 3307, utilisateur app. Côté local, nous avons pris 3307 pour éviter un conflit avec un MySQL qui tournerait sur votre ordinateur. Dans notre test, le serveur a répondu tout de suite par le tunnel, alors qu'une connexion directe à son adresse sur le 3306 était refusée.
4. Accès direct pour un autre serveur
Parfois, l'application tourne sur un second serveur et doit se connecter directement. Il faut alors à la base une offre avec sa propre IPv4, car une offre NAT ne redirige que votre port SSH. Trois changements, tous limités à l'adresse du serveur d'application (ici 203.0.113.20) :
sudo sed -i 's/^bind-address.*/bind-address = 0.0.0.0/' /etc/mysql/mysql.conf.d/mysqld.cnf
sudo systemctl restart mysql
sudo ufw allow from 203.0.113.20 to any port 3306 proto tcp
CREATE USER 'app'@'203.0.113.20' IDENTIFIED BY 'a-long-random-password';
GRANT ALL PRIVILEGES ON app.* TO 'app'@'203.0.113.20';
Si ufw n'est pas encore activé, autorisez d'abord SSH (sudo ufw allow OpenSSH) puis lancez sudo ufw enable. Le guide ufw donne les détails.
Nous avons vérifié les deux verrous séparément. Avec la règle de pare-feu mais sans utilisateur MySQL correspondant, le serveur a refusé avec error 1130: Host '…' is not allowed to connect to this MySQL server. Avec l'utilisateur ajouté, la connexion est passée. Sans la règle de pare-feu, la connexion a simplement expiré. Toute autre adresse sur Internet obtient ce même délai d'expiration.
5. Utiliser moins de RAM
Au repos, sans données à lui, MySQL 8.0 utilisait 383 Mo sur notre serveur. L'essentiel vient du Performance Schema, une fonction de diagnostic qui réserve de la mémoire d'avance. Sur un petit VPS, désactivez-le et fixez vous-même la taille du cache principal :
sudo tee /etc/mysql/mysql.conf.d/zz-small-vps.cnf >/dev/null <<'EOF'
[mysqld]
performance_schema = OFF
innodb_buffer_pool_size = 256M
max_connections = 50
EOF
sudo systemctl restart mysql
ps -o rss= -C mysqld
Après le redémarrage, il utilisait 165 Mo. Le buffer pool met en cache vos données et index, et 256 Mo conviennent à un serveur de 2 Go qui fait aussi tourner l'application. Augmentez-le si la base est l'élément principal du serveur et a dépassé la taille du cache. max_connections = 50 suffit largement pour une application avec un pool de connexions. Vous perdez les statistiques de performance_schema. Réactivez-le si vous devez un jour analyser des requêtes lentes en détail.
6. Sauvegardes chaque nuit
mysqldump --single-transaction prend une copie cohérente des tables InnoDB sans bloquer l'application. Mettez-le dans un petit script :
sudo tee /usr/local/bin/mysql-backup >/dev/null <<'EOF'
#!/bin/bash
set -euo pipefail
umask 077
mkdir -p /var/backups/mysql
mysqldump --single-transaction --routines --triggers app | gzip > /var/backups/mysql/app-$(date +%F).sql.gz
find /var/backups/mysql -name 'app-*.sql.gz' -mtime +14 -delete
EOF
sudo chmod 755 /usr/local/bin/mysql-backup
echo '0 3 * * * root /usr/local/bin/mysql-backup' | sudo tee /etc/cron.d/mysql-backup
sudo /usr/local/bin/mysql-backup && sudo ls -l /var/backups/mysql
Chaque ligne a sa raison d'être :
umask 077rend le dump lisible par root seulement (-rw-------), puisqu'il contient toutes vos données.pipefailfait échouer tout le script simysqldumpéchoue. Sans cela,gzipécrirait une minuscule archive vide et annoncerait un succès. Nous avons volontairement cassé la commande, et le script s'est terminé avec le code 2, comme prévu.find … -mtime +14 -deleteconserve deux semaines de copies.- Le script tourne en root, donc
mysqldumpse connecte par le socket et aucun mot de passe ne traîne dans un fichier.
Une sauvegarde jamais restaurée ne compte pas encore. Restaurez-la dans une base temporaire et regardez les données :
sudo mysql -e "CREATE DATABASE app_restore"
gunzip -c /var/backups/mysql/app-2026-10-25.sql.gz | sudo mysql app_restore
sudo mysql -e "SHOW TABLES FROM app_restore"
sudo mysql -e "DROP DATABASE app_restore"
Dans notre test, la table restaurée avait les mêmes lignes que l'originale. Des copies sur le même disque ne vous protègent pas si vous perdez le serveur, alors rapatriez-les de temps en temps sur une autre machine avec scp ou restic. Managed Backups ajoute par-dessus des points de restauration quotidiens de tout le serveur.
Quelle offre
Micro (2 vCPU, 2 Go, 25 Go, $5/mois) accueille MySQL réglé comme ci-dessus plus une application web. Si la base elle-même dépasse quelques gigaoctets, Small avec 4 Go et 35 Go pour $8/mois permet de donner 1 Go ou plus au buffer pool. Ce sont deux offres NAT, et le tunnel SSH de l'étape 3 y fonctionne. L'étape 4 demande votre propre IPv4 : Micro-IP coûte $10/mois.
Vous préférez PostgreSQL ? Le guide PostgreSQL suit le même plan. Toutes les offres sont dans la section VPS, et le paiement se fait en USDT, USDC ou ETH sur Base, Ethereum ou Polygon.
Commentaires
Pas encore de commentaires. Soyez le premier.