## Введение [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 запущена и работает.