正如你看到的,因为Jessica的记录的主机名最不具体,它的优先级最低。当Jessica试图从www.host.net连接时,MySQL服务将他的连接匹配为一个匿名用户记录(空白的User值与任何人匹配)。因为这些匿名记录不需要口令,而也许Jessica输入了他的口令,MySQL将拒绝这个连接。即使Jessica没有输入口令,他可能也只被给予了匿名用户的权限(非常有限),而不是他原来被赋予的权限。
解决这个问题的方法是,要么你删除匿名用户的记录(DELETE FROM user WHERE User=""),要么再为所有的可能从localhost连接的用户指定两条记录(例如,相对于localhost以及相对于服务器的实际主机名):
这里<pid>是MySQL服务的进程的ID。这样将可以终止服务。除非绝对必要,不要使用kill -9,因为这样有可能损坏你的表文件。如果你被迫只能这么做,下面将告诉你如何检查和修复那些文件。
关闭了服务之后,你可以通过运行带--skip-grant-tables命令行选项的safe-mysqld (在Windows下使用mysqld或mysqld-nt)命令重启它。这将指示MySQL服务允许自由的访问,明显的,我们应该尽可能地短时间的使用这种模式运行服务,以避免固有的安全风险。
连接成功后,改变你的root口令:
mysql> USE mysql;
mysql> UPDATE user SET Password=PASSWORD("newpassword")
-> WHERE User="root";