Connexion d’un serveur FiveM à MySQL

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=true dans 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é

  1. Connexion OK : au boot, mysql-async/oxmysql doit s’initialiser sans erreur.
  2. 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)
  1. 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_timeout et max_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.

Join our Discord community server

For any questions, suggestions, or just to chat with the community, join us on Discord!

900+Members