Ми}{@лbI4

Блог хеллоуворлдщика

Установка MySQL 5.7 из generic

20.02.2022 mysql, инструкция, установка, linux, debian

Данный способ практически нигде не рассматривается и не упоминается. Обычно можно встретить вариант установки через репозиторий, и это считается предпочтительным способом. Я же считаю иначе и предпочитаю установку из generic (binary). Это уже универсально скомпилированный MySQL для запуска на практически любой unix-подобной системе. По моему мнению, данный метод в разы удобней, хотя и предполагает более обширные знания, чем установка через репозиторий. В данной статье поставлена цель научить и объяснить способ установки через generic.

По другому данный способ может называться как "устнановка из бинарников". В своей статье я буду использовать слово generic.

Для примера будет использована версия MySQL 5.7 и Debian 11. Вам также потребуются минимальные знания Bash и командной строки. Мы разберем следующий bash-скрипт для установки и настройки MySQL:

apt-get -y install libaio1 libncurses5 libnuma1
ln -s /usr/lib/x86_64-linux-gnu/libncurses.so.5.9 /lib64/libtinfo.so.5

groupadd mysql
useradd -r -g mysql -s /bin/false mysql

wget -q https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz -P ~/
tar -zxf ~/mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz

mv ~/mysql-5.7.37-linux-glibc2.12-x86_64 /opt/mysql-5.7
ln -s /opt/mysql-5.7/bin/mysql /usr/local/bin/mysql-5.7
ln -s /opt/mysql-5.7/bin/mysqldump /usr/local/bin/mysqldump-5.7

mkdir /opt/mysql-5.7/data
chown mysql:mysql /opt/mysql-5.7/data
chmod 755 /opt/mysql-5.7/data
/opt/mysql-5.7/bin/mysqld --initialize --user=mysql --basedir=/opt/mysql-5.7 --character-set-server=utf8mb4

cp /opt/mysql-5.7/support-files/mysql.server /etc/init.d/mysql-5.7
chmod +x /etc/init.d/mysql-5.7
systemctl enable mysql-5.7

mkdir /etc/mysql
cat <<EOF > /etc/mysql/my.cnf
[client]
default-character-set = utf8mb4
port = 3306
socket = /tmp/mysql-5.7.sock

[mysqld]
basedir = /opt/mysql-5.7
bind-address = 0.0.0.0
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
port = 3306
socket = /tmp/mysql-5.7.sock
default-authentication-plugin = mysql_native_password
server-id = 1
EOF

systemctl start mysql-5.7

Не стоит его пугаться, если кого-то он напугал. Всё довольно просто и понятно.

Хоть мы и рассматриваем процесс установки версии 5.7, процесс установки версии 8.0 мало чем отличается. Для версии 8.0 инструкция из официальной документации не содержит подводных камней, в отличие от инструкции для 5.7. И если вам будет понятен принцип установки 5.7 из текущей статьи, то вы без труда разберетесь с установкой 8.0 и других последующих версий.

Перед продолжением советую бегло ознакомиться с установкой из generic на официальной странице MySQL. На ней практически изложена вся информация за исключением некоторых недокументированных моментов о которых я расскажу далее.

Все действия для упрощения инструкции выполняются из под root. Поэтому либо войдите как root, либо выполните su - root и введите пароль. Если у вас есть хороший опыт в unix-подобных системах, то просто используйте sudo в нужных выражениях.

Разрешение зависимостей

Выполним установку зависимостей для работы MySQL 5.7.

apt-get -y install libaio1 libncurses5 libnuma1
ln -s /usr/lib/x86_64-linux-gnu/libncurses.so.5.9 /lib64/libtinfo.so.5

Симлинк делается из-за необходимости корректировки пути до динамической библиотеки. Это требует инструкция:

As of MySQL 5.7.19, the Linux Generic tarball package format is EL6 instead of EL5. As a side effect, the MySQL client bin/mysql needs libtinfo.so.5. A workaround is to create a symlink, such as ln -s libncurses.so.5.6 /lib64/libtinfo.so.5 on 64-bit systems or ln -s libncurses.so.5.6 /lib/libtinfo.so.5 on 32-bit systems.

Нам ничего не остается, как проверить наличие /lib64/libtinfo.so.5 и в случае отсутствия предпринять действия. На Debian 11 по указанному пути ничего нет, поэтому делается симлинк.

Группа и пользователь

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

groupadd mysql
useradd -r -g mysql -s /bin/false mysql

Скачивание и распаковка

Скачиваем и распаковываем архив со свежей версией MySQL 5.7. На момент написания статьи это 5.7.37. К тому моменту, как вы будете это читать, версия может быть другой. Проверить и поменять пути можно используя официальную страницу загрузки.

wget -q https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz -P ~/
tar -zxf ~/mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz

У вас может не быть wget или tar. Если такое случилось, то просто установите через apt: apt -y install wget tar.

Распакованный MySQL 5.7 перемещаем в директорию /opt/ и создаем необходимые симлинки. Как правило, чаще всего используется клиент и утилита создания резервных копий БД. Остальное на личное усмотрение. Полный список доступных утилит по адресу /opt/mysql-5.7/bin/.

mv ~/mysql-5.7.37-linux-glibc2.12-x86_64 /opt/mysql-5.7
ln -s /opt/mysql-5.7/bin/mysql /usr/local/bin/mysql-5.7
ln -s /opt/mysql-5.7/bin/mysqldump /usr/local/bin/mysqldump-5.7

Иницилизация

Создадим директорию /opt/mysql-5.7/data/, где будет иницилизированы базы данных и другие файлы необходимые MySQL. В этой же директории будут храниться базы данных пользователя.

mkdir /opt/mysql-5.7/data
chown mysql:mysql /opt/mysql-5.7/data
chmod 755 /opt/mysql-5.7/data
/opt/mysql-5.7/bin/mysqld --initialize --user=mysql --basedir=/opt/mysql-5.7 --character-set-server=utf8mb4

В конце выполнения последней команды вы должны получить root-пароль в следующем соообщении:

[Note] A temporary password is generated for root@localhost: !fpjJ,G+k7G&

Запомните или запишите его. Если установка MySQL выполняется для рабочего окружения, то можно обойтись без пароля для root. Для этого последнюю команду нужно немного изменить:

/opt/mysql-5.7/bin/mysqld --initialize-insecure --user=mysql --basedir=/opt/mysql-5.7 --character-set-server=utf8mb4

Теперь у root будет пустой пароль.

Служба MySQL и my.cnf

У MySQL уже готова служба для запуска и управления их сервером. Просто скопируем её и включим:

cp /opt/mysql-5.7/support-files/mysql.server /etc/init.d/mysql-5.7
chmod +x /etc/init.d/mysql-5.7
systemctl enable mysql-5.7

А вот my.cnf, к сожалению, отсутствует, поэтому файл конфигурации придется создавать самим. Я указал минимально необходимые параметры MySQL, чтобы была верная кодировка (UTF-8), можно было подключаться к серверу MySQL через внешний клиент баз данных и путь до сокета. Остальное все указано по умолчанию самой MySQL, включая пользователя из под которого будет запущен сервер баз данных.

mkdir /etc/mysql
cat <<EOF > /etc/mysql/my.cnf
[client]
default-character-set = utf8mb4
socket = /tmp/mysql-5.7.sock

[mysqld]
basedir = /opt/mysql-5.7
bind-address = 0.0.0.0
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
socket = /tmp/mysql-5.7.sock
server-id = 1
EOF

MySQL по умолчанию попытается достать параметры из конфигурационного файла с путями /etc/mysql/my.cnf, /etc/my.cnf, ~/.my.cnf и т.д. Если до этого у вас была установлена другая версия MySQL, то дополнительно убедитесь, что MySQL запускается с нужными параметрами из нужного my.cnf.

Запуск

Запустим наш сервер MySQL:

systemctl start mysql-5.7

Убедимся, что все запущено как надо:

systemctl status mysql-5.7 | less

Вы должны увидеть примерно следующее:

CGroup: /system.slice/mysql-5.7.service
├─5735 /bin/sh /opt/mysql-5.7/bin/mysqld_safe --datadir=/opt/mysql-5.7/data --pid-file=/opt/mysql-5.7/data/buster.pid
└─5896 /opt/mysql-5.7/bin/mysqld --basedir=/opt/mysql-5.7 --datadir=/opt/mysql-5.7/data --plugin-dir=/opt/mysql-5.7/lib/plugin --user=mysql --log-error=buster.err --pid-file=/opt/mysql-5.7/data/buster.pid --socket=/tmp/mysql-5.7.sock

Обязательно проверяем аргументы --user=mysql, --basedir=/opt/mysql-5.7, --datadir=/opt/mysql-5.7/data и --socket=/tmp/mysql-5.7.sock. Если все так, то MySQL успешно прочитала наш /etc/mysql/my.cnf.

Пользователя для запуска демона MySQL (mysqld) мы не указывали, но видим, что он равен mysql. Так и должно быть. Это значение по умолчанию при запуске демона через mysqld_safe.

Теперь подключимся к MySQL через встроенную утилиту:

mysql-5.7 -uroot -p

При запросе пароля - вводим ранее выданный на этапе инициализации временный пароль от root. Если инициализация data-директории была с пустым root-паролем, то просто жмем Enter.

Если у вас есть пароль от root, то его потребуется сменить перед исполнением любого выражения. Это требование MySQL. Если его не поменять, то вы получите сообщение "ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement" и ничего не сможете сделать, пока не выполните это требование.

ALTER USER USER() IDENTIFIED BY 'my_new_password';

После этого можем убедиться, что все установили и настроили правильно:

STATUS;

В случае успеха в выводе напротив Server characterset, Db characterset, Client characterset, Conn. characterset должно быть utf8mb4, а напротив UNIX socket - /tmp/mysql-5.7.sock:

Также убедимся, что все внутрение базы данных созданы с верной кодировкой:

SHOW CREATE DATABASE `mysql`;

Вы должны увидеть DEFAULT CHARACTER SET utf8mb4.

Можно проверить и остальные базы данных, но обычно, в случае неверной инициализации data-директории, неверная кодировка только у базы данных mysql.

Для уверенности проверим переменные кодировки:

mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database   | utf8mb4 |
| character_set_filesystem | binary  |
| character_set_results    | utf8mb4 |
| character_set_server     | utf8mb4 |
| character_set_system     | utf8    |
+--------------------------+---------+
7 rows in set (0.00 sec)

И переменные для работы со строками:

mysql> SHOW VARIABLES LIKE 'collation\_%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_general_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

Если все сходится, то можете себя поздравить с завершением установки MySQL 5.7 из generic.