Установка MySQL 8 в Ubuntu 22.04

03.04.2023

Введение

MySQL – сервер баз данных с открытым исходным кодом, разработанный шведами, распростараняется бесплатно. Позже стала частью компании Oracle. Сейчас мы рассмотрим процесс установки сервера MySQL 8 на Ubuntu Server 22.04 и настройки внешнего доступа к базам данных.

Устанавливаем MySQL сервер на Ubuntu

По традиции все подобные статьи всегда начинаются с обновления операционной системы. Вуаля:

sudo apt update

А так как в репозитории Ubuntu стандартно всегда присутствует последняя версия MySQL, то ни скачивать отдельно с сайта ни подключать дополнительных репизиториев нам для установки MySQL на Ubuntu 22.04 не потребуется. Просто откройте терминал и введите следующую команду.

sudo apt install mysql-server mysql-client

Ну, а после установки нам нужно запустить сервис MySQL.

sudo systemctl start mysql.service

Настраиваем MySQL сервер

В установке MySQL на Ubuntu 22.04 ничего сложного не оказалось, правда ведь? Теперь нам нужно настроить наш sql сервер. Для начала запустим его.

sudo mysql

И первое, что нам нужно, так это установить рутовый пароль на MySQL сервер

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'М0Й_П@РОЛb';
mysql> exit

Теперь перейдём к самим настройкам. В терминале нужно запустить команду ниже. Запустится скрипт, который пошагово поможет нам настроить первоначальную конфигурацию нашего MySQL сервера на Ubuntu. (вывод команды и расшифровка ниже)

sudo mysql_secure_installation

Вывод команды sudo mysql_secure_installation:

~$ sudo mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root:

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: Y

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2
Using existing password for root.

Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) :

 ... skipping.
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
Success.

All done!

  • Remove anonymous users – удалить аноноимных пользователей
  • Disallow root login remotely – отключить удалённые подключения для root пользователя, это касается только удалённых подключений, подключения с localhost удалёнными не считаются.
  • Remove test database and access to it – удалить тестовую базу данных.
  • Reload privilege tables now – перезагрузить таблицу привилегий.

Заходим в MySQL под пользователем root, вас попросят ввести пароль:

mysql -u root -p

Чтобы настроить вход через команду sudo mysql (на мой взгляд так намного удобнее). Включим возможность аутентификации с auth_socket:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH auth_socket;
mysql> exit

Теперь мы можем логиниться в MySQL через sudo.

Создаём нового пользователя в MySQL и выдаём ему разрешения

Заходим в базу под рутом для того, чтобы создать нового пользователя:

sudo mysql

Создаем пользователя username и указываем пароль password для авторизации на нашем MySQL сервере:

mysql> CREATE USER 'username'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

Выдаём новому пользователю привилегии (опционально):

mysql> GRANT CREATE, ALTER, DROP, INSERT, UPDATE, INDEX, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'username'@'localhost' WITH GRANT OPTION;

Или сразу всё в одном через параметр ALL.

mysql> GRANT ALL PRIVILEGES ON *.* TO 'username'@'%';

Далее приминяем внесённые изменения:

mysql> FLUSH PRIVILEGES;

И выходим из оболочки управления сервером MySQL

mysql> exit

И пробуем авторизоваться под только что созданным пользователем:

mysql -u username -p

Теперь давайте протестируем MySQL

Вот мы и настроили нашь MySQL сервер на Ubuntu 22.04. Теперь давайте удостоверимся, что служба mysql запущена и работает корректно. Запускаем команду:

systemctl status mysql.service

На выводе мы увидим, что сервис запушен и работает (active):

● mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-04-03 06:12:56 UTC; 52min ago
   Main PID: 35355 (mysqld)
     Status: "Server is operational"
      Tasks: 39 (limit: 1025)
     Memory: 361.4M
        CPU: 20.924s
     CGroup: /system.slice/mysql.service
             └─35355 /usr/sbin/mysqld

Apr 03 06:12:55 system systemd[1]: Starting MySQL Community Server...
Apr 03 06:12:56 system systemd[1]: Started MySQL Community Server.

Если сервис не работает, запустите его командой:

sudo systemctl start mysql.service

Отлично, сервис работет. Теперь попробуем через подключение к sql серверу получить информаию о его версии, тем самым проверить его работоспособность.

sudo mysqladmin -p -u username version

