我有一个古老的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文档中的描述迁移其他用户,这些用户可以确定哪些密码需要更新,以及如何做到这一点。