之前安装了最新版的mariadb10.4.8后,无论是二进制编译安装还是源码编译安装,设定完密码之后启动mysqld服务,结果都不需要密码就可以登陆进去,无论怎么执行mysql_secure_installation数据库初始化脚本或者mysql_secure_installation安全加固脚本,进入mysql都无需密码,用命令直接设置密码也无效,都是直接一敲mysql就可以进入数据库了。my.cnf配置文件查看了无数遍,也没发现任何蛛丝马迹。今天终于在无意中查看mysql数据库权限时意外有所收获,写出来与大家分享,让大家少走弯路。

  当我进入mysql数据库,打开user表时,查看了下用户没有任何问题。
MariaDB [mysql]> select user,host,password from user;
+———-+————+———————————————————–+
| user   | host    |   password                    |
+———-+————+———————————————————–+
|  root  | localhost | 54D9A58CB44735F80AC5AD29961814D6D12B8746 |
|  root  | 127.0.0.1 | 54D9A58CB44735F80AC5AD29961814D6D12B8746 |
|  root  | ::1     | *54D9A58CB44735F80AC5AD29961814D6D12B8746 |
+———-+————+———————————————————–+
3 rows in set (0.001 sec)
|user | host |password |
|–|–|–|
|root | localhost | *54D9A58CB44735F80AC5AD29961814D6D12B8746 |
|root | 127.0.0.1 | *54D9A58CB44735F80AC5AD29961814D6D12B8746 |
|root |::1| *54D9A58CB44735F80AC5AD29961814D6D12B8746 |
在这里插入图片描述
  可当我突发奇想打算看看他们这几个用户有什么权限上的区别时,就发现问题了:
*
MariaDB [mysql]> show grants for ‘root’@’localhost’;**
+—————————————————————————————————————+
|  Grants for root@localhost                                   |
+—————————————————————————————————————+
| GRANT ALL PRIVILEGES ON *.
TO ‘root’@’localhost’ IDENTIFIED VIA mysql_native_password USING ‘invalid’ OR unix_socket WITH GRANT OPTION                          |
| GRANT PROXY ON ‘’@’%’ TO ‘root’@’localhost’ WITH GRANT OPTION         |
+—————————————————————————————————————+
2 rows in set (0.000 sec)
MariaDB [mysql]> show grants for ‘root’@’127.0.0.1’;
ERROR 1141 (42000): There is no such grant defined for user ‘root’ on host ‘127.0.0.1’
MariaDB [mysql]> show grants for ‘root’@’::1’;
ERROR 1141 (42000): There is no such grant defined for user ‘root’ on host ‘::1’
MariaDB [mysql]>
在这里插入图片描述
  root用户竟然查不到权限,这就很奇怪了。在之前的mariadb10.2.27上尝试了下,都是正常的,如下图所示:
在这里插入图片描述
  于是我就尝试对那两个异常的用户账号授权。
在这里插入图片描述
  竟然也无法授权。这种情况跟我之前尝试过的直接用insert命令向user表中加的user条目情况有点相似。当时我用

insert user set Host='192.168.32.7',User='root',Password='54D9A58CB44735F80AC5AD29961814D6D12B8746',ssl_cipher='',x509_subject='',x509_issuer='',authentication_string='';

命令在user表中创建了一个用户条目‘root’@’192.168.32.7’。
在这里插入图片描述
  这个条目看起来和真正的用户一样,可等到授权时就发现没法授权了,且这个用户也没法远程在192.168.32.7主机登录,尝试insert了一个新的非root用户,也是同样的情况。说明create user 命令不单单只是在这个表上创建了新的用户条目,在其他关联的表上也有条目的增加。OK ,话题扯远了,继续说之前的无法加密的问题。
  既然是同样的情况,我想到会不会是说明我这个新装好的mariadb上的这两个用户没有创建成功,是不是像上面提到的两个异常用户只是在这表中“徒有其表”呢?
  那就尝试创建用户,并查看了下权限。
在这里插入图片描述  竟然创建用户成功了,而且权限也显示出来了(我记得我还没有授权呢啊!!!看来是root用户不用授权)。好像一切都恢复正常了。
  赶紧退出看下是不是真的恢复正常了,结果失望的发现还是一敲mysql就可以登陆进去了!!!在这里插入图片描述
  不过又尝试了下 用127.0.0.1登陆,发现竟然需要密码验证了,且用之前设置的密码才可以登录。我好像发现了什么~
  删除用户‘root’@’localhost’,不让删,需要至少一个有CREATE USER权限用户,看来之前的‘root’@’127.0.0.1’用户没有权限。
在这里插入图片描述
  那就先给‘root’@’127.0.0.1’用户授权

grant all on *.* to 'root'@'127.0.0.1
';````
  再删除用户'root'@'localhost',成功了,再重新创建'root'@'localhost'用户并指定密码,再授权。OK,退出重新登陆一下。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190919155616216.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01pY2VQcm8=,size_16,color_FFFFFF,t_70)
  果然数据库加密成功了~!问题解决!
**-------------------------------------------(以上封存,警醒自己的无知~)--------------------------------------------**
  
  
  
  **后记**:
  原来是mariadb10.4.8版本默认是可以本地使用使用unix_socket登陆无需密码,才导致密码无效,在上面的图片里显示得清清楚楚。
**MariaDB [mysql]> show grants for 'root'@'localhost';**

+—————————————————————————————————————+
|  Grants for root@localhost                                   |
+—————————————————————————————————————+
| GRANT ALL PRIVILEGES ON . TO ‘root’@’localhost’ IDENTIFIED VIA mysql_native_password USING ‘invalid’ OR unix_socket WITH GRANT OPTION                          |
| GRANT PROXY ON ‘’@’%’ TO ‘root’@’localhost’ WITH GRANT OPTION         |
+—————————————————————————————————————+
2 rows in set (0.000 sec)
MariaDB [mysql]> show grants for ‘root’@’127.0.0.1’;
ERROR 1141 (42000): There is no such grant defined for user ‘root’ on host ‘127.0.0.1’
MariaDB [mysql]> show grants for ‘root’@’::1’;
ERROR 1141 (42000): There is no such grant defined for user ‘root’ on host ‘::1’

MariaDB [mysql]> 
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190918202258915.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01pY2VQcm8=,size_16,color_FFFFFF,t_70)
  当然,也存在用户不存在,而user表中有条目的情况。所以想最终解决这个问题,实际上最直接的命令是:

GRANT ALL PRIVILEGES ON . TO ‘root’@’localhost’ IDENTIFIED VIA mysql_native_password USING ‘*54D9A58CB44735F80AC5AD29961814D6D12B8746’ WITH GRANT OPTION;

  重新对root@localhost用户授权取消unix_sock登陆,并设置密码。
  至此,问题才真正解决。
                                      后记写于 2019.9.23。

一个低调的男人