Вывод:

~$ sudo mysqladmin -p -u username version
Enter password:
mysqladmin  Ver 8.0.32-0ubuntu0.22.04.2 for Linux on x86_64 ((Ubuntu))
Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Server version          8.0.32-0ubuntu0.22.04.2
Protocol version        10
Connection              Localhost via UNIX socket
UNIX socket             /var/run/mysqld/mysqld.sock
Uptime:                 57 min 22 sec

Threads: 2  Questions: 25  Slow queries: 0  Opens: 182  Flush tables: 3  Open tables: 101 
Queries per second avg: 0.007

Если у вас вывод в консоли похож на тот что выше, то всё хорошо. С основными настройками MySQL сервера на Ubuntu мы с вами закончили.

Удаленный доступ к MySQL

MySQL сервер мы установили, настроили, но мы с ним можем работать только локально, а для подключение к нему через сеть нужно дополнительно настроить такую возможность. Открываем на редактирование конфигурационный файл mysqld.cnf:

Редактирование конфигурационного файла

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
mysqld.cnf
Редактирование файла mysqld.cnf

Переходим к конфигурированию параметра bind-address:

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address = 127.0.0.1

Чтобы разрешить доступ с любых IP-адресов, укажите здесь 0.0.0.0.

Обратите внимание, что такая настройка может быть небезопасной. Рекомендуется использовать конкретный(ые) IP адрес, с которого вы собираетесь работать с базой данных.

После того как закончите редактирование конфига сервера MySQL, для применения параметров перезапускаем сервер MySQL командой:

sudo systemctl restart mysql

Даём привилегии пользователю на доступ из вне

Ок, сам сервер нам доступен по сети, но нужно настроить ещё и доступ для пользователя MySQL на доступ к серверу из вне. Запускаем клиент MySQL сервера

sudo mysql

И создаём пользователя

CREATE USER 'username'@'%' IDENTIFIED BY 'password';

Если мы хотим создать пользователя, который сможет подключаться только с определенного IP адреса (xxx.xxx.xxx.xxx):

CREATE USER 'username'@'xxx.xxx.xxx.xxx' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'username'@'%';
FLUSH PRIVILEGES;

Почти готово :-)

Ограничения файрвола

Открываем порт для MySQL сервер на Ubuntu через iptables

И осталось настроить доступ из вне в самой Ubuntu. для этого в iptables нужно открыть порт 3306 (используется по умолчанию для MySQL сервера. Можно изменить в конфигурационном файле, который мы с вами редактировали выше). Если мы хотим открыть на доступ к MySQL на Ubuntu только для конкретного ip адреса:

sudo iptables -A INPUT -s xxx.xxx.xxx.xxx -p tcp --destination-port 3306 -j ACCEPT

А если мы хотим открыть для всех входящих соединений:

sudo iptables -A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT

После можно проверить список правил файрвола в iptables следующей командой:

sudo iptables -nvL

Также мы можем настроить iptables для входящих только с определенных ip адресов, а для остальных запретить:

/sbin/iptables -A INPUT -s 127.0.0.1 -p tcp --destination-port 3306 -j ACCEPT
/sbin/iptables -A INPUT -s xxx.xxx.xxx.xxx -p tcp --destination-port 3306 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 3306 -j DROP

Открываем порт для MySQL сервер на Ubuntu через UFW

Ещё в Ubuntu по дефолту идёт оболочка UFW (Uncomplicated Firewall), можно через неё открыть доступ к порту нашего сервера MySQl:

sudo ufw allow 3306

А также, если нам нужно открыть только для определенного ip адреса:

sudo ufw allow from xxx.xxx.xxx.xxx to any port 3306

После завершения настройки проверьте, что пользователь может подключиться к MySQL удаленно. На другой машине запустите клиент MySQL с следующими параметрами:

mysql -u username -h xxx.xxx.xxx.xxx -p

Если в настройке сервера MySQL на Ubuntu 22.04 следовали всем инструкциям выше, то у вас должно было всё получиться. Если будут вопросы, пишите в комментарии. Всем Спасибо!

Автору на кофе ☕ или просто поднять мотивацию писать больше статей для вас 😉 !
Отдельное спасибо всем, кто отправляет донатики 😀! Очень приятно и неожиданно. Благодаря вам сайт может и в дальнейшем обходиться без рекламных баннеров.
4060