MYSQL——ERROR1698(28000):Access denied for user root@localhost
安装环境:
Ubuntu18.04+Mysql5.7。通过以下命令进行了安装:
sudo apt install mysql-server-5.7
结果在安装完成后通过root用户登录时报了上面的问题,其实就是因为安装过程中也没有设置过root用户的登录密码。
解决方法:
1、修改mysqld.cnf配置文件
找到并打开mysqld.cnf,然后在该配置文件中的[mysqld]标签下最后一行加入skip-grant-tables:
sudo gedit /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
#
# * Basic Settings
#
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
character-set-server=utf8
collation-server=utf8_general_ci
skip-grant-tables <-- add here
添加了这句话以后,我们就可以不用密码登录就能进入mysql了,在修改保存之后,重启mysql服务:
service mysql restart
2、设置root密码
在步骤1后,在终端上输入mysql -u -root -p
,提示输入密码时直接回车即可,此时发现你已经进入到mysql了,而后输入以下命令:
use mysql; #然后敲回车
update user set authentication_string=password("你的密码") where user="root"; #然后敲回车
flush privileges; #然后敲回车
结果如上图,最后输入`quit;`,退出mysql。
3、注释掉skip-grant-tables
重新编辑mysqld.cnf
,将步骤1中添加的skip-grant-tables
语句注释掉。
[mysqld]
#
# * Basic Settings
#
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
character-set-server=utf8
collation-server=utf8_general_ci
# skip-grant-tables <-- add # here
再返回终端重启mysql服务,而后输入mysql -u root -p,密码输入步骤2中设置的密码,回车后应该就可以进入数据库了,如果不行,转到步骤4。
4、可能遇到的问题
发现在经过步骤3之后,还是会报之前的错误,此时参照步骤3,将注释的那条语句取消注释(删除’#'号),重启mysql后重新进入mysql。而后选择数据库mysql use mysql;
,然后输入select user,plugin from user;
如下图所示:
从图中可以看到在执行了select user, plugin from user;
后,错误原因是因为plugin root的字段是auth_socket,那我们改掉它,替换为mysql_native_password就行了。输入:
update user set authentication_string=password("你的密码"),plugin='mysql_native_password' where user='root';
然后回车执行,再输入select user,plugin from user;
回车运行,发现root用户的字段改成功了。
MYSQL默认是区分大小写的,若想取消掉,可以按照上述方法找到并打开mysqld.cnf,然后在该配置文件中的[mysqld]标签下最后一行加入`lower_case_table_names = 1`