oxmysql ne peut pas se connecter : ECONNREFUSED, accès refusé, base de données inconnue

oxmysql ne veut pas se connecter à votre base de données FiveM ? Corriger ECONNREFUSED, ER_ACCESS_DENIED_ERROR et base de données inconnue avec la bonne mysql_connection_string.

Quand votre serveur démarre, oxmysql imprime l'une de celles-ci et chaque script qui touche la base de données échoue après :

text
Error: connect ECONNREFUSED 127.0.0.1:3306
ER_ACCESS_DENIED_ERROR: Access denied for user 'root'@'localhost' (using password: YES)
Unknown database 'fivem'

Chaque ligne signifie quelque chose de différent. Ce guide montre comment les lire, comment écrire la chaîne de connexion, et quoi vérifier sur le serveur de base de données.

La chaîne de connexion

oxmysql obtient tout d'une seule convar dans server.cfg. La forme URL :

cfg
set mysql_connection_string "mysql://user:password@localhost/dbname?charset=utf8mb4"

La forme key=value fait la même chose :

cfg
set mysql_connection_string "user=fivem;password=yourpassword;host=127.0.0.1;port=3306;database=fivem"

Mettez-le au-dessus de ensure oxmysql, et au-dessus de tout script qui utilise la base de données :

cfg
set mysql_connection_string "mysql://fivem:yourpassword@localhost/fivem?charset=utf8mb4"

ensure oxmysql
ensure ox_lib
ensure es_extended

Astuce : les recettes txAdmin créent cette ligne pour vous. Si vous l'éditez à la main, gardez les guillemets, et gardez-la sur une seule ligne.

ECONNREFUSED : rien n'écoute

ECONNREFUSED signifie que le serveur de base de données a refusé la connexion ou ne s'exécute pas à cette adresse et ce port. Vérifiez-les dans l'ordre :

  1. MariaDB ou MySQL s'exécute-t-il ? Sous Windows avec XAMPP, démarrez MySQL dans le panneau de contrôle. Avec une installation de service, vérifiez Services. Sous Linux :
bash
sudo systemctl status mariadb
# or: sudo systemctl status mysql
sudo systemctl start mariadb
  1. L'hôte et le port sont-ils correct ? localhost et 127.0.0.1 sont la même machine, le port par défaut est 3306. Si votre base de données est sur une autre machine ou un hôte géré, utilisez son adresse et son port, et vérifiez que son pare-feu autorise l'IP de votre serveur de jeu.
  2. La base de données est-elle liée à la bonne adresse ? Si elle n'écoute que sur la machine locale, un serveur de jeu distant ne peut pas la atteindre.

ER_ACCESS_DENIED_ERROR : connexion incorrecte

Access denied for user signifie que le serveur a répondu, mais a rejeté l'utilisateur, le mot de passe, ou l'hôte à partir duquel cet utilisateur est autorisé à se connecter.

  • Vérifiez l'utilisateur et le mot de passe en vous connectant vous-même avec les mêmes valeurs :
bash
mysql -u fivem -p -h 127.0.0.1
  • Créez un utilisateur dédié au lieu d'utiliser root. Dans la console MariaDB ou MySQL :
sql
CREATE DATABASE fivem CHARACTER SET utf8mb4;
CREATE USER 'fivem'@'localhost' IDENTIFIED BY 'yourpassword';
GRANT ALL PRIVILEGES ON fivem.* TO 'fivem'@'localhost';
FLUSH PRIVILEGES;
  • Un utilisateur est lié à un hôte. 'fivem'@'localhost' ne peut pas se connecter à partir d'une autre machine. Pour un serveur de jeu distant, créez l'utilisateur pour cet hôte.
  • root sur une installation Linux fraîche utilise souvent l'authentification par socket, donc une connexion par mot de passe sur le réseau échoue. Un utilisateur séparé évite le problème.

Caractères spéciaux dans le mot de passe

