oxmysql não consegue conectar: ECONNREFUSED, access denied, unknown database
oxmysql não se conecta ao seu banco de dados FiveM? Corrija ECONNREFUSED, ER_ACCESS_DENIED_ERROR e unknown database com a string mysql_connection_string correta.
Quando seu servidor começa, oxmysql imprime um desses e cada script que toca o banco de dados falha depois:
Error: connect ECONNREFUSED 127.0.0.1:3306
ER_ACCESS_DENIED_ERROR: Access denied for user 'root'@'localhost' (using password: YES)
Unknown database 'fivem'Cada linha significa algo diferente. Este guia mostra como lê-las, como escrever a string de conexão e o que verificar no servidor de banco de dados.
A string de conexão
oxmysql recebe tudo de uma convar em server.cfg. A forma URL:
set mysql_connection_string "mysql://user:password@localhost/dbname?charset=utf8mb4"A forma chave=valor faz o mesmo:
set mysql_connection_string "user=fivem;password=yourpassword;host=127.0.0.1;port=3306;database=fivem"Coloque-a acima de ensure oxmysql, e acima de qualquer script que use o banco de dados:
set mysql_connection_string "mysql://fivem:yourpassword@localhost/fivem?charset=utf8mb4"
ensure oxmysql
ensure ox_lib
ensure es_extendedDica: as receitas txAdmin criam essa linha para você. Se editar à mão, mantenha as aspas e mantenha em uma única linha.
ECONNREFUSED: nada está escutando
ECONNREFUSED significa que o servidor de banco de dados recusou a conexão ou não está rodando nesse endereço e porta. Trabalhe através destes em ordem:
- MariaDB ou MySQL está rodando? No Windows com XAMPP, inicie MySQL no painel de controle. Com uma instalação de serviço, verifique Serviços. No Linux:
sudo systemctl status mariadb
# or: sudo systemctl status mysql
sudo systemctl start mariadb- O host e porta estão certos?
localhoste127.0.0.1são a mesma máquina, a porta padrão é3306. Se seu banco de dados está em outra máquina ou host gerenciado, use seu endereço e porta, e verifique que seu firewall permite o IP do seu servidor de jogo. - O banco de dados está vinculado ao endereço certo? Se ele só escuta na máquina local, um servidor de jogo remoto não pode alcançá-lo.
ER_ACCESS_DENIED_ERROR: login errado
Access denied for user significa que o servidor respondeu, mas rejeitou o usuário, a senha ou o host do qual esse usuário é permitido conectar.
- Verifique o usuário e senha fazendo login você mesmo com os mesmos valores:
mysql -u fivem -p -h 127.0.0.1- Crie um usuário dedicado em vez de usar
root. No console MariaDB ou MySQL:
CREATE DATABASE fivem CHARACTER SET utf8mb4;
CREATE USER 'fivem'@'localhost' IDENTIFIED BY 'yourpassword';
GRANT ALL PRIVILEGES ON fivem.* TO 'fivem'@'localhost';
FLUSH PRIVILEGES;- Um usuário está vinculado a um host.
'fivem'@'localhost'não pode conectar de outra máquina. Para um servidor de jogo remoto, crie o usuário para esse host em vez disso. rootem uma instalação fresca do Linux frequentemente usa autenticação de socket, então um login de senha sobre a rede falha. Um usuário separado evita o problema.
Caracteres especiais na senha
Na forma mysql://, a senha fica dentro de uma URL. Caracteres com significado em URLs a quebram, e o erro que você recebe geralmente é access denied. Codifique-os:
| Caractere | Escreva como |
|---|---|
@ |
%40 |
# |
%23 |
/ |
%2F |
: |
%3A |
% |
%25 |
? |
%3F |
Então a senha p@ss#1 se torna:
set mysql_connection_string "mysql://fivem:p%40ss%231@localhost/fivem?charset=utf8mb4"As alternativas mais simples são uma senha feita apenas de letras e dígitos, ou a forma user=...;password=..., onde apenas ; na senha é um problema.
Unknown database: o nome não existe
Unknown database 'fivem' significa que o login funcionou, mas nenhum banco de dados com esse nome existe. Duas causas:
- O nome está escrito errado. O nome na string de conexão deve corresponder exatamente. No Linux, nomes de banco de dados são sensíveis a maiúsculas.
- Você nunca criou. Crie-o, depois importe o arquivo SQL de seu framework nele:
CREATE DATABASE fivem CHARACTER SET utf8mb4;Depois disso, o próximo problema é geralmente tabelas faltando, coberto em Table 'db.x' doesn't exist.
Verifique que funcionou
Reinicie oxmysql do console do servidor e leia a saída:
restart oxmysqlQuando a conexão sucessão, oxmysql relata a versão do servidor de banco de dados e nenhum erro segue. Se um script ainda falha, o problema é a própria query daquele script, não a conexão.
Ordem em server.cfg
oxmysql tem que ser iniciado antes de qualquer coisa que consulte o banco de dados. Aqui está a ordem que funciona para um servidor ESX:
set mysql_connection_string "mysql://fivem:yourpassword@localhost/fivem?charset=utf8mb4"
ensure oxmysql
ensure ox_lib
ensure es_extended
ensure my_scriptEm QBCore ou QBox, troque es_extended por qb-core ou qbx_core. Um core que começar antes de oxmysql pode falhar com erros que parecem problemas de framework, por exemplo os em ESX is nil.
Lista de verificação
| Sintoma | Solução |
|---|---|
ECONNREFUSED |
Inicie MariaDB ou MySQL, depois verifique host e porta (127.0.0.1, 3306) |
ER_ACCESS_DENIED_ERROR |
Usuário, senha ou host errado; crie um usuário dedicado e conceda a ele o banco de dados |
Unknown database |
Crie o banco de dados e corresponda seu nome exatamente na string |
| Falha apenas com algumas senhas | Codifique caracteres especiais em URL, ou use a forma user=...;password=... |
| String parece ignorada | Coloque set mysql_connection_string acima de ensure oxmysql, em uma linha |
| Conecta, mas tabelas faltam | Importe o arquivo .sql naquele banco de dados |
Respostas rápidas
Onde vai a linha mysql_connection_string?
Em server.cfg, acima da linha ensure oxmysql. oxmysql lê o convar quando começar, então uma linha colocada após é lida muito tarde.
Minha senha tem @ ou # e a conexão falha. Por quê?
Na forma mysql:// a senha é parte de uma URL, então caracteres especiais devem ser codificados em URL: @ se torna %40, # se torna %23, / se torna %2F. A forma user=...;password=... não precisa de codificação.
ESX e QBCore usam uma string de conexão diferente?
Não. ESX, QBCore e QBox todos leem a mesma convar mysql_connection_string através de oxmysql. Apenas o banco de dados que você importa para difere.

