Ela's Notes
So Be It


Hitokoto ·
[BUG小记]记一次MySQL本地访问异常的问题和修复方法
Elatis   后端, BUG小记   186 | 文章字数: 4037 字

服务器迁移的时候,我在新服务器上安装了mysql,在迁移博客的时候出现了奇怪的问题,好在最后解决了,下面记录一下历程和最终解决方案.
虽然问题最终解决了,但是我还是不太理解问题的成因,百度谷歌了一番也无果(甚至没人和我问题一样),如果有知道成因的dalao欢迎指点QAQ

MySQL的安装方法

我是通过命令行直接安装的:

apt-get install mysql-server

设置权限的方法

grant all privileges on *.* to root@'localhost' identified by '我的密码' with grant option;
grant all privileges on *.* to root@'%' identified by '我的密码' with grant option;

在许多服务器上我都用这条命令设置权限,但唯独在这台服务器上出现了问题.

问题发现

迁移博客,导入数据库,这部分都没有问题.但当我打开迁移完毕的博客,却出现了这样的问题:

SQLSTATE[HY000] [1698] Access denied for user 'root'@'localhost'

原话如此,后面并没有(using password: NO|YES)

进入mysql,查看用户表

mysql -uroot -p mysql
mysql> select host, user from user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| %         | root             |
| localhost | debian-sys-maint |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+

再看密码:

mysql> select host, user, authentication_string from user;
+-----------+------------------+-------------------------------------------+
| host      | user             | authentication_string                     |
+-----------+------------------+-------------------------------------------+
| localhost | root             | 代表我密码的字符串                         |
| localhost | mysql.session    | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | mysql.sys        | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| localhost | debian-sys-maint | 随机的初始密码                             |
| %         | root             | 代表我密码的字符串                         |
+-----------+------------------+-------------------------------------------+

密码加密后的字符串确实是那样的,也就是说我之前设置权限的命令并没有敲错.

第二个问题

在之后的尝试中,我又发现了一个问题:我直接输入mysql也可以进入mysql命令行,输入mysql -uroot -p之后,无论输入什么密码都可以进入mysql命令行,但是用户换成别的就不行.

第三个问题

我通过注释mysql配置里的bind 127.0.0.1开启了远程访问,在我的计算机上是可以连接并操作服务器上的mysql的.我通过ssh到服务器上用命令行也是可以连接的,只有在服务器上使用代码连接它自己的mysql会出现问题.

初步解决办法

在mysql配置中添加:skip-grant-tables即可解决上述问题.
但这样实际上只是掩耳盗铃,不仅没有解决问题的根本,反而导致远程连接不需要密码即可登录了.

最终解决方法

进一步思考

我最先想到的是有没有匿名用户,但上面的查询结果表明是没有的.
其次我想到的是权限有没有设置正确,我仔细重新敲了设置权限的命令,但没有用.
而且我计算机可以远程连接,说明root@%的权限设置是正确的,有问题的是root@localhost

最终解决

于是我手动检查了root@localhost的权限

mysql> show grants for root@localhost;
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+

对比一下root@%的权限

mysql> show grants for root;
+-------------------------------------------------------------+
| Grants for root@%                                           |
+-------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION |
+-------------------------------------------------------------+

我感觉这就是问题所在了,于是我干脆彻底删除root@localhost再重新给它设置权限

mysql> drop user root@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> select * from proxies_priv;
Empty set (0.01 sec)

mysql> show grants for root@localhost;
ERROR 1141 (42000): There is no such grant defined for user 'root' on host 'localhost'
mysql> grant all privileges on *.* to root@'localhost' identified by '2949501' with grant option;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

然后发现问题解决了

最后

看起来最终问题是那行GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION有问题,不过由于我最终解决方法过于粗暴,真实问题原因有可能是别的.
如果原因真的像上述那样,我实在不明白为何额外给它所有权限也不行.(除非它的工作原理是从新到旧覆盖权限,但这样实在是...
网上选出的几种办法都没能解决我的问题,我都一一尝试过了,但懒得写了,就把连接贴在下面吧.
https://blog.csdn.net/lhl1124281072/article/details/80277163

评论

发送失败 可能是您的发言太频繁或联系方式有误

提交评论

Theme LightWhite Made by Archeb With
自豪地使用Typecho
© 2017 - 2020 elatis.cn 版权所有 ICP证: 冀ICP备18008017号-1
全站共 19.11 W 字
博客已经运行了