Dans la forme mysql://, le mot de passe se trouve dans une URL. Les caractères ayant un sens dans les URL le cassent, et l'erreur que vous obtenez est généralement accès refusé. Encodez-les :

Caractère Écrivez-le comme
@ %40
# %23
/ %2F
: %3A
% %25
? %3F

Donc le mot de passe p@ss#1 devient :

cfg
set mysql_connection_string "mysql://fivem:p%40ss%231@localhost/fivem?charset=utf8mb4"

Les alternatives les plus simples sont un mot de passe composé uniquement de lettres et de chiffres, ou la forme user=...;password=..., où seul le ; dans le mot de passe est un problème.

Base de données inconnue : le nom n'existe pas

Unknown database 'fivem' signifie que la connexion a fonctionné, mais aucune base de données avec ce nom n'existe. Deux causes :

  • Le nom est mal orthographié. Le nom dans la chaîne de connexion doit correspondre exactement. Sous Linux, les noms de bases de données sont sensibles à la casse.
  • Vous ne l'avez jamais créée. Créez-la, puis importez le fichier SQL de votre framework dans :
sql
CREATE DATABASE fivem CHARACTER SET utf8mb4;

Après cela, le problème suivant est généralement les tables manquantes, couvert dans Table 'db.x' doesn't exist.

Vérifier que cela a fonctionné

Redémarrez oxmysql à partir de la console du serveur et lisez la sortie :

text
restart oxmysql

Quand la connexion réussit, oxmysql signale la version du serveur de base de données et aucune erreur ne suit. Si un script échoue toujours, le problème est la propre requête de ce script, pas la connexion.

Ordre dans server.cfg

oxmysql doit être démarré avant tout ce qui interroge la base de données. Voici l'ordre qui fonctionne pour un serveur ESX :

cfg
set mysql_connection_string "mysql://fivem:yourpassword@localhost/fivem?charset=utf8mb4"

ensure oxmysql
ensure ox_lib
ensure es_extended
ensure my_script

Sur QBCore ou QBox, remplacez es_extended par qb-core ou qbx_core. Un core qui démarre avant oxmysql peut échouer avec des erreurs qui semblent être des problèmes de framework, par exemple ceux dans ESX is nil.

Liste de contrôle

Symptôme Correction
ECONNREFUSED Démarrer MariaDB ou MySQL, puis vérifier l'hôte et le port (127.0.0.1, 3306)
ER_ACCESS_DENIED_ERROR Utilisateur, mot de passe ou hôte incorrect ; créer un utilisateur dédié et lui accorder la base de données
Unknown database Créer la base de données, et correspondre exactement à son nom dans la chaîne
Échoue seulement avec certains mots de passe Encoder les caractères spéciaux en URL, ou utiliser la forme user=...;password=...
La chaîne semble ignorée Mettez set mysql_connection_string au-dessus de ensure oxmysql, sur une seule ligne
Se connecte, mais les tables manquent Importer le fichier .sql dans cette base de données

Réponses rapides

Où va la ligne mysql_connection_string ?

Dans server.cfg, au-dessus de la ligne ensure oxmysql. oxmysql lit la convar au démarrage, donc une ligne placée après est lue trop tard.

Mon mot de passe a un @ ou # dedans et la connexion échoue. Pourquoi ?

Dans la forme mysql:// le mot de passe est une partie d'une URL, donc les caractères spéciaux doivent être codés en URL : @ devient %40, # devient %23, / devient %2F. La forme user=...;password=... n'a pas besoin de codage.

ESX et QBCore utilisent-ils une chaîne de connexion différente ?

Non. ESX, QBCore et QBox lisent tous la même convar mysql_connection_string via oxmysql. Seule la base de données dans laquelle vous importez diffère.

Des scripts sans ce problème

Item Creator V2Créez des items utilisables avec animations, props, effets et plus — sans écrire une ligne de code.Voir le script →Shop CreatorCréez un magasin en moins d’une minute — propriétaires, employés, coffres et braquages inclus.Voir le script →

À lire aussi