错误信息
ERROR 1045 (28000): Access denied for user 'xxx'@'xxx' (using password: YES)
错误复现
客户端连接服务器时,报错提示权限错误。
$ mysql -uroot -pxxx
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
原因分析
- 【1】用户名或者密码不正确
- 【2】密码正确,但是当前用户没有权限,服务端拒绝了连接。
解决方法
1. 重置超管密码
适用于忘记root密码时,连不上数据库的情况。
停止服务 -> 跳过权限表 -> 重置超管密码 -> 恢复权限表
1.1 停止当前的MySQL服务
systemctl stop mysql
1.2 在配置文件中的 mysqld 一节,最后一行添加 skip-grant-tables ,跳过权限表
vi /etc/my.cnf
[mysqld]
...
skip-grant-tables
1.3 启动MySQL
systemctl start mysql
1.4 以超管用户登录,然后修改超管密码。
不用输入密码, 直接可以用root用户登录,此时已经跳过权限控制。
mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
...
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
查看当前登录用户,是一个‘空’用户
mysql> select current_user;
+--------------+
| current_user |
+--------------+
| @ |
+--------------+
1 row in set (0.03 sec)
重置root密码,将密码重置成mysql
mysql> update mysql.user set authentication_string=password('mysql') where user = 'root' and host = 'localhost';
Query OK, 1 row affected (0.13 sec)
Rows matched: 1 Changed: 1 Warnings: 0
1.5 恢复权限表并验证
删除配置文件中的 skip-grant-tables 放开权限控制
sed -i '/skip-grant-tables/d' /etc/my.cnf
重启MySQL服务
systemctl restart mysql
验证权限表是否恢复
$ mysql -uroot
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
验证超管密码能否正常登录
$ mysql -hlocalhost -uroot -pmysql
Warning: Using a password on the command line interface can be insecure.
...
mysql>