Подключение MySQL к серверу MTA:SA — настройка базы данных
Подключение базы данных MySQL к серверу MTA:SA необходимо большинству Role Play, RPG, DayZ и других крупных игровых режимов. В базе хранятся аккаунты, персонажи, деньги, транспорт, имущество, организации, инвентарь, наказания и другие данные проекта.
Настройка состоит из нескольких этапов: установка MySQL или MariaDB, создание отдельной базы и пользователя, импорт SQL-таблиц, подключение через функцию dbConnect, проверка запросов и устранение ошибок соединения.
Инструкция подходит для MTA:SA Server 1.6 на Windows и Linux. Она охватывает локальную базу на одном компьютере с сервером, удалённую базу на другом VPS и подключение готовой серверной сборки.
Сначала установите и настройте MTA Server:
Основная настройка сервера:
Зачем серверу MTA нужна база данных MySQL
Чистый MTA Server может работать без внешней MySQL. Однако сложные игровые режимы обычно должны постоянно хранить большое количество связанных данных.
В базе могут храниться
- игровые аккаунты;
- персонажи пользователей;
- уровень и опыт;
- игровая валюта;
- банковские счета;
- транспорт;
- дома и квартиры;
- бизнесы;
- предметы инвентаря;
- организации и должности;
- административные наказания;
- история действий;
- настройки персонажей;
- промокоды и награды.
MySQL позволяет нескольким ресурсам работать с общими таблицами, выполнять выборку, добавление, изменение и удаление записей.
Пример связи игровых систем
Таблица аккаунтов содержит данные авторизации, таблица персонажей связывается с аккаунтом, транспорт связывается с персонажем, а имущество может ссылаться на владельца через его числовой идентификатор.
accounts
└── characters
├── vehicles
├── houses
├── inventory
└── punishments
Что выбрать: MySQL, MariaDB или SQLite
| Система | Применение | Особенности |
|---|---|---|
| MySQL | Публичные серверы и готовые сборки | Подходит для локального и удалённого подключения. |
| MariaDB | VPS на Linux и игровые хостинги | Совместима с большинством обычных MySQL-сборок. |
| SQLite | Небольшие ресурсы и локальные проекты | Не требует отдельной серверной службы. |
Если готовая сборка требует MySQL, обычно можно использовать MySQL Server или MariaDB. Но перед переносом крупного проекта необходимо проверить совместимость SQL-файлов, типов данных, кодировки и используемых функций.
Когда подходит SQLite
- небольшой автономный ресурс;
- локальное тестирование;
- малое количество данных;
- нет необходимости подключаться извне;
- не используется готовая MySQL-схема.
Когда лучше MySQL или MariaDB
- установлена готовая RP-сборка;
- данные используют несколько ресурсов;
- нужна phpMyAdmin или другая панель;
- база находится на отдельном сервере;
- требуется удобное резервное копирование;
- планируется большой объём записей.
Где разместить базу данных
На одном сервере с MTA
Это самый простой и безопасный вариант для небольшого проекта:
MTA Server: 127.0.0.1
MySQL Server: 127.0.0.1
MySQL port: 3306
Соединение не выходит в интернет, поэтому порт MySQL не требуется открывать для всех внешних адресов.
На отдельном VPS
MTA Server: 203.0.113.25
MySQL Server: 203.0.113.50
MySQL port: 3306
В этом случае необходимо разрешить подключение только с IP сервера MTA и правильно настроить сетевой экран.
На игровом хостинге
Хостинг обычно выдаёт готовые параметры:
- адрес сервера базы;
- порт;
- название базы;
- имя пользователя;
- пароль;
- ссылку на phpMyAdmin.
Не заменяйте адрес хостинга на localhost, если MySQL находится на другом физическом сервере.
Облачная база данных
Для облачной MySQL могут дополнительно потребоваться:
- разрешённый IP сервера MTA;
- подключение через SSL;
- нестандартный порт;
- специальное имя пользователя;
- сертификат центра сертификации;
- отдельные параметры авторизации.
Что потребуется для подключения MySQL
- установленный MTA Server;
- MySQL Server или MariaDB Server;
- созданная база данных;
- отдельный пользователь базы;
- пароль пользователя;
- SQL-файл готовой сборки или собственная структура таблиц;
- серверный Lua-ресурс с функцией
dbConnect; - правильный адрес и порт MySQL;
- доступ к консоли или панели управления;
- резервная копия файлов и базы.
Стандартные параметры
| Параметр | Пример |
|---|---|
| Хост | 127.0.0.1 |
| Порт | 3306 |
| База | mta_server |
| Пользователь | mta_user |
| Кодировка | utf8mb4 |
Установка MySQL на Windows
Для локального сервера можно установить MySQL Community Server или MariaDB Server. Во время установки необходимо создать пароль административного пользователя и включить службу базы данных.
Основные шаги
- Скачайте официальный установщик выбранной СУБД.
- Запустите установку от имени администратора.
- Выберите установку серверного компонента.
- Оставьте TCP-порт
3306, если он свободен. - Создайте сложный пароль администратора базы.
- Включите автоматический запуск службы.
- Завершите установку.
- Проверьте вход через консоль или графическую панель.
Проверка порта в PowerShell
Get-NetTCPConnection -LocalPort 3306 -ErrorAction SilentlyContinue
Проверка службы
Откройте окно служб Windows:
services.msc
Найдите службу MySQL или MariaDB и убедитесь, что она запущена.
Вход через консоль
mysql -u root -p
После выполнения команды введите пароль, созданный во время установки.
Установка MySQL или MariaDB на Linux
На Ubuntu и Debian можно установить MySQL Server или MariaDB Server через пакетный менеджер. Устанавливайте только одну из этих систем, если нет специальной причины использовать обе.
Вариант с MySQL
sudo apt update
sudo apt install mysql-server mysql-client -y
Вариант с MariaDB
sudo apt update
sudo apt install mariadb-server mariadb-client -y
Запуск MySQL
sudo systemctl enable mysql
sudo systemctl start mysql
sudo systemctl status mysql
Запуск MariaDB
sudo systemctl enable mariadb
sudo systemctl start mariadb
sudo systemctl status mariadb
Первоначальная защита
Для установленной системы может быть доступна команда:
sudo mysql_secure_installation
Она помогает удалить тестовые элементы, ограничить удалённый вход административного пользователя и настроить базовые параметры безопасности.
Вход в консоль
sudo mysql
Либо:
mysql -u root -p
Способ входа зависит от выбранной системы и настроенного метода авторизации.
Проверка службы базы данных
Проверка на Linux
sudo systemctl status mysql
Для MariaDB:
sudo systemctl status mariadb
Проверка порта
sudo ss -lntp | grep 3306
Проверка версии
mysql --version
Проверка подключения
mysql -h 127.0.0.1 -P 3306 -u root -p
Если служба не запускается
Просмотрите системный журнал:
sudo journalctl -u mysql --no-pager -n 100
Для MariaDB:
sudo journalctl -u mariadb --no-pager -n 100
Создание базы данных для MTA
Войдите в консоль MySQL под административным пользователем и выполните:
CREATE DATABASE `mta_server`
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
Проверка результата
SHOW DATABASES;
Выбор созданной базы
USE `mta_server`;
Почему используется utf8mb4
Кодировка подходит для русского текста, большинства других языков и расширенного набора символов. Важно использовать одинаковую кодировку в базе, таблицах и строке подключения MTA.
Допустимые названия
mta_server
miami_rp
roleplay_db
server1_database
Нежелательные варианты
- названия с пробелами;
- кириллица в системном имени;
- случайные специальные символы;
- одинаковая база для независимых проектов;
- использование системной базы
mysql.
Создание отдельного пользователя MySQL
Для локального подключения через 127.0.0.1 создайте пользователя:
CREATE USER 'mta_user'@'127.0.0.1'
IDENTIFIED BY 'ЗАМЕНИТЕ_НА_СЛОЖНЫЙ_ПАРОЛЬ';
Выдайте права только на базу MTA:
GRANT ALL PRIVILEGES
ON `mta_server`.*
TO 'mta_user'@'127.0.0.1';
Вариант для localhost
CREATE USER 'mta_user'@'localhost'
IDENTIFIED BY 'ЗАМЕНИТЕ_НА_СЛОЖНЫЙ_ПАРОЛЬ';
GRANT ALL PRIVILEGES
ON `mta_server`.*
TO 'mta_user'@'localhost';
Хост в учётной записи MySQL должен соответствовать способу подключения ресурса MTA.
Проверка входа новым пользователем
mysql -h 127.0.0.1 -P 3306 -u mta_user -p mta_server
Почему нельзя использовать root
- root имеет доступ ко всем базам;
- ошибка ресурса может повредить системные данные;
- пароль root окажется в конфигурации сборки;
- сложнее ограничить права;
- опаснее передавать проект другому разработчику;
- невозможно удобно отозвать доступ только у сервера.
Пользователь для удалённого подключения
Допустим, MTA Server работает с публичного IP:
203.0.113.25
Создайте пользователя, которому разрешён вход только с этого адреса:
CREATE USER 'mta_user'@'203.0.113.25'
IDENTIFIED BY 'ЗАМЕНИТЕ_НА_СЛОЖНЫЙ_ПАРОЛЬ';
GRANT ALL PRIVILEGES
ON `mta_server`.*
TO 'mta_user'@'203.0.113.25';
Не рекомендуется
CREATE USER 'mta_user'@'%'
IDENTIFIED BY 'password';
Символ % разрешает попытки входа с любых адресов. Для игрового сервера безопаснее указать точный IP или ограниченную внутреннюю сеть.
Если IP сервера MTA изменился
Создайте доступ для нового адреса и удалите старую учётную запись:
DROP USER 'mta_user'@'СТАРЫЙ_IP';
Проверка прав пользователя MySQL
Проверьте выданные разрешения:
SHOW GRANTS FOR 'mta_user'@'127.0.0.1';
Для удалённого пользователя:
SHOW GRANTS FOR 'mta_user'@'203.0.113.25';
Проверка текущего пользователя
Войдите под созданной учётной записью и выполните:
SELECT USER(), CURRENT_USER();
Проверка доступа к таблицам
USE `mta_server`;
SHOW TABLES;
Импорт SQL-файла готовой сборки
Готовая сборка MTA может содержать файл:
database.sql
mysql.sql
dump.sql
schema.sql
roleplay.sql
Импорт на Linux
mysql -h 127.0.0.1 -P 3306 -u mta_user -p mta_server < /home/mtasa/database.sql
Импорт от административного пользователя
mysql -u root -p mta_server < /home/mtasa/database.sql
Импорт на Windows
mysql.exe -h 127.0.0.1 -P 3306 -u mta_user -p mta_server < C:\MTA-Server\database.sql
Если путь содержит пробелы:
mysql.exe -u mta_user -p mta_server < "C:\MTA Server\Database\database.sql"
Импорт из консоли MySQL
USE `mta_server`;
SOURCE /home/mtasa/database.sql;
Перед импортом проверьте
- создана ли нужная база;
- не содержит ли файл команду удаления другой базы;
- совпадает ли имя базы;
- не хранятся ли внутри старые аккаунты;
- какая кодировка указана;
- не содержит ли дамп пользователей MySQL;
- создана ли резервная копия существующих таблиц.
Импорт базы через phpMyAdmin
- Откройте phpMyAdmin.
- Авторизуйтесь под пользователем базы.
- Выберите базу
mta_serverслева. - Откройте вкладку «Импорт».
- Выберите SQL-файл сборки.
- Оставьте формат SQL.
- Проверьте кодировку файла.
- Запустите импорт.
- Дождитесь сообщения об успешном выполнении.
- Откройте список таблиц.
Если файл слишком большой
Возможные решения:
- импортировать через командную строку;
- увеличить лимит загрузки PHP;
- разделить дамп на несколько частей;
- использовать панель хостинга;
- загрузить файл на VPS и выполнить команду
mysql; - сжать дамп, если панель поддерживает архивы.
Не создавайте таблицы вручную без необходимости
Готовый SQL-файл может содержать точные типы столбцов, индексы, внешние ключи, начальные данные и служебные настройки. Ручное создание похожих таблиц не гарантирует совместимость со скриптами.
Проверка импортированных таблиц
Выберите базу и посмотрите список таблиц:
USE `mta_server`;
SHOW TABLES;
Просмотр структуры таблицы
DESCRIBE `accounts`;
Либо:
SHOW CREATE TABLE `accounts`;
Проверка количества записей
SELECT COUNT(*) FROM `accounts`;
Проверка кодировки таблиц
SELECT
TABLE_NAME,
TABLE_COLLATION
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'mta_server';
Проверка начальных данных
SELECT * FROM `accounts` LIMIT 10;
Где искать настройки MySQL в готовой сборке MTA
Параметры подключения могут находиться в разных файлах:
resources/database/server.lua
resources/mysql/config.lua
resources/core/settings.lua
resources/[system]/database/s_database.lua
resources/[gamemode]/roleplay/config.lua
Ищите следующие слова
dbConnect
mysql
dbname
host
port
username
password
database
Пример старой конфигурации
local host = "127.0.0.1"
local database = "mta_server"
local username = "mta_user"
local password = "password"
Пример подключения одной строкой
dbConnect(
"mysql",
"dbname=mta_server;host=127.0.0.1",
"mta_user",
"password"
)
Старые MySQL-модули
Некоторые старые сборки используют сторонние функции или модули вместо стандартных функций MTA:
mysql_connect
mysql_query
mysql_free_result
mysql_ping
Такую сборку нельзя автоматически переключить на dbConnect простой заменой одной строки. Может потребоваться переработка всех запросов или установка совместимого модуля.
Создание отдельного ресурса подключения к базе
Удобно создать один системный ресурс, который устанавливает соединение и передаёт его остальным ресурсам.
Структура
resources/
└── database/
├── meta.xml
└── server.lua
Файл meta.xml
<meta>
<info
author="Server Team"
name="Database connection"
type="script"
version="1.0"
/>
<script src="server.lua" type="server" />
<export function="getConnection" type="server" />
<export function="isConnected" type="server" />
</meta>
Файл server.lua
local connection = false
local databaseConfig = {
host = "127.0.0.1",
port = 3306,
name = "mta_server",
user = "mta_user",
password = "ЗАМЕНИТЕ_ПАРОЛЬ"
}
local function connectToDatabase()
local connectionString = string.format(
"dbname=%s;host=%s;port=%d;charset=utf8mb4",
databaseConfig.name,
databaseConfig.host,
databaseConfig.port
)
connection = dbConnect(
"mysql",
connectionString,
databaseConfig.user,
databaseConfig.password,
"share=0;autoreconnect=1;batch=1;tag=main_database"
)
if connection then
outputDebugString(
"[DATABASE] Подключение к MySQL установлено.",
3
)
else
outputDebugString(
"[DATABASE] Не удалось подключиться к MySQL.",
1
)
end
end
addEventHandler("onResourceStart", resourceRoot, connectToDatabase)
function getConnection()
return connection
end
function isConnected()
return isElement(connection)
end
Синтаксис dbConnect для MySQL
dbConnect(
"mysql",
"dbname=БАЗА;host=ХОСТ;port=3306;charset=utf8mb4",
"ПОЛЬЗОВАТЕЛЬ",
"ПАРОЛЬ",
"ПАРАМЕТРЫ"
)
Основные параметры строки подключения
| Параметр | Назначение |
|---|---|
dbname |
Название выбранной базы. |
host |
IP, домен или локальный адрес MySQL. |
port |
Порт MySQL, обычно 3306. |
charset |
Кодировка соединения. |
unix_socket |
Путь к сокету при локальном подключении через Unix. |
Дополнительные опции
| Опция | Назначение |
|---|---|
share |
Разрешает повторным вызовам использовать общее соединение. |
batch |
Группирует запросы одного кадра для ускорения операций. |
autoreconnect |
Пытается восстановить разорванное соединение. |
log |
Включает запись запросов в отладочный журнал. |
tag |
Добавляет метку соединения в журнал базы. |
queue |
Задаёт очередь выполнения асинхронных запросов. |
use_ssl |
Включает SSL для MySQL-соединения. |
get_server_public_key |
Разрешает запросить публичный ключ для современной авторизации MySQL. |
Рекомендуемый базовый вариант
local connection = dbConnect(
"mysql",
"dbname=mta_server;host=127.0.0.1;port=3306;charset=utf8mb4",
"mta_user",
"СЛОЖНЫЙ_ПАРОЛЬ",
"share=0;autoreconnect=1;batch=1;tag=main_database"
)
Соединение следует создать один раз при запуске ресурса, а затем повторно использовать во всех запросах.
Пример локального подключения
MySQL и MTA Server работают на одном компьютере или VPS:
local connection = dbConnect(
"mysql",
"dbname=mta_server;host=127.0.0.1;port=3306;charset=utf8mb4",
"mta_user",
"СЛОЖНЫЙ_ПАРОЛЬ",
"share=0;autoreconnect=1;tag=local_mysql"
)
Почему используется 127.0.0.1
Это локальный сетевой интерфейс. Соединение остаётся внутри сервера и не зависит от внешнего IP.
Вариант с localhost
local connection = dbConnect(
"mysql",
"dbname=mta_server;host=localhost;port=3306;charset=utf8mb4",
"mta_user",
"СЛОЖНЫЙ_ПАРОЛЬ"
)
Учётная запись MySQL должна быть создана для того же хоста:
'mta_user'@'localhost'
Пример подключения к удалённой MySQL
local connection = dbConnect(
"mysql",
"dbname=mta_server;host=203.0.113.50;port=3306;charset=utf8mb4",
"mta_user",
"СЛОЖНЫЙ_ПАРОЛЬ",
"share=0;autoreconnect=1;batch=1;tag=remote_mysql"
)
Вместо демонстрационного адреса укажите реальный IP или домен базы данных.
Для удалённого подключения должны совпасть
- хост в
dbConnect; - порт MySQL;
- название базы;
- имя пользователя;
- пароль;
- разрешённый IP в учётной записи MySQL;
- правила сетевого экрана;
- параметр
bind-address.
Адрес из панели хостинга
Он может выглядеть так:
mysql12.hosting.example
db.example.net
10.20.0.15
Копируйте адрес точно, не добавляя http:// или https://.
Как передать соединение другим ресурсам
После экспорта функции из ресурса database другой ресурс может получить готовое соединение:
local connection = exports.database:getConnection()
if not isElement(connection) then
outputDebugString(
"[ACCOUNTS] Соединение с базой недоступно.",
1
)
return
end
Пример создания записи
local connection = exports.database:getConnection()
dbExec(
connection,
"INSERT INTO `players` (`serial`, `nickname`) VALUES (?, ?)",
getPlayerSerial(player),
getPlayerName(player)
)
Преимущества общего ресурса
- параметры базы хранятся в одном месте;
- не создаётся новое соединение каждым скриптом;
- проще изменить пароль;
- проще включить журналирование;
- можно контролировать порядок запуска;
- удобнее диагностировать ошибки.
Порядок автоматического запуска ресурсов
Ресурс базы должен запускаться раньше систем, которые выполняют запросы.
Пример в mtaserver.conf
<resource src="database" startup="1" protected="1" />
<resource src="accounts" startup="1" protected="0" />
<resource src="characters" startup="1" protected="0" />
<resource src="inventory" startup="1" protected="0" />
<resource src="vehicles" startup="1" protected="0" />
<resource src="roleplay" startup="1" protected="0" />
Дополнительная зависимость в meta.xml
<include resource="database" />
Точный способ указания зависимостей зависит от структуры сборки. Главное требование — не выполнять запросы до появления рабочего соединения.
Проверка перед запросом
local connection = exports.database:getConnection()
if not connection then
outputDebugString("MySQL connection is not ready", 1)
return
end
Проверка подключения к MySQL
Простая проверка
local connection = dbConnect(
"mysql",
"dbname=mta_server;host=127.0.0.1;port=3306;charset=utf8mb4",
"mta_user",
"СЛОЖНЫЙ_ПАРОЛЬ"
)
if connection then
outputDebugString("MySQL connection successful", 3)
else
outputDebugString("MySQL connection failed", 1)
end
Проверка SQL-запросом
dbQuery(
function(queryHandle)
local result = dbPoll(queryHandle, 0)
if result then
outputDebugString("MySQL query successful", 3)
else
outputDebugString("MySQL query failed", 1)
end
end,
connection,
"SELECT 1 AS `connection_test`"
)
Проверка имени базы
dbQuery(
function(queryHandle)
local rows = dbPoll(queryHandle, 0)
if rows and rows[1] then
outputDebugString(
"Current database: " .. tostring(rows[1].database_name),
3
)
end
end,
connection,
"SELECT DATABASE() AS `database_name`"
)
Выполнение MySQL-запросов из MTA
Создание таблицы через dbExec
dbExec(
connection,
[[
CREATE TABLE IF NOT EXISTS `players` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`serial` VARCHAR(32) NOT NULL,
`nickname` VARCHAR(64) NOT NULL,
`money` BIGINT NOT NULL DEFAULT 0,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uq_players_serial` (`serial`)
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci
]]
)
Добавление записи
dbExec(
connection,
"INSERT INTO `players` (`serial`, `nickname`, `money`) VALUES (?, ?, ?)",
playerSerial,
playerName,
5000
)
Изменение записи
dbExec(
connection,
"UPDATE `players` SET `money` = ? WHERE `serial` = ?",
newMoney,
playerSerial
)
Удаление записи
dbExec(
connection,
"DELETE FROM `players` WHERE `serial` = ?",
playerSerial
)
Асинхронная выборка
dbQuery(
function(queryHandle, player)
local rows = dbPoll(queryHandle, 0)
if not rows or not rows[1] then
outputChatBox(
"Персонаж не найден.",
player,
255,
80,
80
)
return
end
local money = tonumber(rows[1].money) or 0
outputChatBox(
"Ваш баланс: " .. money,
player,
80,
220,
140
)
end,
{player},
connection,
"SELECT `money` FROM `players` WHERE `serial` = ? LIMIT 1",
getPlayerSerial(player)
)
Почему запросы выполняют асинхронно
Долгое ожидание базы в основном игровом потоке может задержать обработку других событий. Для выборок используйте callback-функцию dbQuery, а внутри неё получайте результат через dbPoll с нулевым ожиданием.
Защита MySQL-запросов от SQL-инъекций
Неправильно
local query =
"SELECT * FROM accounts WHERE login='" .. login .. "'"
dbQuery(connection, query)
Пользовательское значение напрямую добавляется в SQL-строку.
Правильно
dbQuery(
connection,
"SELECT * FROM `accounts` WHERE `login` = ? LIMIT 1",
login
)
Добавление записи
dbExec(
connection,
"INSERT INTO `accounts` (`login`, `password_hash`) VALUES (?, ?)",
login,
passwordHash
)
Динамическое имя таблицы
Для значений используется ?, а для SQL-идентификаторов — специальная подготовка через dbPrepareString. Не разрешайте пользователю самостоятельно выбирать произвольное имя таблицы.
Основные правила
- используйте заполнители
?; - не объединяйте пользовательский текст с SQL;
- преобразовывайте числа через
tonumber; - ограничивайте длину строк;
- не храните пароли в открытом виде;
- проверяйте результат запросов;
- не показывайте игроку полный текст ошибки базы;
- записывайте технические ошибки только в серверный журнал.
Кодировка MySQL и русский текст
Для новых проектов рекомендуется использовать одинаковую кодировку на всех уровнях:
- база данных —
utf8mb4; - таблицы —
utf8mb4; - текстовые столбцы — совместимая collation;
- соединение MTA —
charset=utf8mb4; - Lua-файлы — UTF-8.
Строка подключения
dbname=mta_server;host=127.0.0.1;port=3306;charset=utf8mb4
Проверка кодировки базы
SELECT
DEFAULT_CHARACTER_SET_NAME,
DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'mta_server';
Изменение кодировки базы
ALTER DATABASE `mta_server`
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
Изменение существующей таблицы
ALTER TABLE `players`
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
Где хранить пароль базы данных
Пароль должен находиться только в серверном Lua-файле. Он не должен передаваться клиентам.
Правильно
<script src="server.lua" type="server" />
Неправильно
<script src="config.lua" type="client" />
Не храните пароль
- в клиентском Lua-файле;
- в JavaScript-интерфейсе;
- в общем чате разработчиков;
- в публичном репозитории;
- в описании ресурса;
- в архиве, предназначенном для публикации;
- на скриншотах консоли.
Защита MTA
В файле mtaserver.conf рекомендуется оставить:
<database_credentials_protection>1</database_credentials_protection>
Параметр добавляет ограничения для ресурсов, использующих MySQL через dbConnect.
Настройка удалённого доступа к MySQL
Если база находится на другом VPS, MySQL должен принимать подключения не только с локального интерфейса.
Найдите конфигурацию сервера
Расположение зависит от системы и установленного пакета. Часто настройки находятся в каталогах:
/etc/mysql/
/etc/mysql/mysql.conf.d/
/etc/mysql/mariadb.conf.d/
Параметр bind-address
Локальный режим:
bind-address = 127.0.0.1
Для удалённого доступа можно привязать MySQL к приватному адресу VPS или ко всем интерфейсам:
bind-address = 0.0.0.0
Перезапуск службы
MySQL:
sudo systemctl restart mysql
MariaDB:
sudo systemctl restart mariadb
Разрешение через UFW только для сервера MTA
sudo ufw allow from 203.0.113.25 to any port 3306 proto tcp
Проверка правил
sudo ufw status numbered
Проверка с сервера MTA
mysql -h 203.0.113.50 -P 3306 -u mta_user -p mta_server
Проверка доступности порта
nc -vz 203.0.113.50 3306
Открытый порт ещё не означает, что логин, пароль и права пользователя настроены правильно.
Защищённое подключение MySQL через SSL
Если соединение проходит между разными серверами через интернет, желательно использовать приватную сеть, VPN или TLS.
Опция MTA
local connection = dbConnect(
"mysql",
"dbname=mta_server;host=db.example.net;port=3306;charset=utf8mb4",
"mta_user",
"СЛОЖНЫЙ_ПАРОЛЬ",
"share=0;autoreconnect=1;use_ssl=1;get_server_public_key=1"
)
Перед включением use_ssl
- убедитесь, что сервер MySQL поддерживает TLS;
- проверьте настройки облачного провайдера;
- уточните требуемые сертификаты;
- проверьте имя хоста;
- обновите MTA Server до актуальной версии;
- проверьте соединение из консольного клиента MySQL.
Если MySQL не настроен для защищённых соединений, включение use_ssl=1 может привести к отказу подключения.
Диагностика MySQL через debugdb
В серверной консоли MTA включите подробный журнал запросов:
debugdb 2
Запросы и ошибки обычно записываются в:
mods/deathmatch/logs/db.log
После диагностики
debugdb 0
Постоянное подробное журналирование может быстро увеличить размер файла.
Добавление метки соединения
local connection = dbConnect(
"mysql",
connectionString,
username,
password,
"tag=accounts_database"
)
Метка помогает определить, какой ресурс создаёт запросы.
Полезные журналы
mods/deathmatch/logs/server.log
mods/deathmatch/logs/scripts.log
mods/deathmatch/logs/db.log
Что искать
Could not connect;Access denied;Unknown database;Table doesn't exist;Duplicate entry;Connection lost;Incorrect string value;Data too long.
Распространённые ошибки MySQL в MTA
Access denied for user — ошибка 1045
MySQL отклонила логин пользователя.
Проверьте
- имя пользователя;
- пароль;
- хост учётной записи;
- IP сервера MTA;
- регистр символов;
- выданные права;
- отсутствие лишних пробелов.
Проверьте права:
SHOW GRANTS FOR 'mta_user'@'127.0.0.1';
Unknown database — ошибка 1049
В строке подключения указана несуществующая база.
SHOW DATABASES;
Сравните название с параметром:
dbname=mta_server
Can't connect to MySQL server — ошибки 2002 или 2003
- служба MySQL остановлена;
- неверный IP;
- закрыт порт 3306;
- MySQL слушает только localhost;
- сетевой экран хостинга блокирует соединение;
- использован неправильный порт;
- домен указывает на другой адрес.
Table doesn't exist — ошибка 1146
Ресурс обращается к таблице, которой нет в выбранной базе.
- импортируйте полный SQL-файл;
- проверьте имя базы;
- проверьте префикс таблиц;
- учтите регистр символов на Linux;
- проверьте версию схемы сборки.
Duplicate entry — ошибка 1062
Добавляется значение, которое уже существует в уникальном индексе.
SELECT *
FROM `players`
WHERE `serial` = 'ПРОВЕРЯЕМЫЙ_SERIAL';
Не скрывайте ошибку без анализа. Она может указывать на повторную регистрацию или неверную игровую логику.
Incorrect string value — ошибка 1366
Кодировка соединения, таблицы или столбца не поддерживает передаваемые символы.
- проверьте
charset=utf8mb4; - проверьте кодировку базы;
- проверьте collation таблицы;
- проверьте кодировку Lua-файла;
- преобразуйте таблицу после создания копии.
Data too long for column — ошибка 1406
Значение длиннее размера столбца.
DESCRIBE `players`;
Не увеличивайте размер автоматически. Сначала проверьте, почему ресурс передаёт слишком длинную строку.
Lost connection during query — ошибка 2013
- сервер базы был перезапущен;
- соединение разорвано сетью;
- запрос выполнялся слишком долго;
- передавался слишком большой пакет;
- произошла перегрузка MySQL;
- сработал сетевой тайм-аут.
Authentication plugin error
Сначала обновите MTA Server и проверьте:
get_server_public_key=1
Не переводите пользователя на устаревший способ авторизации без необходимости и оценки безопасности.
Ошибка загрузки библиотеки на Linux
Проверьте зависимости серверного файла:
ldd ./mta-server64
Установите отсутствующий пакет из репозитория своего дистрибутива. Не скачивайте случайные файлы .so с неизвестных сайтов.
Оптимизация MySQL для сервера MTA
Создавайте одно соединение
Не выполняйте dbConnect при каждом входе игрока, команде или сохранении данных.
Используйте асинхронные выборки
Не блокируйте сервер длительным ожиданием результата через dbPoll с бесконечным тайм-аутом в обычной игровой логике.
Добавляйте индексы
Поля, по которым регулярно выполняется поиск, могут требовать индекса:
CREATE INDEX `idx_players_account_id`
ON `players` (`account_id`);
Не выбирайте все столбцы без причины
Вместо:
SELECT * FROM `players` WHERE `id` = ?
Используйте:
SELECT `nickname`, `money`, `level`
FROM `players`
WHERE `id` = ?
LIMIT 1
Ограничивайте результаты
SELECT `id`, `nickname`
FROM `players`
ORDER BY `id` DESC
LIMIT 100
Не сохраняйте данные каждый кадр
Сохранение денег, позиции или состояния транспорта следует выполнять:
- после значимого изменения;
- при выходе игрока;
- через разумный периодический интервал;
- при остановке ресурса;
- перед корректным выключением сервера.
Проверяйте медленные запросы
Используйте журнал MySQL, EXPLAIN и отладку MTA:
EXPLAIN
SELECT `id`
FROM `players`
WHERE `serial` = 'ABC';
Транзакции и batch
Опция batch=1 удобна для обычных операций. Если ресурс вручную управляет транзакциями, блокировками или autocommit, может потребоваться batch=0.
Резервное копирование базы MTA
Создание дампа
mysqldump \
--single-transaction \
--routines \
--triggers \
-h 127.0.0.1 \
-u mta_user \
-p \
mta_server > mta_server_backup.sql
Архив с датой
mysqldump -u mta_user -p mta_server \
> mta_server_2026-07-31.sql
Восстановление
mysql -u mta_user -p mta_server \
< mta_server_backup.sql
Что сохранять вместе с базой
- папку ресурсов;
mtaserver.conf;acl.xml;- настройки подключения;
- SQL-дамп;
- используемые модули;
- версию серверной сборки;
- инструкцию восстановления.
Где хранить копии
- на другом VPS;
- в защищённом облачном хранилище;
- на локальном компьютере владельца;
- на отдельном резервном сервере.
Безопасность базы данных MTA
- не используйте root в игровых ресурсах;
- создавайте отдельную базу для каждого проекта;
- разрешайте удалённый вход только с IP MTA Server;
- не открывайте порт 3306 всему интернету;
- используйте длинный уникальный пароль;
- не храните пароль в клиентских файлах;
- не публикуйте SQL-дампы с пользовательскими данными;
- включите
database_credentials_protection; - используйте заполнители в SQL-запросах;
- регулярно обновляйте MySQL или MariaDB;
- создавайте резервные копии;
- просматривайте журналы входа и ошибок;
- удаляйте доступ бывших разработчиков;
- используйте SSL или приватную сеть для удалённой базы.
Смена пароля пользователя
ALTER USER 'mta_user'@'127.0.0.1'
IDENTIFIED BY 'НОВЫЙ_СЛОЖНЫЙ_ПАРОЛЬ';
После смены обновите пароль в серверном ресурсе и перезапустите соединение.
Удаление доступа
DROP USER 'mta_user'@'203.0.113.25';
Ограниченные права
После завершения установки можно заменить ALL PRIVILEGES на конкретный набор разрешений, необходимый игровому режиму. Не выдавайте глобальные права на *.*.
Частые вопросы о MySQL для MTA
Нужна ли MySQL чистому MTA Server?
Нет. Она нужна установленному игровому режиму или ресурсам, которые используют внешнюю базу.
Можно ли использовать MariaDB?
Да, большинство обычных MySQL-сборок работает с MariaDB, но совместимость конкретной схемы и запросов необходимо проверить.
Какой стандартный порт MySQL?
3306 TCP.
Что указывать в host при локальной базе?
Обычно 127.0.0.1 или localhost. Учётная запись MySQL должна разрешать вход с выбранного хоста.
Что указывать в host на игровом хостинге?
Адрес, выданный панелью хостинга. Это может быть домен, приватный IP или отдельный сервер базы.
Можно ли использовать root?
Технически возможно, но для игрового сервера это небезопасно. Создайте отдельного пользователя.
Где находится пароль MySQL в сборке?
Обычно в серверном Lua-файле ресурса базы, config.lua или settings.lua.
Можно ли указывать пароль в client.lua?
Нет. Клиентский файл доступен подключившимся пользователям.
Как создать базу?
Выполните CREATE DATABASE через консоль MySQL, phpMyAdmin или панель хостинга.
Как импортировать таблицы?
Используйте вкладку импорта phpMyAdmin или команду mysql база < файл.sql.
Почему после импорта нет таблиц?
Возможно, была выбрана другая база, импорт завершился ошибкой либо SQL-файл не содержит команд создания таблиц.
Почему MTA пишет Access denied?
Неверен логин, пароль или разрешённый хост пользователя MySQL.
Почему база работает через phpMyAdmin, но не через MTA?
phpMyAdmin может подключаться с другого хоста и под другим пользователем. Проверьте параметры именно серверного ресурса.
Как проверить подключение без MTA?
Выполните команду mysql -h ХОСТ -P ПОРТ -u ПОЛЬЗОВАТЕЛЬ -p БАЗА с компьютера, где работает сервер MTA.
Нужно ли открывать порт 3306?
Для локальной базы — нет. Для удалённой откройте его только для IP сервера MTA.
Как включить русские символы?
Используйте utf8mb4 в базе, таблицах и строке dbConnect.
Как включить журнал запросов MTA?
Введите в серверной консоли debugdb 2.
Где находится журнал базы?
Обычно в mods/deathmatch/logs/db.log.
Как отключить подробный журнал?
Введите debugdb 0.
Нужно ли создавать новое соединение для каждого ресурса?
Нет. Лучше создать одно соединение в системном ресурсе и передавать его другим ресурсам.
Что означает autoreconnect?
Опция позволяет автоматически восстановить потерянное соединение. После восстановления временные таблицы, переменные сеанса и блокировки могут быть потеряны.
Что означает share?
Опция управляет повторным использованием соединения одинаковыми вызовами dbConnect.
Что означает batch?
Опция позволяет группировать некоторые запросы для повышения производительности. При ручном управлении транзакциями её поведение необходимо учитывать.
Как защититься от SQL-инъекции?
Не собирайте SQL через объединение строк. Используйте заполнители ? и передавайте значения отдельными аргументами.
Как перенести базу на другой VPS?
Создайте дамп через mysqldump, импортируйте его на новом сервере, создайте пользователя, обновите адрес подключения и проверьте сетевой доступ.
Почему старый сервер использует mysql_query?
Вероятно, сборка создана для стороннего MySQL-модуля. Для перехода на встроенные функции MTA потребуется адаптация кода.
Заключение
Для подключения MySQL к MTA:SA сначала установите MySQL Server или MariaDB, создайте отдельную базу, пользователя с ограниченными правами и импортируйте SQL-файл игрового режима.
В серверном ресурсе создайте одно соединение через dbConnect, указав название базы, адрес, порт, кодировку, логин и пароль. Локальная база обычно использует адрес 127.0.0.1, а удалённая — IP или домен, предоставленный владельцем VPS или хостингом.
Ресурс подключения должен запускаться раньше аккаунтов, персонажей, инвентаря и других систем. Для запросов используйте dbExec и асинхронный dbQuery, передавая значения через заполнители ?.
При ошибках включите debugdb 2, проверьте db.log, службу MySQL, права пользователя, имя базы, порт, сетевой экран и параметры bind-address.
Не используйте root, не открывайте порт 3306 всему интернету и регулярно создавайте SQL-дампы. Пароль базы должен храниться только в серверной части проекта.
Установка MTA Server:
Настройка сервера после установки:
Настройка mtaserver.conf:
Готовые Role Play сборки:
Комментарии к инструкции
Обсудите решение, задайте вопрос или дополните инструкцию