mysql Access denied for user 'root'@'localhost'问题解决
问题描述:
系统安装mysql的过程中,没有提示配置用户名和密码相关的信息,安装完毕后,登录报错。
表现现象为:
mysql -u root -p
[输入root密码]
界面提示:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
问题解决过程:
1. 首先尝试了通过绕开数据库权限校验的流程,直接进入数据库后再重新配置用户名和密码
sudo /etc/init.d/mysql stop
sudo mysqld_safe --skip-grant-tables
mysql -u root 尝试登录,
没有作用,还是会提示无权限访问数据库
2. 绕开权限校验行不通,原因无法定位,进一步想通过重新安装数据库的方法解决,
主要是怀疑上次安装中有部分系统原来自带的用户残留信息或配置导致目前的问题,所以重装前,先卸载和清除原有安装。
sudo apt-get remove mysql-*
dpkg –l | grep ^rc | awk ‘{print $2}’ | xargs dpkg –P
sudo apt-get install mysql-client mysql-server
安装过程中发现,还是没有提示配置用户或者登录密码信息,“不详的预感”……
果然,登录发现还是不行,再次提示Access denied 。
3. 用“mysql安装不提示配置密码”去检索类似问题,发现另一个方法,找到了mysql的默认登录信息。
/etc/mysql/debian.cnf中,使用黄色框中的登录信息即可登录。
4. 登录mysql后,分析存储登录信息的user表,分析下为何root之前登录失败。
use mysql
show tables;
select host,user,authentication_string,plugin from user;
不难看出,root这个用户的密码串为空,校验plugin方式为“auth_socket”,查阅mysql官方文档(https://dev.mysql.com/doc/refman/5.7/en/socket-pluggable-authentication.html#socket-pluggable-authentication-usage),
对 auth_socket 校验方式的说明如下:
auth_socket方式下,client端通过socket方式访问mysql,server端通过socket file的方式校验,对client端的username进行校验即可,也就是说,这种方式不是本地密码登录使用的。
因此,将该方式修改为“mysql_native_password”,并配置root的登录密码,即可使用root用户本地密码的方式进行mysql访问。