关于从旧式密码和 mysql_upgrade 迁移的 22 个问题

关于从旧式密码和 mysql_upgrade 迁移的 22 个问题

我有一个古老的 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
我通过使用 mysql 命令的选项解决了该问题--skip-secure-auth。之后,文档说你应该更新你的密码

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,所以无法登录。
我尝试禁用服务器的安全身份验证,但如果我操作正确,它也没有帮助。(可能是因为 5.6.x 附带的 mysql_upgrade 默认使用它并且不允许您禁用它?)

有人有办法解决这个问题吗?在解决这个问题时,我不会采取暂时禁用密码等措施;服务器只能从本地主机访问,而我是唯一的本地用户。

答案1

Iain 在评论中链接的帖子解决了这个问题。

按照这些说明操作后,我重新启动了服务器并尝试照常登录(不使用--skip-secure-auth),成功了。
然后我运行了mysql_upgrade -u root -p,也成功了。之后,mysqld 重新启动,一切似乎都正常工作,我的 root 用户有一个“新”密码(41 个字符长的哈希,而不是 16 个字符)。

修复 root 用户后,您应该能够按照以下说明迁移其他用户MySQL 文档其中列出了确定需要更新密码的步骤以及如何执行更新操作。

相关内容