tech-tips/Программное обеспечение/СУБД/MySQL - MariaDB/Как установить MySQL в Ubuntu 18.04 DigitalOcean.md

167 lines
15 KiB
Markdown
Raw Normal View History

## Введение
[MySQL](https://www.mysql.com/) является системой управления базами данных с открытым исходным кодом и обычно используется, как часть популярного стека [LAMP](https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-ubuntu-18-04) ( #Linux, #Apache, #MySQL, #PHP / #Python / #Perl). MySQL использует реляционную базу данных и SQL (Structured Query Language, язык структурированных запросов) для управления данными.
Короткая версия установки очень проста: достаточно обновить индекс пакетов, установить пакет `mysql-server`, а затем запустить скрипт настройки безопасности.
```shell
sudo apt install mysql-server
```
Это руководство описывает процесс установки MySQL версии 5.7 на сервер с Ubuntu 18.04. Если вам необходимо обновить установленную ранее версию MySQL до версии 5.7, вы можете ознакомиться с [руководством по обновлению MySQL до версии 5.7](https://www.digitalocean.com/community/tutorials/how-to-prepare-for-your-mysql-5-7-upgrade).
## Необходимые условия
Перед тем, как начать следовать шагам, описанным в этом руководстве, вам необходимо настроить отдельный, не-рутовый (non-root) профиль пользователя на вашем сервере с Ubuntu 18.04. Вы можете сделать это используя нашу [статью о первичной настройке сервера на Ubuntu 18.04](https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04).
## Шаг 1 - Установка MySQL
По умолчанию в репозиторий пакетов APT в Ubuntu 18.04 включена только последняя версия MySQL. На момент написания этого руководства это MySQL 5.7.
Для установки этой версии обновите индекс пакетов `apt` командой:
```shell
sudo apt update
```
Затем установите пакет:
```shell
sudo apt install mysql-server
```
Эта команда установит MySQL, но при этом вам не будет предложено задать пароль или внести какие-либо правки в конфигурацию. Поскольку это делает установку небезопасной, рассмотрим далее, как настроить установленную MySQL.
## Шаг 2 - Настройка MySQL
В случае новой установки MySQL вам необходимо выполнить скрипт безопасности. Он изменяет некоторые настройки по умолчанию на более безопасные, например, удалённый вход для пользователей root и пользователи, созданные по умолчанию. В старых версиях MySQL вам было необходимо также инициализировать директорию данных вручную, теперь это делается автоматически.
Выполните скрипт безопасности командой:
В результате выполнения этого скрипта вам будет предложено внести изменения в настройки безопасности вашей MySQL. Сначала вам будет предложено установить плагин валидации паролей (Validate Password Plugin), который позволяет тестировать надёжность паролей MySQL. Далее вам предложат задать пароль для пользователя **root** вашей установки MySQL. Выберите надёжный пароль и введите его два раза.
Далее вы можете выбирать `Y` и нажимать `ENTER` для всех последующих вопросов. При этом будут удалены некоторые анонимные пользователи и тестовые базы данных, будет отключена возможность удалённого входа для root пользователей, после чего все внесённые изменения будут применены к вашей установке MySQL.
Для инициализации директории данных MySQL вам необходимо использовать `mysql_install_db` для версий меньше, чем 5.7.6, и `mysqld --initialize` для версии 5.7.6 и более поздних версий. При этом, если вы устанавливаете MySQL для Debian как описано на шаге 1, директория данных будет создана автоматически и вам нет необходимости что-то делать. Если вы при этом попытаетесь всё равно выполнить команду создания директории данных, вы увидите следующую ошибку:
```shell
mysqld: Can't create directory '/var/lib/mysql/' (Errcode: 17 - File exists)
. . .
2018-04-23T13:48:00.572066Z 0 [ERROR] Aborting
```
Обратите внимание, несмотря на то, что вы задали пароль для пользователя **root** для MySQL, этот пользователь не настроен для аутентификации по паролю при подключении к оболочке (shell) MySQL. Вы можете изменить эту настройку на следующем шаге 3.
## Шаг 3 - (Опционально) Настройка аутентификации и привилегий
На серверах с Ubuntu, использующей MySQL 5.7 (и более поздние версии), пользователь **root** в MySQL по умолчанию аутентифицируется с помощью плагина `auth_socket`, а не по паролю. Это в целом более безопасно и удобно во многих случаях, но не в случае, когда вам необходимо организовать доступ к MySQL со стороны сторонней программы, например, phpMyAdmin.
Для того, чтобы пользователь **root** в MySQL мог использовать пароль для входа в систему вам необходимо изменить метод аутентификации с `auth_socket` на `mysql_native_password`. Для этого войдите в оболочку MySQL следующей командой:
```shell
sudo mysql
```
Далее проверьте, какой метод аутентификации используется для каждого из ваших пользователей MySQL:
```
+------------------+-------------------------------------------+-----------------------+-----------+
| user | authentication_string | plugin | host |
+------------------+-------------------------------------------+-----------------------+-----------+
| root | | auth_socket | localhost |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)
```
В этом примере ваш пользователь **root** использует аутентификацию с помощью плагина `auth_socket`. Для изменения этой настройки на использование пароля используйте следующую команду `ALTER USER`. Не забудьте изменить `password` на ваш сильный пароль:
Далее выполните команду `FLUSH PRIVILEGES`, которая применит внесённые изменения:
Проверьте методы авторизации для пользователей ещё раз для того, чтобы убедиться, что пользователь **root** более не использует плагин `auth_socket` для авторизации:
```
+------------------+-------------------------------------------+-----------------------+-----------+
| user | authentication_string | plugin | host |
+------------------+-------------------------------------------+-----------------------+-----------+
| root | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost |
| debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)
```
Как можно видеть на представленном выводе теперь **root** пользователь MySQL аутентифицируется с использованием пароля. После того, как мы в этом убедились, можно выйти из оболочки MySQL:
```shell
exit
```
В некоторых случаях бывает полезно использовать для входа в MySQL отдельного пользователя. Для создания такого пользователя войдите в оболочку MySQL:
```shell
sudo mysql
```
**Внимание:** Если вы включили вход по паролю для пользователя **root**, как описано выше, вам потребуется использовать другую команду для входа в оболочку MySQL. Команда выше запустит оболочку с привилегиями обычного пользователя, для получения привилегий администратора вам необходимо выполнить следующую команду:
Далее создайте нового пользователя и задайте для него надёжный пароль:
Далее задайте для пользователя подходящий набор привилегий. Например, вы можете дать пользователю доступ ко всем таблицами в базе данных, а также права на добавление, изменение и удаление пользовательских привилегий следующей командой:
Обратите внимание на то, что в этом случае вам нет необходимости выполнять команду `FLUSH PRIVILEGES`. Эта команда необходимо только тогда, когда вы изменяете таблицы доступа (grant tables) используя команды `INSERT`, `UPDATE` или `DELETE`. Поскольку вы создали нового пользователя, а не редактируете права существующего пользователя, команда `FLUSH PRIVILEGES` не является необходимой.
После этого, выйдите из оболочки MySQL:
```shell
exit
```
Теперь мы можем протестировать нашу установку MySQL.
## Шаг 4 - Тестирование MySQL
Вне зависимости от того, как именно вы установили MySQL, она должна запуститься автоматически. Проверим это следующей командой:
Вы увидите вывод, похожий на этот:
```
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: en
Active: active (running) since Wed 2018-04-23 21:21:25 UTC; 30min ago
Main PID: 3754 (mysqld)
Tasks: 28
Memory: 142.3M
CPU: 1.994s
CGroup: /system.slice/mysql.service
└─3754 /usr/sbin/mysqld
```
Если MySQL не запущена, вы можете запустить её с помощью команды `sudo systemctl start mysql`.
Для дополнительной проверки вы можете попробовать подключиться к базе данных с помощью инструмента `mysqladmin`, который представляет собой клиент, позволяющий запускать административные команды. Например, эта команда приказывает подключиться к MySQL в качестве пользователя **root** (`-u root`), запросить пароль (`-p`) и вернуть версию.
Вы увидите вывод, похожий на этот:
```
mysqladmin Ver 8.42 Distrib 5.7.21, for Linux on x86_64
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Server version 5.7.21-1ubuntu1
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/run/mysqld/mysqld.sock
Uptime: 30 min 54 sec
Threads: 1 Questions: 12 Slow queries: 0 Opens: 115 Flush tables: 1 Open tables: 34 Queries per second avg: 0.006
```
Это означает, что MySQL запущена и работает.