报错信息:
#mysql版本8.0
E:\developsoftware\mysql-8.0.13-winx64\bin>mysql -uroot -p
Enter password: ******
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
E:\developsoftware\mysql-8.0.13-winx64\bin>mysql -uroot
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
报错原因:
1)安装mysql8.0使用如下命令初始化,代表可免密登录mysql。而作者在mysql安装过程中又设置了密码,导致安装结束不管键入密码与否都会报以上错误。
#提示:cmd窗口必须以管理员的身份启动
E:\developsoftware\mysql-8.0.13-winx64\bin>mysqld --initialize-insecure
2)若非1)中情况也出现类似的错误,需要查看mysql的.err文件(搜索“password”)定位错误 ,该文件在设置的mysql数据存储目录下面,作者文件位置在E:\developsoftware\data\mysqldata(自定义路径,需根据实际路径选择),该路径有一个ZB-PF0S9306.err的错误文件。以下是.err文件下的详细报错信息。
[Warning] [MY-010453] [Server] root@localhost is created with an empty password !
Please consider switching off the --initialize-insecure option.
解决方法:
1)在初始化的时候使用下面命令,设置默认初始密码,适用于重新安装的情况。
#该命令会在安装mysql的时候给定一个随机默认密码
E:\developsoftware\mysql-8.0.13-winx64\bin>mysqld --initialize
2)将密码设置为空(即不设置密码),采用无密码登录方式登录mysql。
该方法适用于已经安装结束,不想再卸载重新安装的情况。
#停止mysql服务
C:\windows\system32>e:
E:\>cd developsoftware\mysql-8.0.13-winx64\bin
E:\developsoftware\mysql-8.0.13-winx64\bin>net stop mysql
MySQL 服务正在停止.
MySQL 服务已成功停止。
#跳过权限验证
E:\developsoftware\mysql-8.0.13-winx64\bin>mysqld --console --skip-grant-tables --shared-memory
2018-12-04T10:47:24.833692Z 0 [System] [MY-010116] [Server] E:\developsoftware\mysql-8.0.13-winx64\bin\mysqld.exe (mysqld 8.0.13) starting as process 11548
....
2018-12-04T10:47:33.317040Z 0 [Warning] [MY-011311] [Server] Plugin mysqlx reported: 'All I/O interfaces are disabled, X Protocol won't be accessible'
#重新以管理员身份打开一个cmd窗口,在安全模式下启动mysql服务,登录mysql
E:\developsoftware\mysql-8.0.13-winx64\bin>mysql.exe -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.13 MySQL Community Server - GPL
...
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
成功登入mysql后,将密码设置为“无”(注意:无不是空格!!!),设置完毕后就可以无密码登录mysql服务了。
mysql> use mysql
Database changed
//看好下面是'',而不是' ',区别是第一个就是没有空格(重要),第二个中间有一个空格就会出问题
mysql> update user set authentication_string='' where user='root';
Query OK, 1 row affected (0.39 sec)
mysql> flush privileges
Query OK, 0 rows affected (0.10 sec)