Connexion d’un serveur FiveM à MySQL
Published on September 24, 2025 at 05:56 PM

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 :
```sql
-- 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 :
```conf
bind-address = 0.0.0.0
```
Redémarrez MySQL :
```bash
systemctl restart mysql
```
### 1.3. Tester la connectivité depuis le serveur FiveM
```bash
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
```cfg
# --- 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
```cfg
# --- 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) :
```lua
-- 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)
```
3. 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
```cfg
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
```cfg
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.


















