MariaDB — форк MySQL с улучшенной производительностью. На большинстве VPS-серверов ZevsHost доступна из официальных репозиториев Ubuntu.
Установка MariaDB
sudo apt update
sudo apt install -y mariadb-server mariadb-client
# Запустить и включить автозапуск
sudo systemctl start mariadb
sudo systemctl enable mariadb
# Начальная защита
sudo mysql_secure_installation
В ходе mysql_secure_installation рекомендуется:
- Установить пароль root — Yes
- Удалить анонимных пользователей — Yes
- Запретить root вход удалённо — Yes
- Удалить тестовую БД — Yes
Создание базы данных и пользователя
sudo mysql -u root -p
-- Создать базу данных
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- Создать пользователя
CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'сложный_пароль';
-- Выдать права
GRANT ALL PRIVILEGES ON myapp.* TO 'myuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Настройка удалённого доступа
# Открыть порт только для конкретного IP
sudo ufw allow from 203.0.113.10 to any port 3306
# Разрешить bind в MariaDB
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
# Изменить: bind-address = 0.0.0.0
sudo systemctl restart mariadb
Автоматическое резервное копирование
# Создать скрипт бэкапа
cat > /usr/local/bin/db-backup.sh << 'EOF'
#!/bin/bash
DATE=$(date +%Y-%m-%d)
mysqldump -u root -p'ВАШ_ПАРОЛЬ' myapp | gzip > /backups/myapp-$DATE.sql.gz
find /backups -name "*.sql.gz" -mtime +7 -delete
EOF
chmod +x /usr/local/bin/db-backup.sh
mkdir -p /backups
# Добавить в cron (каждый день в 3:00)
echo "0 3 * * * root /usr/local/bin/db-backup.sh" >> /etc/crontab
Разбор типичных ошибок
"ERROR 1698 (28000): Access denied for user 'root'@'localhost'" при попытке зайти под root сразу после установки — на Ubuntu/Debian MariaDB по умолчанию использует плагин unix_socket, и пароль root вообще не проверяется, если подключаться не через sudo.
mysql -u root -p
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
Решение — подключайтесь как sudo mysql (без пароля, через unix_socket) или явно смените метод аутентификации: ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('пароль');.
Удалённое подключение падает с "ERROR 2003: Can't connect to MySQL server" — при том что bind-address изменён и порт открыт в UFW, часто причина в том, что сам пользователь MySQL создан с хостом localhost, а не с конкретным IP или %.
ERROR 2003 (HY000): Can't connect to MySQL server on '203.0.113.10' (111)
-- Ошибка 111 = Connection refused: порт закрыт или сервис не слушает его
Проверьте одновременно три вещи: bind-address в конфиге, правило UFW и хост в определении пользователя (SELECT host FROM mysql.user WHERE user='myuser';) — без совпадения всех трёх подключение не пройдёт.
Варианты установки СУБД: сравнение
| СУБД | Совместимость с MySQL | Производительность на VPS | Когда выбрать |
|---|---|---|---|
| MariaDB (из репозитория Ubuntu) | Полная | Хорошая, оптимизирована по умолчанию | Большинство проектов на VPS |
| MySQL Community Server | — | Сопоставимая | Требование конкретного ПО (например, Oracle-специфика) |
| PostgreSQL | Нет, другой диалект SQL | Лучше для сложных запросов и JSON | Аналитика, сложная бизнес-логика |
| SQLite | Нет | Отличная для малой нагрузки, без сервера | Небольшие приложения, один процесс записи |
Когда локальной MariaDB недостаточно
- Нагрузка растёт быстрее, чем один VPS может обработать — потребуется отдельный сервер БД или репликация master-slave.
- Приложению нужны сложные JSON-запросы или оконные функции — PostgreSQL часто удобнее для такой нагрузки, чем MariaDB.
- Нужна высокая доступность без ручного вмешательства при падении сервера — потребуется кластер (Galera) или managed-решение, а не одиночный инстанс MariaDB.
Проверка результата
- Проверьте, что сервис запущен и добавлен в автозагрузку:
systemctl is-enabled mariadb && systemctl is-active mariadb— оба должны вернуть положительный статус. - Подключитесь под новым пользователем:
mysql -u myuser -p myapp— вход должен пройти без ошибок. - Проверьте права:
SHOW GRANTS FOR 'myuser'@'localhost';должен показать именно те права, что вы выдали. - Проверьте, что бэкап действительно создаётся:
ls -lh /backups/должен содержать свежий файл после ручного запуска/usr/local/bin/db-backup.sh.
Резервное копирование конкретно для больших нагруженных баз описано отдельно в статье про автоматизацию бэкапов MySQL, а базовые права пользователей — в руководстве по привилегиям MySQL.