centos虚拟机下的mysql登录时出现Access denied for user 'root'@'localhost' (using password: YES) 及外部拒绝访问的解决方法
先说下我的情况,我用的mysql是docker部署的。然后在使用过程遇到两个问题。
1.外部拒绝访问,就是想Navicat或者sqlyog的外部软件访问报错。
2.在linux下的mysql命令行登录也出现权限问题。
第一个问题的解决方法挺简单的,就是授予权限。但是授予权限是要在mysql命令行下执行的,然后就因为第二个问题,mysql登录不进去,给卡死了。下面说下解决方法。
1.MySQL登录出现权限拒绝问题
解决方法就是重置密码。。没错,没有什么方法比‘重启‘更管用。步骤如下:
1.跳过认证启动
首先进入到容器中。
mysql是我的数据库名称。命令的意思是:
然后编辑mysql配置文件,使用vi终端编辑器
vi /etc/mysql/conf.d/docker.cnf
在docker.cnf文件下新增skip-grant-tables
然后保存退出。这样下次登录mysql就不用密码了。然后重新启动容器。
docker restart mysql
这一步要说下vi终端编辑器的工作模式。
编辑模式:按”i“进入,按esc退出编辑模式进入命令模式
命令模式:就是最开始的状态
末行模式:在命令模式下按“:”进入,末行模式输入wq就是保存退出(w是write,q是quit)。q!是强制退出
2.重新设置密码
同第一样在进入mysql容器后,直接输入mysql就登录成功。
接着重新设置密码。
#使用mysql自带的mysql数据库。
use mysql;
#更改user表下的密码。
UPDATE user SET authentication_string = password ( 'a123456' ) WHERE User = 'root';
#刷新权限
flush privileges;
#退出
quit;
注意!!!这里有个坑,user表的密码的属性名是authentication_string
3.删除第一步的跳过认证启动
重新进入docker容器。在docker.cnf文件下删掉skip-grant-tables
4.重启mysql容器
再次重新启动后,就可以登录mysql。
2.外部拒绝访问问题解决
在mysql命令行下输入:
mysql> GRANT ALL PRIVILEGES ON *.* TO '用户名'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;
Query OK, 0 rows affected (0.02 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
这里用户名和密码都是你自己的。另外说一下grant命令的解释:
grant 权限1,权限2, ... 权限n on 数据库名称.表名称 to 用户名@用户地址 identified by '连接口令';
权限1,权限2,... 权限n 代表 select、insert、update、delete、create、drop、index、alter、grant、references、reload、shutdown、process、file 等14个权限。
当权限1,权限2,... 权限n 被 all privileges 或者 all 代替时,表示赋予用户全部权限。
当 数据库名称.表名称 被 . 代替时,表示赋予用户操作服务器上所有数据库所有表的权限。
用户地址可以是localhost,也可以是IP地址、机器名和域名。也可以用 '%' 表示从任何地址连接。
'连接口令' 不能为空,否则创建失败。
参考资料