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ômeCause probableCorrectif
ER_ACCESS_DENIED_ERRORMauvais user/pass, host non autoriséVérifiez utilisateur, IP et mot de passe
connect ETIMEDOUTFirewall/port bloquéOuvrir 3306 entre les deux hôtes
Unknown databaseBase non crééeCréez la base et vérifiez le nom
MySQL server has gone awayTimeouts ou paquets trop grosAjustez wait_timeout et max_allowed_packet
Caractères cassésCharset incorrectForcer utf8mb4
Crash à la première requêteRessource non chargéeensure oxmysql avant les scripts
Erreur avec = dans mdpParsing convarUtiliser %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.