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