Mysql出现Access denied for user root@localhost的解决办法
所有操作默认非root用户,本文中用 lz
用户。
安装Mysql后打开时报错:
$ sudo apt-get install mysql-server
$ service mysql start
$ mysql -u root -p
Enter password: # 无论输入什么密码
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
root用户被随机设置了一个密码,但是这个密码无从得知,因而无法进入,解决办法:
$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
在该配置文件中的[mysqld]块中加入一行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
skip-grant-tables
该语句作用为免密码登录Mysql。
重启Mysql服务:
$ service mysql restart
进入Mysql:
$ mysql -u root -p
Enter password: # 直接回车
mysql> use mysql;
mysql> update user set authentication_string=password("新密码") where user="root";
mysql> flush privileges;
mysql> quit;
回到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
# skip-grant-tables
重启Mysql服务:
$ service mysql restart
再返回终端输入$ mysql -u root -p
,应该就可以进入数据库了。
若依然报错:
$ mysql -u root -p
Enter password: # 输入密码
ERROR 1524 (HY000): Plugin 'auth_socket' is not loaded
则需要返回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
skip-grant-tables
重启Mysql服务:
$ service mysql restart
重新免密进入Mysql:
$ mysql -u root -p
Enter password: # 直接回车
进入mysql数据库,查看user表的user
,plugin
:
mysql> use mysql;
mysql> select user,plugin from user;
应该显示如下结果:
+------------------+-----------------------+
| user | plugin |
+------------------+-----------------------+
| root | auth_socket |
| mysql.session | mysql_native_password |
| mysql.sys | mysql_native_password |
| debian-sys-maint | mysql_native_password |
+------------------+-----------------------+
4 rows in set (0.00 sec)
错误原因为plugin root
的字段是auth_socket
,改掉它为下面的mysql_native_password
即可:
mysql> update user set authentication_string=password("新密码"),plugin='mysql_native_password' where user='root';
此时再查看user表的user
,plugin
应该为:
+------------------+-----------------------+
| user | plugin |
+------------------+-----------------------+
| root | mysql_native_password |
| mysql.session | mysql_native_password |
| mysql.sys | mysql_native_password |
| debian-sys-maint | mysql_native_password |
+------------------+-----------------------+
4 rows in set (0.01 sec)
最后再把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
# skip-grant-tables
重启Mysql服务:
$ service mysql restart
这次使用 $ mysql -u root -p
应该可以正常输入密码登陆了:
$ mysql -u root -p
Enter password: # 输入密码
Welcome to the MySQL monitor. Commands end with ; or \g.
...
mysql >