普通用户Shell无法登录MySQL root的问题排查咨询
问题与解决方案
问题现象
- 普通系统用户执行
mysql -u root -p输入密码后报错:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
- 切换到系统root用户后执行相同命令可成功登录MySQL
- 查询
mysql.user表发现MySQL root用户的plugin字段为auth_socket
原因分析
auth_socket是Ubuntu/Debian系系统默认给MySQL root配置的认证插件,它不验证密码,仅检查当前登录的系统用户是否与MySQL用户名一致。因此只有系统root用户能直接用MySQL root登录,普通系统用户即便知道密码也无法通过密码认证登录。
配置建议
1. 修改MySQL root的认证方式为密码认证
先切换到系统root用户,登录MySQL:
sudo su - root mysql -u root -p
执行以下SQL语句修改认证插件并重置密码(替换your_new_password为自定义密码):
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'your_new_password'; FLUSH PRIVILEGES;
注:MySQL 8.0+推荐使用
caching_sha2_password,若需兼容旧客户端,可改用mysql_native_password
完成后退出MySQL,普通系统用户即可通过mysql -u root -p输入密码登录。
2. 配置远程连接支持
方式一:修改root用户允许远程访问(不推荐,安全性低)
在MySQL中执行:
ALTER USER 'root'@'localhost' RENAME TO 'root'@'%'; FLUSH PRIVILEGES;
%表示允许从任意IP访问,也可指定特定IP地址。
方式二:创建专门的远程访问用户(推荐)
在MySQL中执行:
CREATE USER 'remote_user'@'%' IDENTIFIED WITH caching_sha2_password BY 'remote_password'; GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
替换remote_user和remote_password为自定义的用户名与密码。
修改MySQL绑定地址
编辑MySQL配置文件(通常路径为/etc/mysql/mysql.conf.d/mysqld.cnf):
找到bind-address行,修改为:
bind-address = 0.0.0.0
注:若仅允许特定IP访问,可替换为对应IP地址
保存后重启MySQL服务:
systemctl restart mysql
开放防火墙端口(若启用防火墙)
Ubuntu默认使用ufw,执行以下命令开放3306端口:
ufw allow 3306/tcp
内容的提问来源于stack exchange,提问作者OmPS
相关产品推荐
相关产品推荐

