Installer et configurer oxmysql sur FiveM

Installer et configurer oxmysql sur FiveM

oxmysql est le driver MySQL moderne pour FiveM, remplacement de l'ancien mysql-async. Setup complet sur Wisp chez VeryCloud, premiers exports, et bonnes pratiques pour ressources tierces.

Introduction

mysql-async était la référence il y a 5 ans. Aujourd'hui, oxmysql (par Overextended) est plus rapide, mieux maintenu, supporte les promesses async/await natives, et est devenu le standard de fait. Si tu démarres un serveur en 2026, c'est lui.

Prérequis

  • Un serveur FiveM chez VeryCloud
  • Une BDD MySQL/MariaDB accessible (voir le tuto fivem-sql sur la doc pour la BDD)
  • Accès Files et Startup dans Wisp

Étape 1 : Télécharger oxmysql

oxmysql est sur GitHub :

Télécharge oxmysql.zip (le release officiel, pas le source).

Étape 2 : Uploader

Dans Wisp → Files/resources/ :

  1. Crée le dossier [mysql] (organisation) si pas déjà
  2. Upload + extract oxmysql.zip → renomme en oxmysql

Structure :

/resources/
└── [mysql]/
    └── oxmysql/
        ├── fxmanifest.lua
        ├── lib/
        ├── dist/
        └── README.md

Étape 3 : Configurer la connexion

Dans /server.cfg, ajoute la connection string AVANT le ensure oxmysql :

set mysql_connection_string "mysql://user:password@host:3306/database?charset=utf8mb4"
ensure oxmysql

Exemple concret :

set mysql_connection_string "mysql://fivem_user:[email protected]:3306/fivem_db?charset=utf8mb4"

💡 Échappement : si ton mot de passe contient @, :, /, ?, il faut l'URL-encoder. Préfère un mdp alphanumérique.

Étape 4 : Restart et vérifier

Restart le serveur. Console FXServer :

[oxmysql] Connection established
[oxmysql] Database 'fivem_db' is ready

Si erreur :

  • Access denied : mauvais credentials ou IP source pas dans les GRANT MySQL
  • Connection refused : port 3306 firewallé ou MySQL down
  • Unknown database : la BDD n'existe pas

Étape 5 : Vérifier les exports

oxmysql expose des fonctions globales via FiveM exports. Test en jeu (chat F8) :

exports.oxmysql:query('SELECT 1+1 AS result', {}, function(rs) print(json.encode(rs)) end)

Si tu vois [{"result":2}] dans la console, c'est bon.

Étape 6 : Les méthodes principales

oxmysql expose plusieurs méthodes selon l'usage :

MéthodeUsage
oxmysql:queryQuery générique, retourne array de rows
oxmysql:executeINSERT/UPDATE/DELETE, retourne affectedRows
oxmysql:singleSELECT qui ne retourne qu'une ligne (premier résultat)
oxmysql:scalarSELECT qui ne retourne qu'une seule valeur (premier champ première ligne)
oxmysql:insertINSERT, retourne insertId
oxmysql:transactionWrapper pour transactions atomiques

Étape 7 : Exemples Lua

SELECT simple :

exports.oxmysql:query(
    'SELECT money FROM players WHERE identifier = ?',
    { 'steam:110000XXX' },
    function(rs)
        if rs and rs[1] then
            print('Money:', rs[1].money)
        else
            print('Player not found')
        end
    end
)

INSERT :

local insertId = exports.oxmysql:insert_async(
    'INSERT INTO logs (action, player, timestamp) VALUES (?, ?, NOW())',
    { 'login', 'steam:110000XXX' }
)
print('Inserted id:', insertId)

Async/await pattern (CitizenFX) :

local result = MySQL.query.await(
    'SELECT * FROM players WHERE identifier = ?',
    { 'steam:110000XXX' }
)
-- result est dispo directement, pas de callback

Étape 8 : Migration depuis mysql-async

Si tu as un vieux code mysql-async, les API sont compatibles à 90% :

mysql-asyncoxmysql
MySQL.Async.fetchAllMySQL.query
MySQL.Async.executeMySQL.execute
MySQL.Async.insertMySQL.insert
MySQL.Sync.fetchAllMySQL.query.await

Remplace mysql-async par oxmysql dans server.cfg et la majorité de ton code marche tel quel.

Étape 9 : Performance et pooling

oxmysql gère automatiquement un pool de connexions. Tu peux le tuner via :

set mysql_connection_string "mysql://user:pass@host:3306/db?charset=utf8mb4"
set mysql_debug "false"            # true pour logger toutes les queries (debug only)
set mysql_slow_query_warning 250   # avertir si query > 250ms

⚠️ mysql_debug "true" en prod = log spam énorme et perf killée. Réservé au debug.

Étape 10 : Bonnes pratiques

  • Toujours utiliser des placeholders (?) : protection SQL injection
  • Indexer les colonnes sur lesquelles tu filtres souvent (CREATE INDEX idx_identifier ON players(identifier))
  • Connexion locale > distante : si possible, BDD sur le même node que FiveM (latence réseau divisée par 100)
  • Monitoring : active slow_query_warning pour détecter les queries lentes

Dépannage

Access denied for user

  • Mauvais user/mdp
  • L'IP du serveur FiveM doit être dans les GRANT
  • Test depuis le node FiveM : mysql -h HOST -u USER -p

Can't connect to MySQL server

  • Port 3306 bloqué (firewall)
  • BDD pas démarrée

Queries qui plantent silencieusement

  • Active set mysql_debug "true" temporairement
  • Regarde la console FXServer pour les erreurs SQL

Latence anormalement haute

  • BDD géographiquement éloignée (préfère colocalisée)
  • Trop de queries non-async qui bloquent

Commandes utiles

# Tester la connexion depuis le serveur FiveM (si shell)
mysql -h HOST -u USER -p

# Voir les processus MySQL en cours (cote BDD)
SHOW PROCESSLIST;

# Logs lents MySQL
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 0.5;

Conclusion

oxmysql = standard 2026 pour FiveM. Plus rapide, plus moderne, support natif async/await. Installation en 10 min, BDD bien indexée, queries préparées : tu as une base data layer solide pour tout ton serveur. Migrer depuis mysql-async est trivial.

Pour aller plus loin : transactions atomiques, prepared statement caching, monitoring des slow queries via Prometheus.

Ressources

Rejoignez notre serveur communautaire Discord

Pour toute question, suggestion ou simplement pour discuter avec la communauté, rejoignez-nous sur Discord !

900+Membres