MySQL или MariaDB на Ubuntu Server: установка, безопасность, настройка и здравый выбор
Это ещё один рабочий вариант установки: MySQL или MariaDB на Ubuntu Server — без лишней магии, с безопасной конфигурацией и проверками.
Когда на сервере появляется база данных, начинается взрослая жизнь: права, бэкапы, обновления, лимиты, предсказуемость. На Ubuntu у тебя есть два реальных пути — MySQL (Oracle) или MariaDB (форк, community-driven). Оба — нормальные. Но различия важны, потому что “а потом разберёмся” обычно означает “а потом горело”.
Что выбрать: MySQL или MariaDB
MySQL чаще выбирают, когда нужна максимальная совместимость с облачными сервисами и экосистемой “вокруг MySQL”, или когда ты хочешь именно Oracle-ветку с её поведением, репликацией и документацией MySQL.
MariaDB часто выбирают как “Linux-friendly дефолт”: на Ubuntu она ставится проще, живёт предсказуемо, и в бытовых кейсах (WordPress, панели, игровые сервисы, боты, веб-приложения) закрывает 99% потребностей. Но важно помнить: MariaDB и MySQL — не один продукт. Версии, фичи, поведение оптимизатора и системные таблицы местами расходятся.
Эвристика простая: если у тебя есть требование “именно MySQL” (софт/вендор/поддержка) — ставь MySQL. Если требования нет — MariaDB на Ubuntu обычно проще и спокойнее.
Подготовка системы
Сначала обновим индексы пакетов и поставим базовые утилиты:
sudo apt update
sudo apt -y upgrade
sudo apt -y install ca-certificates gnupg lsb-release curl unzip htop
Проверь имя хоста и время (для TLS и логов это внезапно важно):
hostnamectl
timedatectl
Вариант A: установка MariaDB из репозиториев Ubuntu
Это самый прямой путь.
Установка MariaDB
sudo apt -y install mariadb-server mariadb-client
Проверим, что сервис поднялся:
systemctl status mariadb --no-pager -l
Быстрый чек версии:
mariadb --version
Базовая безопасность (обязательно)
На MariaDB на Ubuntu root часто входит через unix_socket (без пароля) — это нормально и безопасно для локального сервера. Важно понимать, что ты делаешь.
sudo mysql_secure_installation
Рекомендую включить: удаление анонимных пользователей, запрет удалённого логина root, удаление тестовой базы, перезагрузку привилегий.
Создаём отдельного пользователя под приложения
Никогда не давай приложению root. Никогда.
sudo mariadb
CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'app'@'localhost' IDENTIFIED BY 'SOME_STRONG_PASSWORD';
GRANT ALL PRIVILEGES ON appdb.* TO 'app'@'localhost';
FLUSH PRIVILEGES;
quit;
Проверка логина:
mariadb -u app -p -D appdb
Вариант B: установка MySQL (Oracle) на Ubuntu
На Ubuntu MySQL ставится так же просто, но нюансы есть.
Установка MySQL
sudo apt -y install mysql-server mysql-client
Проверим сервис:
systemctl status mysql --no-pager -l
Проверим версию:
mysql --version
Базовая безопасность
sudo mysql_secure_installation
Дальше логика та же: отдельный пользователь, отдельная база.
sudo mysql
CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'app'@'localhost' IDENTIFIED BY 'SOME_STRONG_PASSWORD';
GRANT ALL PRIVILEGES ON appdb.* TO 'app'@'localhost';
FLUSH PRIVILEGES;
quit;
Общая настройка: кодировка, доступ, сеть
UTF-8 по-взрослому: utf8mb4
Если ты ставишь базу под WordPress/ботов/игровые панели — utf8mb4 нужен почти всегда (эмодзи, расширенные символы, нормальная совместимость).
Проверка текущих параметров:
mysql -e "SHOW VARIABLES LIKE 'character_set_%';"
mysql -e "SHOW VARIABLES LIKE 'collation%';"
Если нужно зафиксировать utf8mb4 по умолчанию — добавим отдельный конфиг (и не ломаем пакетный):
Для MariaDB: /etc/mysql/mariadb.conf.d/60-charset.cnf
Для MySQL: /etc/mysql/mysql.conf.d/60-charset.cnf
sudo nano /etc/mysql/mariadb.conf.d/60-charset.cnf
# или
sudo nano /etc/mysql/mysql.conf.d/60-charset.cnf
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[client]
default-character-set = utf8mb4
Перезапуск:
sudo systemctl restart mariadb || sudo systemctl restart mysql
Слушать только localhost (рекомендовано по умолчанию)
Если база нужна только локальным сервисам — лучший дизайн: слушать 127.0.0.1 и не выставлять MySQL наружу.
Проверим bind-address:
# MariaDB
sudo grep -R "bind-address" -n /etc/mysql/mariadb.conf.d | head
# MySQL
sudo grep -R "bind-address" -n /etc/mysql/mysql.conf.d | head
Если нужно зафиксировать:
[mysqld]
bind-address = 127.0.0.1
Если нужен удалённый доступ — делай через SSH туннель
Открывать MySQL в интернет — это проситься в логи чужих брутфорсеров. Схема простая: база слушает localhost, а ты подключаешься через туннель.
ssh -L 3307:127.0.0.1:3306 user@your-server
Дальше подключаешься к 127.0.0.1:3307.
Бэкапы: без них база — временное явление
Логический бэкап (mysqldump / mariadb-dump)
mkdir -p ~/db-backups
TS=$(date +%F-%H%M%S)
mysqldump --single-transaction --routines --triggers --events \
-u app -p appdb | gzip > ~/db-backups/appdb-$TS.sql.gz
Проверка, что архив не пустой:
ls -lh ~/db-backups | tail
zcat ~/db-backups/appdb-$TS.sql.gz | head
Восстановление:
zcat ~/db-backups/appdb-$TS.sql.gz | mysql -u app -p appdb
Мини-тюнинг: чтобы не умереть от дефолтов
На небольших серверах дефолты обычно “вроде нормально”. На живых проектах — нет. Быстрые метрики прямо сейчас:
mysql -e "SHOW GLOBAL STATUS LIKE 'Threads_connected';"
mysql -e "SHOW GLOBAL STATUS LIKE 'Queries';"
mysql -e "SHOW VARIABLES LIKE 'max_connections';"
mysql -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
Если сервер под веб/панели/игровые базы — главный рычаг обычно InnoDB buffer pool. Но ставить “на глаз” опасно: лучше смотреть по памяти сервера и реальной нагрузке.
Типовые проверки и диагностика
Порт слушается?
sudo ss -lntp | grep 3306 || true
Логи сервиса:
sudo journalctl -u mariadb -n 200 --no-pager || sudo journalctl -u mysql -n 200 --no-pager
Проверка входа локально:
mysql -u app -p -e "SELECT 1;"