捕捉从旧式密码和mysql_upgrade 22

我有一个古老的MySQL数据库,我已经运行了很长时间,大概14年。
显然,我错过了很久以前运行mysql_upgrade,也许在从4.x升级到5.x(从那以后)。
现在,在昨天升级到5.6.22(从5.5.x开始)之后,我不能再login了,我似乎也无法解决这个问题。
显然,旧式的密码哈希已经被弃用了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' 

该错误的解决scheme似乎是运行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 

我的猜测是,这是因为mysql_upgrade没有--skip-secure-auth选项,所以无法login。
我试图禁用服务器的安全validation,但如果我做得正确,它没有帮助。 (可能是因为5.6.x附带的mysql_upgrade默认使用它,并且不允许你禁用它?)

有没有人有这个解决scheme? 我不是在解决这个问题时暂时禁用密码等等。 服务器只能从本地主机访问,而我是唯一的本地用户。

Iain链接到评论的线程解决了这个问题。

按照这些说明之后,我重新启动服务器,并尝试像往常一样login(没有--skip-secure-auth ),它工作。
然后我运行mysql_upgrade -u root -p ,这也起作用。 之后,一个mysqld重启,一切似乎工作,因为它应该和我的root用户有一个“新”密码(41个字符长的散列,而不是16)。

在修复root用户的情况下,您应该能够按照MySQL文档中的描述迁移其他用户,这些用户可以确定哪些密码需要更新,以及如何做到这一点。