背景

以前一直用mysql低版本, 换了mariadb以后本想测试一下root密码正确性, 结果偶尔随便输了一个密码竟然也能进去

方案一

  • 适用于Mariadb10.4及其更高版本

在安装的时候默认给本地root账户开启了"plugin": "unix_socket"}这个插件允许您从控制台进入而无需密码。但也禁用使用密码进行身份验证,并且无法从其他客户端进行连接。

官方的介绍参考如下MariaDB 10.4 中的身份验证 - MariaDB

查看是否启用SHOW GRANTS FOR 'root'@'localhost';

| GRANT ALL PRIVILEGES ON *.* TO `root`@`localhost` IDENTIFIED VIA mysql_native_password USING '*xx236E2C12D764CA78xx' OR unix_socket WITH GRANT OPTION |
| GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION  
  • VIA mysql_native_password USING '*xx236E2C12D764CA78xx' OR unix_socket就表示可以使用密码或unix_socket两种验证方式

根据官方文档MariaDB 10.4 中的身份验证 - MariaDB解决方案如下

ALTER USER root@localhost IDENTIFIED VIA mysql_native_password USING PASSWORD("verysecret");

方案二

  • 适用于10.4以下低版本

网上还有一种方法是查询SELECT host, user, password, plugin FROM mysql.user, 并使用更新语句, 更新pluginmysql_native_password, 已失效

但此语句并看不出来启用了unix_socket

+-----------+-------------+-------------------------------------------+-----------------------+
| Host      | User        | Password                                  | plugin                |
+-----------+-------------+-------------------------------------------+-----------------------+
| localhost | mariadb.sys |                                           | mysql_native_password |
| localhost | root        | *42C12D764CA78F                           | mysql_native_password |
| localhost | mysql       | invalid                                   | mysql_native_password |
| %         | root        | *8BC300DDAFABA4                           | mysql_native_password |
| %         | halo        | *466D4A029FAE764CA7                       | mysql_native_password |
+-----------+-------------+-------------------------------------------+-----------------------+

依据官方说明至少在10.4版本mysql.user已经变成了视图, 通过更新plugin字段值已经失效, 如低版本可以尝试如下

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPass');
UPDATE mysql.user SET plugin = '' WHERE user = 'root' AND host = 'localhost';
FLUSH PRIVILEGES;