MySQL 认证机制学习笔记
一、认证插件基本概念
- MySQL 使用认证插件决定用户登录验证方式
- 常见插件类型:
auth_socket
(unix_socket)
mysql_native_password
caching_sha2_password
(MySQL 8.0+)
二、auth_socket 插件
特点
- 使用系统用户权限认证
- 无需密码
- 仅限本地访问
- Ubuntu/Debian 系统默认
检查方法
1
| SELECT user, plugin FROM mysql.user WHERE user = 'root';
|
输出含 auth_socket
或 unix_socket
即使用该方式
登录方式
三、mysql_native_password 插件
特点
设置方法
1 2
| ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码'; FLUSH PRIVILEGES;
|
登录方式
四、caching_sha2_password 插件
特点
- MySQL 8.0+ 默认
- SHA-256 加密
- 安全性更高
- 部分旧客户端不兼容
设置方法
1 2
| ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '密码'; FLUSH PRIVILEGES;
|
五、认证方式切换
切换到密码认证
1 2
| ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码'; FLUSH PRIVILEGES;
|
切换回 socket 认证
1 2
| ALTER USER 'root'@'localhost' IDENTIFIED WITH auth_socket; FLUSH PRIVILEGES;
|
六、常见问题解决方案
问题1:mysql -u root -p 无法登录
原因:使用 auth_socket 认证
解决方案:
- 使用
sudo mysql
登录
- 或改为密码认证:
1
| ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码';
|
问题2:启用远程访问
- 改为密码认证
- 创建远程用户:
1 2 3
| CREATE USER 'root'@'%' IDENTIFIED BY '密码'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'; FLUSH PRIVILEGES;
|
- 修改配置文件:
- 重启服务:
1
| sudo systemctl restart mysql
|
七、认证方式对比表
特性 |
auth_socket |
mysql_native_password |
caching_sha2_password |
需要密码 |
否 |
是 |
是 |
本地访问 |
支持 |
支持 |
支持 |
远程访问 |
不支持 |
支持 |
支持 |
安全性 |
高 |
中 |
最高 |
兼容性 |
Ubuntu 默认 |
全版本兼容 |
MySQL 8.0+ |
八、最佳实践建议
- 开发环境:保持 auth_socket,使用
sudo mysql
- 生产环境:使用 caching_sha2_password (MySQL 8.0+)
- 传统应用:使用 mysql_native_password 确保兼容性
九、常用命令速查
- 查看用户认证方式:
1
| SELECT user, plugin FROM mysql.user;
|
- 修改密码:
1
| ALTER USER '用户名'@'主机' IDENTIFIED BY '新密码';
|
- 刷新权限:
十、一个神奇的东西
问:为什么我输入mysql
时不行,但是输入sudo mysql
的时候可以呢?难道不都是用的auth_socket验证的吗?
答:测试了一下,发现直接输入mysql
的时候,其实是用当前用户登录(平时在终端打开的时候,都不是root用户),所以相当于验证的用户出现问题了,如果你先输入sudo su
,进入root用户后,在输入mysql
后就OK了hh