Данный способ практически нигде не рассматривается и не упоминается. Обычно можно встретить вариант установки через репозиторий, и это считается предпочтительным способом. Я же считаю иначе и предпочитаю установку из 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.