oxmysql non riesce a connettersi: ECONNREFUSED, accesso negato, database sconosciuto

oxmysql non si connette al tuo database FiveM? Risolvi ECONNREFUSED, ER_ACCESS_DENIED_ERROR e database sconosciuto con la giusta mysql_connection_string.

Quando il tuo server si avvia, oxmysql stampa uno di questi e ogni script che tocca il database fallisce dopo:

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'

Ogni riga significa qualcosa di diverso. Questa guida mostra come leggerle, come scrivere la stringa di connessione, e cosa controllare sul server del database.

La stringa di connessione

oxmysql ottiene tutto da un convar in server.cfg. La forma URL:

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

La forma key=value fa lo stesso:

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

Mettila sopra ensure oxmysql, e sopra qualsiasi script che usa il database:

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

ensure oxmysql
ensure ox_lib
ensure es_extended

Consiglio: le ricette di txAdmin creano questa riga per te. Se la modifichi a mano, mantieni le virgolette, e mantienila su una singola riga.

ECONNREFUSED: nulla è in ascolto

ECONNREFUSED significa che il server del database ha rifiutato la connessione o non è in esecuzione a quell'indirizzo e porta. Lavora attraverso questi in ordine:

  1. MariaDB o MySQL è in esecuzione? Su Windows con XAMPP, avvia MySQL nel pannello di controllo. Con un'installazione del servizio, controlla i Servizi. Su Linux:
bash
sudo systemctl status mariadb
# or: sudo systemctl status mysql
sudo systemctl start mariadb
  1. L'host e la porta sono giusti? localhost e 127.0.0.1 sono la stessa macchina, la porta predefinita è 3306. Se il tuo database è su un'altra macchina o un host gestito, usa il suo indirizzo e porta, e controlla che il suo firewall consenta l'IP del tuo server di gioco.
  2. Il database è associato all'indirizzo giusto? Se ascolta solo la macchina locale, un server di gioco remoto non può raggiungerlo.

ER_ACCESS_DENIED_ERROR: login sbagliato

Access denied for user significa che il server ha risposto, ma ha rifiutato l'utente, la password, o l'host da cui quell'utente può connettersi.

  • Controlla l'utente e la password accedendo tu stesso con gli stessi valori:
bash
mysql -u fivem -p -h 127.0.0.1
  • Crea un utente dedicato invece di usare root. Nella console di MariaDB o 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 utente è legato a un host. 'fivem'@'localhost' non può connettersi da un'altra macchina. Per un server di gioco remoto, crea l'utente per quell'host.
  • root su un'installazione Linux fresca spesso usa l'autenticazione socket, quindi un login per password sulla rete fallisce. Un utente separato evita il problema.

Caratteri speciali nella password

Nella forma mysql://, la password si trova dentro un URL. I caratteri con un significato negli URL lo rompono, e l'errore che ottieni è solitamente accesso negato. Codificali:

Carattere Scrivilo come
@ %40
# %23
/ %2F
: %3A
% %25
? %3F

Quindi la password p@ss#1 diventa:

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

Le alternative più semplici sono una password fatta solo di lettere e cifre, o la forma user=...;password=..., dove solo ; nella password è un problema.

Unknown database: il nome non esiste

Unknown database 'fivem' significa che il login ha funzionato, ma nessun database con quel nome esiste. Due cause:

  • Il nome è scritto male. Il nome nella stringa di connessione deve corrispondere esattamente. Su Linux, i nomi del database sono sensibili alle maiuscole.
  • Non l'hai mai creato. Crealo, poi importa il file SQL del tuo framework:
sql
CREATE DATABASE fivem CHARACTER SET utf8mb4;

Dopo di che, il prossimo problema è di solito tabelle mancanti, coperto in Table 'db.x' doesn't exist.

Controlla che sia funzionato

Riavvia oxmysql dalla console del server e leggi l'output:

text
restart oxmysql

Quando la connessione ha successo, oxmysql riporta la versione del server del database e nessun errore segue. Se uno script fallisce ancora, il problema è la query propria di quello script, non la connessione.

Ordine in server.cfg

oxmysql deve essere avviato prima di qualsiasi cosa che interroghi il database. Ecco l'ordine che funziona per un server ESX:

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

ensure oxmysql
ensure ox_lib
ensure es_extended
ensure my_script

Su QBCore o QBox, scambia es_extended con qb-core o qbx_core. Un core che si avvia prima di oxmysql può fallire con errori che sembrano problemi del framework, ad esempio quelli in ESX is nil.

Checklist

Sintomo Soluzione
ECONNREFUSED Avvia MariaDB o MySQL, poi controlla host e porta (127.0.0.1, 3306)
ER_ACCESS_DENIED_ERROR Utente, password o host sbagliato; crea un utente dedicato e concedigli il database
Unknown database Crea il database, e corrisponde il suo nome esattamente nella stringa
Fallisce solo con alcune password Codifica i caratteri speciali dell'URL, o usa la forma user=...;password=...
La stringa sembra ignorata Metti set mysql_connection_string sopra ensure oxmysql, su una riga
Si connette, ma le tabelle mancano Importa il file .sql in quel database

Risposte rapide

Dove va la riga mysql_connection_string?

In server.cfg, sopra la riga ensure oxmysql. oxmysql legge il convar quando si avvia, quindi una riga posizionata dopo viene letta troppo tardi.

La mia password ha un @ o # in essa e la connessione fallisce. Perché?

Nella forma mysql:// la password è parte di un URL, quindi i caratteri speciali devono essere codificati come URL: @ diventa %40, # diventa %23, / diventa %2F. La forma user=...;password=... non ha bisogno di codifica.

ESX e QBCore usano una stringa di connessione diversa?

No. ESX, QBCore e QBox leggono tutti la stessa variabile mysql_connection_string attraverso oxmysql. Solo il database che importi differisce.

Script senza questo problema

Item Creator V2Crea oggetti utilizzabili con animazioni, props, effetti e altro — senza scrivere codice.Vedi script →Shop CreatorCrea un negozio in meno di un minuto — proprietari, dipendenti, casseforti e rapine inclusi.Vedi script →

Continua a leggere