MHOSTMHOST

MySQL / MariaDB: установка и настройка

В этой статье вы поставите MariaDB — современный стандартный «MySQL» для Linux — на VPS mHost, пройдёте базовую защиту через mysql_secure_installation, создадите базу данных с отдельным пользователем и правами, настроите bind-address для локального или удалённого доступа и подключитесь к серверу клиентом mysql.

Что понадобится

  • VPS mHost на Ubuntu 22.04/24.04, Debian 11/12 или AlmaLinux/Rocky Linux 8/9.
  • Доступ по SSH под root или пользователем с sudo.
Совет: все команды ниже даны от имени root. Если вы работаете под обычным пользователем, добавляйте sudo перед каждой командой.
Совет: если вам нужен не только MySQL, а сразу веб-сервер и PHP в комплекте, проще взять готовый рецепт LEMP/LAMP в VMmanager 6 (см. «Готовые рецепты VMmanager 6») — он разворачивает весь стек, включая MariaDB, одним запуском. Ниже — установка и настройка именно MariaDB вручную.

Шаг 1. Установите MariaDB

Ubuntu / Debian

bash
apt update
apt install mariadb-server

AlmaLinux / Rocky Linux

bash
dnf install mariadb-server

Пакет mariadb-server есть в штатном репозитории обоих семейств дистрибутивов (AppStream — на AlmaLinux/Rocky), подключать сторонние репозитории не нужно. Вместе с сервером ставится и клиент — команда mysql.

Проверьте, что всё установилось:

bash
mysql --version
Совет: apt/dnf ставят версию MariaDB из репозитория вашего дистрибутива (обычно от 10.5 до 10.11+ в зависимости от релиза) — для обычного проекта её достаточно. Нужна конкретная свежая версия — у MariaDB есть собственный репозиторий с генератором команд установки под любой дистрибутив, см. mariadb.org/download.
MySQL или MariaDB? Пакет mysql-server в штатных репозиториях Ubuntu, Debian, AlmaLinux и Rocky Linux уже давно заменён на MariaDB — форк MySQL, совместимый с ним по протоколу, SQL, утилитам и порту 3306 (используется тот же клиент mysql). Ниже везде ставится именно MariaDB — это и есть стандартный современный «MySQL» для Linux-серверов. Если вам принципиально нужен «оригинальный» MySQL от Oracle, подключите его официальный репозиторий (см. dev.mysql.com/downloads/repo) — остальные шаги статьи (база, пользователь, bind-address) для него совпадают почти дословно.

Шаг 2. Включите автозапуск и запустите MariaDB

bash
systemctl enable --now mariadb
systemctl status mariadb

Флаг enable --now одновременно добавляет MariaDB в автозагрузку и запускает её сразу. В статусе должно быть active (running).

Шаг 3. Защитите установку: mysql_secure_installation

Свежая установка MariaDB не защищена — есть анонимные пользователи, тестовая база и root без ограничений на удалённый вход. Скрипт mysql_secure_installation устраняет всё это за один проход:

bash
mysql_secure_installation
Совет: начиная с MariaDB 10.5 у команды появилось «родное» имя mariadb-secure-installation; mysql_secure_installation остаётся рабочим как симлинк для обратной совместимости — можно использовать любое из двух названий, в том числе на MySQL.

Скрипт задаст несколько вопросов подряд:

  • Enter current password for root — у свежей установки пароля ещё нет, просто нажмите Enter.
  • Switch to unix_socket authentication (формулировка отличается между версиями, а на Ubuntu/Debian вопрос может не появиться вовсе — там этот способ входа уже включён по умолчанию) — соглашайтесь (Y): это вход под root без пароля, но только с самого сервера от системного пользователя root, и он безопаснее пароля.
  • Change the root password — если оставляете unix_socket, отдельный пароль root не обязателен, можно ответить n; если нужен пароль в дополнение к сокету — Y и задайте надёжный.
  • Remove anonymous usersY.
  • Disallow root login remotelyY: root не должен логиниться по сети вообще.
  • Remove test database and access to itY.
  • Reload privilege tables nowY.
Проверьте: точные формулировки и порядок вопросов немного отличаются между версиями MariaDB/MySQL и дистрибутивами (у Oracle MySQL перед этим списком может добавиться отдельный вопрос про плагин validate_password и уровень сложности пароля) — отвечайте по смыслу, а не ищите точное совпадение текста.
Готово: теперь вход в консоль MariaDB под root с самого сервера — без пароля, через unix_socket: команда mysql (или sudo mysql, если вы работаете под обычным пользователем). Эту консоль используем в следующем шаге.

Шаг 4. Создайте базу данных, пользователя и права

Подключитесь к консоли MariaDB под root:

bash
mysql

Внутри консоли (приглашение MariaDB [(none)]>) выполните три команды подряд — замените app_db, app_user и особенно STRONG_PASSWORD_HERE на свои значения:

sql
CREATE DATABASE app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'STRONG_PASSWORD_HERE';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'localhost';
  • CREATE DATABASE — кодировка utf8mb4 корректно хранит любые символы, включая эмодзи и большинство языков; utf8 (без mb4) в MySQL/MariaDB — устаревший 3-байтовый вариант, для новых проектов не используется.
  • CREATE USER — часть @'localhost' ограничивает пользователя подключениями с этого же сервера (через unix-сокет или 127.0.0.1). Для удалённого доступа понадобится отдельная запись — см. шаг 5.
  • GRANT — права выданы только на базу app_db, а не на все базы сервера (*.*). Для рядового приложения этого достаточно; root для подключения из приложения использовать не стоит.
