## 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.