Miami RP Project СЕРВЕР MTA:SA ONLINE СЕРВЕР GTA 5 RAGE MP В РАЗРАБОТКЕ ЗАПУСК MTA RAGE MP: в разработке

Подключение MySQL к серверу MTA:SA — настройка базы данных

Сегодня Обновлено: Сегодня 0.0 (0)
Подключение MySQL к серверу MTA:SA — настройка базы данных
Категория Подключение MySQL к серверу MTA:SA Опубликовано Сегодня Обновлено Сегодня Просмотров 5

Подключение базы данных MySQL к серверу MTA:SA необходимо большинству Role Play, RPG, DayZ и других крупных игровых режимов. В базе хранятся аккаунты, персонажи, деньги, транспорт, имущество, организации, инвентарь, наказания и другие данные проекта.

Настройка состоит из нескольких этапов: установка MySQL или MariaDB, создание отдельной базы и пользователя, импорт SQL-таблиц, подключение через функцию dbConnect, проверка запросов и устранение ошибок соединения.

Инструкция подходит для MTA:SA Server 1.6 на Windows и Linux. Она охватывает локальную базу на одном компьютере с сервером, удалённую базу на другом VPS и подключение готовой серверной сборки.

Сначала установите и настройте MTA Server:

Установка сервера MTA:SA на Windows и Linux

Основная настройка сервера:

Настроить 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. Во время установки необходимо создать пароль административного пользователя и включить службу базы данных.

Основные шаги

  1. Скачайте официальный установщик выбранной СУБД.
  2. Запустите установку от имени администратора.
  3. Выберите установку серверного компонента.
  4. Оставьте TCP-порт 3306, если он свободен.
  5. Создайте сложный пароль администратора базы.
  6. Включите автоматический запуск службы.
  7. Завершите установку.
  8. Проверьте вход через консоль или графическую панель.

Проверка порта в 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

  1. Откройте phpMyAdmin.
  2. Авторизуйтесь под пользователем базы.
  3. Выберите базу mta_server слева.
  4. Откройте вкладку «Импорт».
  5. Выберите SQL-файл сборки.
  6. Оставьте формат SQL.
  7. Проверьте кодировку файла.
  8. Запустите импорт.
  9. Дождитесь сообщения об успешном выполнении.
  10. Откройте список таблиц.

Если файл слишком большой

Возможные решения:

  • импортировать через командную строку;
  • увеличить лимит загрузки 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:

Установить сервер MTA:SA

Настройка сервера после установки:

Основная настройка MTA Server

Настройка mtaserver.conf:

Руководство по mtaserver.conf

Готовые Role Play сборки:

Скачать сборки MTA Role Play

RSS инструкций
0 комментариев 0.0 из 0 оценок
MIAMI RP COMMUNITY

Комментарии к инструкции

Обсудите решение, задайте вопрос или дополните инструкцию

Всего: 0
Страница: /
Показано: 0
Добавление комментариев сейчас недоступно для текущего пользователя.