Совет: в современных версиях MySQL/MariaDB FLUSH PRIVILEGES; после GRANT/CREATE USER не требуется — сервер применяет изменения сразу. Команда нужна только после прямого редактирования системных таблиц mysql.* через INSERT/UPDATE. Во многих старых туториалах её всё ещё пишут по инерции — это не ошибка, просто лишний шаг.

Проверьте, что права выданы верно:

sql
SHOW GRANTS FOR 'app_user'@'localhost';

Выйдите из консоли:

sql
EXIT;
Важно: не выдавайте приложениям GRANT ALL PRIVILEGES ON *.* и не используйте root как пользователя приложения. Права должны ограничиваться конкретной базой (как в примере выше) — так утечка пароля от одного приложения не затронет остальные базы на сервере.

Шаг 5. bind-address: локальный или удалённый доступ

bind-address определяет, на каком сетевом интерфейсе MariaDB принимает TCP-подключения. Проверить текущее значение можно прямо из клиента:

bash
mysql -e "SHOW VARIABLES LIKE 'bind_address';"

или на уровне ОС:

bash
ss -tlnp | grep 3306

Только локальный доступ (по умолчанию, рекомендуется)

Если база нужна только приложению на этом же VPS (PHP, Django, FastAPI, Node.js — неважно, все они соединяются через localhost), открывать порт 3306 наружу не нужно вообще — это самый безопасный вариант.

На Ubuntu/Debian это значение уже стоит по умолчанию в конфиге пакета:

ini
# /etc/mysql/mariadb.conf.d/50-server.cnf — [mysqld]
bind-address = 127.0.0.1
Проверьте: сама MariaDB «из коробки» слушает все интерфейсы — ограничение до 127.0.0.1 добавляет именно пакет Ubuntu/Debian через этот файл. Пакет AlmaLinux/Rocky такого ограничения по умолчанию может не задавать — обязательно сверьтесь командой из начала шага, и если нужен строго локальный доступ, пропишите строку явно:
ini
# /etc/my.cnf.d/mariadb-server.cnf — [mysqld]
bind-address = 127.0.0.1

После изменения файла перезапустите MariaDB — именно перезапустите, а не reload: bind-address применяется только при старте сервиса:

bash
systemctl restart mariadb

Удалённый доступ

Если к базе нужно подключаться снаружи — с другого сервера или со своего компьютера, — смените bind-address на публичный IP-адрес VPS или на 0.0.0.0 (слушать все интерфейсы):

ini
bind-address = 0.0.0.0

и перезапустите MariaDB так же, как выше.

Затем добавьте отдельного пользователя для подключения именно с этого внешнего адреса — запись с @'localhost' из шага 4 для удалённых подключений не подойдёт:

sql
CREATE USER 'app_user'@'203.0.113.10' IDENTIFIED BY 'STRONG_PASSWORD_HERE';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'203.0.113.10';

Замените 203.0.113.10 на реальный IP-адрес, с которого будете подключаться. Вместо '%' (разрешить с любого IP) старайтесь указывать конкретный адрес или подсеть — так пароль остаётся не единственной линией защиты.

Важно: порт 3306, открытый в интернет, — частая цель перебора паролей. Если ufw на сервере ещё не настроен, сначала пройдите статью «Настройка файрвола UFW» — она ставит ufw, разрешает SSH и включает файрвол. Затем откройте 3306 не «отовсюду», а только с конкретного адреса:

Ubuntu / Debian (ufw)

bash
ufw allow from 203.0.113.10 to any port 3306 proto tcp

AlmaLinux / Rocky (firewalld)

bash
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10" port protocol="tcp" port="3306" accept'
firewall-cmd --reload
Совет: если источник подключений заранее неизвестен или их много, рассмотрите туннель через SSH (ssh -L 3306:localhost:3306 user@SERVER_IP) или VPN вместо открытия 3306 в публичный интернет — тогда bind-address вообще можно оставить на 127.0.0.1.

Шаг 6. Подключитесь клиентом

Локально, на самом VPS

Под root вход идёт без пароля, через unix-сокет (см. шаг 3):

bash
mysql

Под пользователем приложения — с паролем:

bash
mysql -u app_user -p app_db

Клиент запросит пароль (STRONG_PASSWORD_HERE из шага 4) и откроет приглашение MariaDB [app_db]>.

Совет: если явно указать -h 127.0.0.1 вместо того, чтобы оставить хост пустым, клиент подключится по TCP, а не через unix-сокет — и сервер будет матчить это подключение как хост 127.0.0.1, а не localhost. Для пользователя из шага 4 (@'localhost') это не сработает. На практике проще оставить хост пустым: клиент mysql по умолчанию использует сокет для localhost.

Удалённо, с другого компьютера

Установите клиент на машине, откуда будете подключаться:

  • Ubuntu/Debian: apt install mariadb-client
  • AlmaLinux/Rocky/Fedora: dnf install mariadb
  • macOS (Homebrew): brew install mariadb

Подключитесь, указав IP сервера:

bash
mysql -h SERVER_IP -u app_user -p app_db

Тот же протокол понимают и GUI-клиенты — DBeaver, TablePlus, HeidiSQL, MySQL Workbench: в них указывается тот же хост, порт 3306, имя пользователя и пароль.

Готово: после ввода пароля вы должны увидеть приглашение MariaDB [app_db]>. Проверьте, что база на месте:
sql
SHOW DATABASES;

app_db должна быть в списке.

Что дальше

Данные в базе рано или поздно нужно будет восстанавливать — не откладывайте настройку регулярного резервного копирования, см. «Резервное копирование баз данных». Если ещё не ограничили доступ к серверу файрволом, вернитесь к статье «Настройка файрвола UFW» — без него открытый порт 3306 (да и вообще любой сервис) остаётся уязвимым для сканирований и перебора.