centos虚拟机下的mysql登录时出现Access denied for user 'root'@'localhost' (using password: YES) 及外部拒绝访问的解决方法

先说下我的情况,我用的mysql是docker部署的。然后在使用过程遇到两个问题。

1.外部拒绝访问,就是想Navicat或者sqlyog的外部软件访问报错。

2.在linux下的mysql命令行登录也出现权限问题。

虚拟机starting mysql 虚拟机怎么开启mysql_mysql

第一个问题的解决方法挺简单的,就是授予权限。但是授予权限是要在mysql命令行下执行的,然后就因为第二个问题,mysql登录不进去,给卡死了。下面说下解决方法。

1.MySQL登录出现权限拒绝问题

解决方法就是重置密码。。没错,没有什么方法比‘重启‘更管用。步骤如下:

1.跳过认证启动

首先进入到容器中。

虚拟机starting mysql 虚拟机怎么开启mysql_虚拟机starting mysql_02

mysql是我的数据库名称。命令的意思是:

虚拟机starting mysql 虚拟机怎么开启mysql_虚拟机starting mysql_03

然后编辑mysql配置文件,使用vi终端编辑器

vi /etc/mysql/conf.d/docker.cnf

在docker.cnf文件下新增skip-grant-tables

虚拟机starting mysql 虚拟机怎么开启mysql_docker_04

然后保存退出。这样下次登录mysql就不用密码了。然后重新启动容器。

docker restart mysql

这一步要说下vi终端编辑器的工作模式。

编辑模式:按”i“进入,按esc退出编辑模式进入命令模式

命令模式:就是最开始的状态

末行模式:在命令模式下按“:”进入,末行模式输入wq就是保存退出(w是write,q是quit)。q!是强制退出

2.重新设置密码

同第一样在进入mysql容器后,直接输入mysql就登录成功。

虚拟机starting mysql 虚拟机怎么开启mysql_虚拟机starting mysql_05

接着重新设置密码。

#使用mysql自带的mysql数据库。

use mysql;

#更改user表下的密码。

UPDATE user SET authentication_string = password ( 'a123456' ) WHERE User = 'root';

#刷新权限

flush privileges;

#退出

quit;

虚拟机starting mysql 虚拟机怎么开启mysql_解决方法_06

虚拟机starting mysql 虚拟机怎么开启mysql_虚拟机开启mysql密码报错_07

注意!!!这里有个坑,user表的密码的属性名是authentication_string

3.删除第一步的跳过认证启动

重新进入docker容器。在docker.cnf文件下删掉skip-grant-tables

4.重启mysql容器

再次重新启动后,就可以登录mysql。

虚拟机starting mysql 虚拟机怎么开启mysql_docker_08

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地址、机器名和域名。也可以用 '%' 表示从任何地址连接。