oxmysql не может подключиться: ECONNREFUSED, access denied, unknown database
oxmysql не подключится к вашей базе данных FiveM? Исправьте ECONNREFUSED, ER_ACCESS_DENIED_ERROR и unknown database с правильной mysql_connection_string.
Когда ваш сервер запускается, oxmysql печатает одно из этих и каждый скрипт, который трогает базу данных, не работает после неё:
Error: connect ECONNREFUSED 127.0.0.1:3306
ER_ACCESS_DENIED_ERROR: Access denied for user 'root'@'localhost' (using password: YES)
Unknown database 'fivem'Каждая строка означает что-то разное. Это руководство показывает, как их читать, как писать строку подключения и что проверять на сервере базы данных.
Строка подключения
oxmysql получает всё из одного convar в server.cfg. Форма URL:
set mysql_connection_string "mysql://user:password@localhost/dbname?charset=utf8mb4"Форма key=value делает то же самое:
set mysql_connection_string "user=fivem;password=yourpassword;host=127.0.0.1;port=3306;database=fivem"Поместите её выше ensure oxmysql и выше любого скрипта, который использует базу данных:
set mysql_connection_string "mysql://fivem:yourpassword@localhost/fivem?charset=utf8mb4"
ensure oxmysql
ensure ox_lib
ensure es_extendedСовет: рецепты txAdmin создают эту строку для вас. Если вы редактируете её вручную, сохраняйте кавычки и держите её в одной строке.
ECONNREFUSED: ничего не слушает
ECONNREFUSED означает, что сервер базы данных отказал в подключении или не запущен по этому адресу и порту. Работайте с этими в порядке:
- Запущены ли MariaDB или MySQL? На Windows с XAMPP запустите MySQL в панели управления. С установкой сервиса проверьте Services. На Linux:
sudo systemctl status mariadb
# or: sudo systemctl status mysql
sudo systemctl start mariadb- Правильны ли хост и порт?
localhostи127.0.0.1— это одна и та же машина, порт по умолчанию —3306. Если ваша база данных находится на другой машине или управляемом хосте, используйте её адрес и порт, и проверьте, что её брандмауэр позволяет IP вашего сервера игры. - Привязана ли база данных к правильному адресу? Если она только слушает на локальной машине, удалённый сервер игры не может её достичь.
ER_ACCESS_DENIED_ERROR: неправильный вход
Access denied for user означает, что сервер ответил, но отклонил пользователя, пароль или хост, с которого этому пользователю разрешено подключаться.
- Проверьте пользователя и пароль, войдя сами с теми же значениями:
mysql -u fivem -p -h 127.0.0.1- Создайте выделенного пользователя вместо использования
root. В консоли MariaDB или MySQL:
CREATE DATABASE fivem CHARACTER SET utf8mb4;
CREATE USER 'fivem'@'localhost' IDENTIFIED BY 'yourpassword';
GRANT ALL PRIVILEGES ON fivem.* TO 'fivem'@'localhost';
FLUSH PRIVILEGES;- Пользователь привязан к хосту.
'fivem'@'localhost'не может подключиться с другой машины. Для удалённого сервера игры создайте пользователя для этого хоста. rootна свежей Linux установке часто использует аутентификацию сокетов, поэтому вход по паролю через сеть не работает. Отдельный пользователь избегает проблемы.
Специальные символы в пароле
В форме mysql:// пароль находится внутри URL. Символы с значением в URL ломают его, и ошибка, которую вы получаете, обычно access denied. Кодируйте их:
| Символ | Напишите как |
|---|---|
@ |
%40 |
# |
%23 |
/ |
%2F |
: |
%3A |
% |
%25 |
? |
%3F |
Поэтому пароль p@ss#1 становится:
set mysql_connection_string "mysql://fivem:p%40ss%231@localhost/fivem?charset=utf8mb4"Простейшие альтернативы — пароль, состоящий только из букв и цифр, или форма user=...;password=..., где только ; в пароле проблема.
Unknown database: имя не существует
Unknown database 'fivem' означает, что вход работал, но база данных с этим именем не существует. Две причины:
- Имя написано неправильно. Имя в строке подключения должно совпадать точно. На Linux, имена баз данных чувствительны к регистру.
- Вы никогда не создали её. Создайте её, затем импортируйте файл SQL вашего фреймворка в неё:
CREATE DATABASE fivem CHARACTER SET utf8mb4;После этого, следующая проблема обычно отсутствующие таблицы, рассмотрено в Table 'db.x' doesn't exist.
Проверьте, что это сработало
Перезагрузите oxmysql из консоли сервера и прочитайте вывод:
restart oxmysqlКогда подключение успешно, oxmysql сообщает версию сервера базы данных и никакая ошибка не следует. Если скрипт всё ещё не работает, проблема в собственном запросе этого скрипта, а не в подключении.
Порядок в server.cfg
oxmysql должен быть запущен перед всем, что запрашивает базу данных. Вот порядок, который работает для сервера ESX:
set mysql_connection_string "mysql://fivem:yourpassword@localhost/fivem?charset=utf8mb4"
ensure oxmysql
ensure ox_lib
ensure es_extended
ensure my_scriptНа QBCore или QBox замените es_extended на qb-core или qbx_core. Ядро, которое запускается перед oxmysql, может не работать с ошибками, которые выглядят как проблемы фреймворка, например те в ESX is nil.
Контрольный список
| Симптом | Решение |
|---|---|
ECONNREFUSED |
Запустите MariaDB или MySQL, затем проверьте хост и порт (127.0.0.1, 3306) |
ER_ACCESS_DENIED_ERROR |
Неправильный пользователь, пароль или хост; создайте выделенного пользователя и дайте ему права на базу данных |
Unknown database |
Создайте базу данных и совпадите её имя точно в строке |
| Не работает только с некоторыми паролями | Кодируйте URL специальные символы, или используйте форму user=...;password=... |
| Строка кажется игнорируемой | Поместите set mysql_connection_string выше ensure oxmysql в одну строку |
| Подключается, но таблицы отсутствуют | Импортируйте файл .sql в эту базу данных |
Короткие ответы
Куда идёт строка mysql_connection_string?
В server.cfg, выше строки ensure oxmysql. oxmysql читает convar при запуске, поэтому строка размещённая после прочитывается слишком поздно.
Мой пароль содержит @ или # и подключение не работает. Почему?
В форме mysql:// пароль является частью URL, поэтому специальные символы должны быть закодированы: @ становится %40, # становится %23, / становится %2F. Форма user=...;password=... не нуждается в кодировании.
ESX и QBCore используют другую строку подключения?
Нет. ESX, QBCore и QBox все читают один и тот же convar mysql_connection_string через oxmysql. Отличается только база данных, которую вы импортируете.

