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.