Connexion d’un serveur FiveM à MySQL

Cet article est un guide complet pour connecter un serveur FiveM à une base de données MySQL/MariaDB.
1) Pré-requis côté MySQL (serveur de BDD)
1.1. Créer la base et l’utilisateur minimal
Sur votre hôte MySQL/MariaDB :
-- 1) Créez la base
CREATE DATABASE bdd_test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 2) Créez un utilisateur dédié (remplacez IP_DU_SERVEUR_FIVEM par l'IP source)
CREATE USER 'utilisateur'@'IP_DU_SERVEUR_FIVEM' IDENTIFIED BY 'motdepasseSolide';
-- 3) Droits minimaux sur cette base (principe du moindre privilège)
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, INDEX, ALTER
ON bdd_test.* TO 'utilisateur'@'IP_DU_SERVEUR_FIVEM';
FLUSH PRIVILEGES;
Notes sécurité
- Un utilisateur par application (pas de compte root !).
- Limiter l’hôte à l’IP de votre machine FiveM, pas
%. - Mot de passe robuste (≥ 16 caractères, aléatoire).
- Pare-feu : n’ouvrez le port 3306 qu’entre votre serveur FiveM et MySQL.
- TLS (optionnel mais recommandé si trafic hors LAN/VXLAN/GRE) : activez SSL côté MySQL et ajoutez
ssl=truedans la chaîne de connexion (oxmysql).
1.2. Autoriser la connexion distante (si MySQL n’est pas local)
Vérifiez bind-address dans /etc/mysql/mysql.conf.d/mysqld.cnf (ou équivalent).
Pour autoriser les connexions distantes contrôlées par firewall :
bind-address = 0.0.0.0
Redémarrez MySQL :
systemctl restart mysql
1.3. Tester la connectivité depuis le serveur FiveM
mysql -h 89.213.175.25 -u utilisateur -p bdd_test -e "SELECT 1;"
2) Choisir votre ressource MySQL pour FiveM
Il existe deux formats de chaînes courants :
a) mysql-async (ancien/legacy)
Format style “semicolon DSN” :
set mysql_connection_string "server=89.213.175.25;database=bdd_test;userid=utilisateur;password=password1"
b) oxmysql (recommandé aujourd’hui)
Format URI (plus fiable et plus riche en options) :
set mysql_connection_string "mysql://utilisateur:[email protected]/bdd_test?charset=utf8mb4"
⚠️ À propos d’oxmysql et du caractère =
Évitez = dans le mot de passe. Si vous ne pouvez pas le changer, encodez-le en URL encoding (= devient %3D). Exemple :
mot=de=passe → mot%3Dde%3Dpasse
Caractères utiles :
@→%40:→%3A/→%2F?→%3F&→%26#→%23
3) Configuration côté server.cfg
3.1. Ordre de chargement recommandé
Placez la chaîne de connexion en haut du fichier, avant les ressources qui en ont besoin.
Pour mysql-async
# --- Base MySQL (mysql-async) ---
set mysql_connection_string "server=89.213.175.25;database=bdd_test;userid=utilisateur;password=password1;ssl=false"
# Optionnel: port (si non 3306)
# ;port=3307
# Charger la ressource
ensure mysql-async
# puis vos scripts dépendants...
Pour oxmysql
# --- Base MySQL (oxmysql) ---
set mysql_connection_string "mysql://utilisateur:[email protected]/bdd_test?charset=utf8mb4"
# Réglages utiles (convars) :
setr mysql_debug false
setr mysql_log_level 2
setr mysql_slow_query_warning 200
# setr mysql_transaction_isolation_level 2
ensure oxmysql
# puis vos scripts dépendants...
Astuce : utilisez set pour la chaîne de connexion (secret), et setr pour les variables non sensibles.
4) Démarrer / Redémarrer proprement
Après modification du server.cfg :
- Redémarrez la stack FiveM.
- Surveillez les logs au démarrage pour repérer d’éventuelles erreurs SQL.
5) Vérifications de santé
- Connexion OK : au boot, mysql-async/oxmysql doit s’initialiser sans erreur.
- Test simple (dans une ressource de test) :
-- mysql-async (exemple)
MySQL.Async.fetchAll('SELECT 1 AS ok', {}, function(rows)
print(('MySQL test: %s'):format(rows and rows[1] and rows[1].ok or 'fail'))
end)
-- oxmysql (exemple)
exports.oxmysql:fetch('SELECT 1 AS ok', {}, function(rows)
print(('MySQL test: %s'):format(rows and rows[1] and rows[1].ok or 'fail'))
end)
- Vérifiez que l’encodage est bien en
utf8mb4.
6) Performance & robustesse
- utf8mb4 partout (BDD/Table/Connexion).
- Indexez les colonnes utilisées dans
WHERE/JOIN. - Utilisez les transactions pour les opérations atomiques.
- Surveillez les requêtes lentes.
- Limitez le flood de requêtes synchro, privilégiez l’async.
- Ajustez
wait_timeoutetmax_allowed_packet. - Mettez en place des migrations SQL avant de lancer le serveur.
7) Dépannage (checklist)
| Symptôme | Cause probable | Correctif |
|---|---|---|
| ER_ACCESS_DENIED_ERROR | Mauvais user/pass, host non autorisé | Vérifiez utilisateur, IP et mot de passe |
| connect ETIMEDOUT | Firewall/port bloqué | Ouvrir 3306 entre les deux hôtes |
| Unknown database | Base non créée | Créez la base et vérifiez le nom |
| MySQL server has gone away | Timeouts ou paquets trop gros | Ajustez wait_timeout et max_allowed_packet |
| Caractères cassés | Charset incorrect | Forcer utf8mb4 |
| Crash à la première requête | Ressource non chargée | ensure oxmysql avant les scripts |
Erreur avec = dans mdp | Parsing convar | Utiliser %3D ou changer le mot de passe |
8) Exemples prêts à l’emploi
8.1. mysql-async
set mysql_connection_string "server=89.213.175.25;database=bdd_test;userid=utilisateur;password=password1;ssl=false"
ensure mysql-async
ensure votre_ressource
8.2. oxmysql
set mysql_connection_string "mysql://utilisateur:[email protected]/bdd_test?charset=utf8mb4"
setr mysql_debug false
setr mysql_log_level 2
setr mysql_slow_query_warning 200
ensure oxmysql
ensure votre_ressource
9) Bonnes pratiques opérationnelles
- Sauvegardes régulières testées.
- Monitoring MySQL (CPU, InnoDB buffer pool, connexions).
- Logs d’erreurs tournants.
- Mises à jour planifiées.
- Séparer dev / préprod / prod.


















