Назад | Перейти на главную страницу

Поймайте 22 при переходе от старых паролей и mysql_upgrade

У меня есть старая база данных MySQL, которую я держал очень долгое время, вероятно, около 14 лет.
Видимо, я пропустил запуск на нем mysql_upgrade длинный назад, возможно, при обновлении с 4.x до 5.x (и с тех пор).
Теперь, после вчерашнего обновления до 5.6.22 (с 5.5.x), я больше не могу войти в систему и, похоже, не могу решить проблему.
Судя по всему, хэши паролей старого стиля устарели более 10 лет, но я никогда не видел никаких предупреждений об этом, пока они не перестали работать только сейчас.

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

mysqldump: Got error: 2049: Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled) when trying to connect

Я получаю ту же ошибку, используя mysql -u root -p.
Я преодолел это, используя --skip-secure-auth параметр для команды mysql. После этого, в документации сказано, что вам следует обновить свой пароль:

SET old_passwords = 0;
UPDATE mysql.user SET plugin = 'mysql_native_password',
Password = PASSWORD('DBA-chosen-password')
WHERE (User, Host) = ('user1', 'localhost');
FLUSH PRIVILEGES;

Это не удается:

ERROR 1054 (42S22): Unknown column 'plugin' in 'field list'

Решение который ошибка, похоже, для запуска mysql_upgrade, который обновляет таблицу mysql.user, добавляя столбец плагина. Тем не мение, это тоже не удается, с этой замечательной ошибкой:

# mysql_upgrade -u root -p
Enter password: 
Looking for 'mysql' as: mysql
Looking for 'mysqlcheck' as: mysqlcheck
FATAL ERROR: Upgrade failed

Я предполагаю, что это потому, что нет --skip-secure-auth возможность mysql_upgrade, поэтому он не может войти в систему.
Я пытался отключить безопасную аутентификацию для сервера, но, если я сделал это правильно, это не помогло. (Возможно, потому что mysql_upgrade, поставляемый с 5.6.x, использует его по умолчанию и не позволяет вам его отключить?)

У кого-нибудь есть решение этого? Я не против таких вещей, как временное отключение паролей и т. Д. При решении этой проблемы; сервер доступен только с localhost, и я единственный локальный пользователь.

Тема, на которую Ян ссылается в комментариях, решила проблему.

Выполнив эти инструкции, я перезапустил сервер и попытался войти в систему как обычно (без --skip-secure-auth), который работал.
Я тогда побежал mysql_upgrade -u root -p, что тоже сработало. После этого и перезапуска mysqld все работает как надо, и у моего пользователя root есть «новый» пароль (длинный хэш из 41 символа, а не из 16).

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