MySQL ir MariaDB diegimas Ubuntu: apsauga ir bazė

Paleiskite serveryje viena komanda (pirmiausia patikrinkite skripto turinį žemiau):

curl -sSL https://cp.lv/scripts/ustanovit-mysql-mariadb.sh | sudo bash

…arba su wget:

wget -qO- https://cp.lv/scripts/ustanovit-mysql-mariadb.sh | sudo bash

Skripto turinys ustanovit-mysql-mariadb.sh:

#!/usr/bin/env bash
# Install MySQL, create a database and a user
set -e
export DEBIAN_FRONTEND=noninteractive

DB_NAME=app_db
DB_USER=app_user
DB_PASS='StrongPassword123!'

# 1. Install the server (use mariadb-server for MariaDB)
sudo apt-get update
sudo apt-get install -y mysql-server
sudo systemctl enable --now mysql

# 2. utf8mb4 database and a user with rights to that database only
sudo mysql << EOF
CREATE DATABASE IF NOT EXISTS ${DB_NAME} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS '${DB_USER}'@'localhost' IDENTIFIED BY '${DB_PASS}';
GRANT ALL PRIVILEGES ON ${DB_NAME}.* TO '${DB_USER}'@'localhost';
FLUSH PRIVILEGES;
EOF

echo "Done: database ${DB_NAME} and user ${DB_USER} created."

MySQL ir su ja suderinama MariaDB yra labiausiai paplitusios reliacinės duomenų bazių sistemos žiniatinklio programoms. Komandos beveik identiškos, todėl gidas tinka abiem. Žemiau — diegimas Ubuntu sistemoje, apsauga ir duomenų bazės svetainei sukūrimas.

1 žingsnis. Serverio diegimas

MySQL atveju:

sudo apt update
sudo apt install mysql-server -y

MariaDB atveju (lengvesnė alternatyva, visiškai suderinama):

sudo apt install mariadb-server -y

Įjunkite automatinį paleidimą:

sudo systemctl enable --now mysql   # MariaDB atveju: mariadb

Patikrinkite būseną:

sudo systemctl status mysql

2 žingsnis. Serverio apsauga

Scenarijus mysql_secure_installation uždaro tipines numatytosios konfigūracijos spragas:

sudo mysql_secure_installation

Atsakykite taip:

  • Validate password plugin — pasirinktinai (įjungia slaptažodžių sudėtingumo tikrinimą).
  • Set root password — nustatykite patikimą root slaptažodį.
  • Remove anonymous users — Yes.
  • Disallow root login remotely — Yes.
  • Remove test database — Yes.
  • Reload privilege tables — Yes.

3 žingsnis. Prisijungimas prie konsolės

Šviežiai įdiegtoje sistemoje root jungiasi per soketą be slaptažodžio:

sudo mysql

Jei nustatėte slaptažodį ir norite jungtis įprastu būdu:

mysql -u root -p

4 žingsnis. Duomenų bazės ir vartotojo sukūrimas

Sukurkite duomenų bazę su koduote utf8mb4 (jaustukų ir visų kalbų palaikymas) bei atskirą vartotoją:

CREATE DATABASE app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Suteikite teises tik reikiamai bazei (app_db.*), o ne visoms (*.*) — tai mažiausių privilegijų principas.

5 žingsnis. Prisijungimo patikra

mysql -u app_user -p app_db

Įveskite slaptažodį. Eilutė mysql> reiškia sėkmingą prisijungimą. Patikrinkite bazių sąrašą:

SHOW DATABASES;

6 žingsnis. Nuotolinė prieiga (pasirinktinai)

Jei užpakalinė dalis veikia kitame serveryje, sukurkite vartotoją, susietą su konkrečiu IP, ir leiskite klausytis išorėje. Atidarykite konfigūraciją redaktoriuje (nano, vim arba mcedit):

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Sekcijoje [mysqld] nurodykite klausymo adresą:

bind-address = 10.0.0.5

Arba sukurkite atskirą perrašymo failą viena komanda — nukopijuokite ir įklijuokite į konsolę (MySQL nuskaitys visus .cnf iš katalogo):

sudo tee /etc/mysql/mysql.conf.d/zz-bind-address.cnf > /dev/null << 'EOF'
[mysqld]
bind-address = 10.0.0.5
EOF
CREATE USER 'app_user'@'10.0.0.10' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'10.0.0.10';
FLUSH PRIVILEGES;

Atidarykite prievadą tik patikimam šaltiniui:

sudo ufw allow from 10.0.0.10 to any port 3306
sudo systemctl restart mysql

Dažni klausimai

MySQL ar MariaDB — ką rinktis? Daugumai svetainių skirtumas nepastebimas. MariaDB šiek tiek lengvesnė ir visiškai suderinama su MySQL programomis. Oracle MySQL turi kai kurių įmonėms skirtų funkcijų. SQL sintaksė identiška.

Kodėl root jungiasi tik per sudo mysql? Pagal numatytuosius nustatymus naudojama autentikacija per soketą (auth_socket). Kad įjungtumėte prisijungimą slaptažodžiu: ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'slaptazodis';.

Klaida „Access denied for user“ — ką patikrinti? Palyginkite vartotojo vardą, hostą ('user'@'localhost''user'@'%') ir slaptažodį. Hostas vartotojo įraše turi sutapti su prisijungimo šaltiniu.

Kam reikalinga utf8mb4 koduotė? Senoji utf8 MySQL sistemoje saugo daugiausiai 3 baitus simboliui ir nepalaiko jaustukų. utf8mb4 yra visavertis UTF-8 — naudokite ją pagal numatytuosius nustatymus.

Duomenų bazėms reikia greito disko ir stabilių resursų. MySQL ir MariaDB tiks planai puslapyje VPS serverio nuoma bei specializuotas VPS duomenų bazėms.

Roman Sokolov