报错是这么冒出来的。Ubuntu 22.04 上装了 MariaDB 10.11,root 用 unix_socket 认证,写成脚本用 mysql -uroot -p 登录直接报 Access denied,密码明明是对的。

中间走过弯路,把「mysql.user 里 root 的 plugin 字段是 unix_socket 而不是 mysql_native_password」当成主因,改完现象没变。

这类报错背后常见的原因有几处,逐个排除就行。unix_socket 插件只认操作系统用户,密码字段在这种情况下不参与校验。也可能是脚本用普通用户执行,映射到的系统用户不是 root。

还有一种情况,改过密码但没加 OR REPLACE,认证插件没跟着换。

先确认 root 用的是哪个认证插件

mariadb -e "select user,host,plugin from mysql.user where user='root'"

随后用系统 root 通过 socket 登录

sudo mariadb -e "select current_user()"

给 root 补上密码认证方式

sudo mariadb -e "alter user 'root'@'localhost' identified via mysql_native_password using password('NewPass123')"

剩下的就是确认脚本能正常登录

mariadb -uroot -p'NewPass123' -e "select 1"

命令输出我都留了记录,免得改完记不清原来的值。

恢复的判定其实很直接。脚本用密码能登录成功,mysql.user 里 root 的 plugin 变成 mysql_native_password,socket 登录方式仍然可用。

MariaDB 默认用 unix_socket,本地运维很方便但脚本会踩坑;改成密码认证后记得把密码放进受保护的配置文件,别写在命令行历史里。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189