Проблемы запуска MySQL 8.0 на FreeBSD

Материал из Lblss.ru
Перейти к: навигация, поиск

Немного подождав после пилотного релиза, таки сподобился на установку новой версии.

Содержание

Установка

Первое, с чем пришлось столкнуться по состоянию на новогодние праздники, это релиз 8.0.12 в портах. Релиз имеет кучу уязвимостей и не рекомендован к установке (исправления, если верить багтрекеру, в 8.0.13). Потому в начале установки пришлось сказать:

# export DISABLE_VULNERABILITIES=yes

Установка прошла нормально.

Подготовка к запуску

Установка была "чистая" - все нужные пользователи, привилегии и базы заблаговременно забэкаплены, а каталог датадир очищен.

Конфиг /usr/local/etc/my.cnf изменил свое расположение, он переместился в /usr/local/etc/mysql/my.cnf по дефолту. Из конфига пришлось убрать директивы управления кешем (8.0 их не поддерживает). Так как клиенты пока не поддерживают аутентификацию новым методом caching_sha2_password, в конфиг добавлена строчка, активирующая старый метод:

[mysqld]
default-authentication-plugin = mysql_native_password

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

Первоначальный запуск

При первом запуске штатным стартовым скриптом выскочила ошибка такого вида:

/usr/local/etc/rc.d/mysql-server: WARNING: failed precmd routine for mysql

Анализ ситуации показал, что, в частности, служебная база mysql не создается в полном объеме. Решение довольно простое - ручной запуск команды инициализации на пустой директории датадир:

# rm -rf /var/db/mysql/*
# /usr/local/libexec/mysqld --initialize-insecure --user=mysql

В результате в директории /var/db/mysql/mysql появились файлы таблиц mysql, которых не оказалось при штатном запуске. В таблице пользователей создана учетная запись root@localhost без пароля.

После этого можно стартовать сервер стандартным образом:

# service mysql-server start

Импорт бэкапов

С импортом баз проблем не возникло.

С пользователями пришлось немного повозиться и найти их оригинальные пароли. Дело в том, что CREATE USER и GRANT теперь строго разделены (ранее запрос GRANT так же и создавал пользователя), синтаксис вида IDENTIFIED BY PASSWORD '*03E2854B1BC2353C7FED1F780C55F7845322DC57' тоже не поддерживается, а синтаксис вида IDENTIFIED WITH mysql_native_password BY 'new_password1' , о котором сказано в мануале, требует реальный пароль. Соответственно, скрипт создания пользователей, полученный при помощи SHOW GRANTS на сервере предыдущей версии (5.6) пришлось значительно переделать.

PHP 5.6 не коннектится к MySQL 8.0

Притом, из PHP 7.0 и выше подключение успешно.

При попытке подключения из PHP 5.6 получаем ошибку:

Warning: PDO::__construct(): Server sent charset (255) unknown to the client.

Или так, если смотреть ексепшн:

SQLSTATE[HY000] [2054] Server sent charset unknown to the client.

Ох уж эти пляски с чарсетами и их алиасами! Теперь сервер по дефолту желает общаться на utf8mb4, которую старый клиент не понимает.

Лечится настройкой сервера. Правки в my.cnf следующие:

[client]
default-character-set=utf8
 
[mysql]
default-character-set=utf8
 
[mysqld]
collation-server = utf8_unicode_ci
character-set-server = utf8

Впрочем, можно и классическую latin1 установить.

Разумеется, после правки конфига требуется перезапуск сервера.

Персональные инструменты