Установка MySQL на VPS — первое, что приходится делать после веб-сервера: без базы данных не заработает ни WordPress, ни интернет-магазин, ни самописное приложение. Хорошая новость в том, что в Ubuntu 24.04 LTS MySQL 8.0 ставится из штатного репозитория за пару минут. Плохая — что установка «по умолчанию» оставляет открытые вопросы: root без пароля, отсутствие отдельных пользователей, настройки памяти под сервер, которого у вас нет. В этой инструкции разберём весь путь: установка MySQL на Ubuntu, защита через mysql_secure_installation, создание базы и пользователя, настройка под ваш объём RAM и автоматические бэкапы. Все команды проверены на Ubuntu 24.04 и выполняются от пользователя с sudo.
Что понадобится перед установкой
Для комфортной работы MySQL 8 вместе с веб-сервером и PHP нужен VPS минимум с 2 ГБ RAM, а лучше — с запасом: базе выгодно держать «горячие» данные в памяти, и чем больше буфер, тем меньше обращений к диску. Второй фактор — скорость диска: MySQL постоянно пишет журналы транзакций, поэтому NVMe-накопитель даёт ощутимый выигрыш по сравнению с обычным SSD и тем более HDD.
Если сервера ещё нет, для типового сайта с базой данных подойдёт тариф Start у Cheap-Host: 6 vCPU, 8 ГБ RAM и 96 ГБ NVMe за 450 ₽/мес — этого хватает и на MySQL, и на Nginx с PHP-FPM. Сервер выдаётся за 45–60 секунд, так что к установке можно приступать почти сразу после оплаты.
Перед началом убедитесь, что:
- вы подключены по SSH под пользователем с правами sudo (работать под root напрямую — плохая привычка);
- система обновлена;
- настроен файрвол — если ещё нет, начните с нашей инструкции по настройке UFW на Ubuntu.
Установка MySQL на Ubuntu 24.04
Обновляем индекс пакетов и систему:
sudo apt update && sudo apt upgrade -y
Ставим сервер MySQL:
sudo apt install mysql-server -y
В Ubuntu 24.04 из репозитория устанавливается MySQL 8.0 — актуальная стабильная ветка. Проверяем версию и состояние службы:
mysql --version
sudo systemctl status mysql
В выводе systemctl должно быть active (running). Включаем автозапуск при перезагрузке сервера:
sudo systemctl enable mysql
На этом установка формально закончена — но оставлять базу в таком виде нельзя. Переходим к защите.
Защита MySQL: mysql_secure_installation
В комплекте с MySQL идёт скрипт первичной защиты. Запускаем его от sudo:
sudo mysql_secure_installation
Скрипт задаст несколько вопросов. Рекомендуемые ответы:
- VALIDATE PASSWORD component — ответьте
Yи выберите уровень1 (MEDIUM): пароли пользователей должны будут содержать буквы разных регистров, цифры и спецсимволы. - Remove anonymous users? —
Y. Анонимные учётки нужны только для тестов. - Disallow root login remotely? —
Y. Root должен входить только локально. - Remove test database? —
Y. Тестовая база в продакшене не нужна. - Reload privilege tables now? —
Y, чтобы изменения применились сразу.
Важный нюанс Ubuntu: root-пользователь MySQL здесь по умолчанию аутентифицируется через плагин auth_socket. Это значит, что войти под ним можно только командой sudo mysql с самого сервера — пароль не спрашивается, но и удалённо этой учёткой воспользоваться невозможно. Это безопасная схема, менять её не нужно. Для приложений мы создадим отдельных пользователей.
Создание базы данных и пользователя
Никогда не подключайте сайт к базе под root. Правильная схема: одна база — один пользователь с правами только на неё. Входим в консоль MySQL:
sudo mysql
Создаём базу с корректной кодировкой (utf8mb4 поддерживает полный Unicode, включая эмодзи):
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Создаём пользователя и выдаём ему права только на эту базу:
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'Slozhny-Parol_2026!';
GRANT ALL PRIVILEGES ON myapp.* TO 'myapp_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Ограничение @'localhost' означает, что подключиться этот пользователь сможет только с самого сервера — именно так работают сайты, где база и приложение живут на одном VPS. Проверяем вход:
mysql -u myapp_user -p myapp
Если консоль открылась — учётка работает. Эти же логин и пароль вы укажете в конфигурации сайта, например при установке WordPress на VPS или сборке LEMP-стека.
Первичная настройка MySQL под ваш объём RAM
Конфигурация по умолчанию рассчитана на минимальное потребление памяти, а не на производительность. Главный параметр, который стоит поправить, — innodb_buffer_pool_size: это кеш данных и индексов InnoDB. Чем он больше, тем реже MySQL ходит на диск.
Ориентиры по размеру буфера:
| RAM сервера | Сценарий | innodb_buffer_pool_size |
|---|---|---|
| 2 ГБ | MySQL + веб-сервер + PHP | 512M |
| 8 ГБ | MySQL + веб-сервер + PHP | 2G |
| 8 ГБ | Только MySQL (отдельный сервер БД) | 4G–5G |
| 16 ГБ | MySQL + остальной стек | 4G–6G |
Открываем конфиг:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
В секцию [mysqld] добавляем (пример для VPS с 8 ГБ RAM, где рядом работают Nginx и PHP):
innodb_buffer_pool_size = 2G
innodb_log_buffer_size = 32M
max_connections = 150
Перезапускаем службу и убеждаемся, что она поднялась:
sudo systemctl restart mysql
sudo systemctl status mysql
Параметр max_connections держите разумным: каждое соединение потребляет память, и 150 одновременных подключений для сайта — это уже серьёзная нагрузка. Если память на сервере в дефиците и MySQL периодически убивает OOM-killer, посмотрите статью про настройку swap на VPS — своп не заменит RAM, но спасёт от аварийных падений.
Доступ извне: когда открывать и как не подставиться
По умолчанию MySQL в Ubuntu слушает только локальный интерфейс — за это отвечает строка bind-address = 127.0.0.1 в конфиге. Для сайта на том же сервере это идеальный режим: снаружи база недоступна в принципе.
Открывать порт 3306 наружу стоит только в одном случае — когда к базе подключается другой ваш сервер (например, приложение и БД разнесены по разным VPS). Тогда:
- В
mysqld.cnfзаменитеbind-addressна IP-адрес, на котором сервер должен принимать подключения (или0.0.0.0, если интерфейсов несколько). - Создайте пользователя с привязкой к конкретному IP клиента:
CREATE USER 'myapp_user'@'203.0.113.10' IDENTIFIED BY '...'; - Откройте порт в UFW только для этого адреса:
sudo ufw allow from 203.0.113.10 to any port 3306 proto tcp
Порт 3306, открытый всему интернету, сканеры находят за часы — дальше начинается перебор паролей и попытки эксплуатации. Правило простое: нет явной причины открывать — не открывайте.
Бэкапы: mysqldump по расписанию
База без бэкапов — это данные, которые вы согласны потерять. Минимально достаточная схема для баз до нескольких десятков гигабайт — ежедневный логический дамп:
mysqldump --single-transaction -u myapp_user -p myapp | gzip > /var/backups/myapp-$(date +%F).sql.gz
Ключ --single-transaction снимает согласованный снимок InnoDB-таблиц без блокировки записи — сайт продолжит работать во время дампа. Для автоматизации создайте файл с учётными данными ~/.my.cnf (права 600), чтобы не хранить пароль в скриптах, и добавьте задачу в cron на ночное время. Восстановление из дампа — одной командой:
gunzip < /var/backups/myapp-2026-07-17.sql.gz | mysql -u myapp_user -p myapp
Хранить копии только на том же VPS — половина дела: при отказе диска пропадёт и база, и бэкап. Как выстроить полноценную схему хранения по правилу 3-2-1, мы разбирали в статье о резервном копировании VPS.
FAQ
Какая версия MySQL ставится на Ubuntu 24.04 из репозитория?
Команда apt install mysql-server устанавливает MySQL 8.0 — актуальную стабильную ветку. Она получает обновления безопасности вместе с системой через apt upgrade, поэтому подключать сторонние репозитории для типового проекта не нужно.
Почему sudo mysql пускает без пароля — это дыра в безопасности?
Нет. В Ubuntu root-пользователь MySQL по умолчанию использует плагин auth_socket: вход возможен только локально и только из-под системного root. Снаружи этим способом воспользоваться нельзя. Для приложений создавайте отдельных пользователей с паролями.
Сколько RAM нужно VPS для MySQL?
Для сайта или небольшого приложения достаточно 2–4 ГБ свободной памяти под MySQL, при этом innodb_buffer_pool_size ставят в 50–60% RAM на выделенном под базу сервере или 25–30% там, где рядом работают веб-сервер и PHP. VPS с 8 ГБ RAM хватает на весь стек с запасом.
Можно ли открыть MySQL для подключения извне?
Можно, но только при реальной необходимости: измените bind-address, создайте пользователя с ограничением по IP и откройте порт 3306 в файрволе только для конкретного адреса. Держать 3306 открытым для всего интернета нельзя — базу быстро найдут сканеры.
Чем делать бэкапы MySQL?
Для баз до нескольких десятков гигабайт достаточно mysqldump с ключом --single-transaction по расписанию cron. Дамп сжимайте gzip и храните копии не только на самом VPS, но и на другом сервере или в облачном хранилище.
Вывод
Полный цикл — установка MySQL, прогон mysql_secure_installation, создание изолированного пользователя, настройка буфера под RAM и бэкап по cron — занимает минут двадцать, а избавляет от большинства типовых проблем: от взлома через открытый порт до потери данных при сбое диска. База данных любит память и быстрый диск, поэтому экономить именно на этих ресурсах не стоит.
Если для проекта с MySQL вам нужен сервер — у Cheap-Host тариф Start от 450 ₽/мес: 6 vCPU, 8 ГБ RAM, 96 ГБ NVMe, KVM с полным root и безлимитный трафик. Сервер выдаётся за минуту, а при росте базы CPU, RAM и диск можно расширить без потери данных: cheap-host.onl.