MariaDB GRANT ALL PRIVILEGES Access denied for user

文章目录

  • MariaDB GRANT ALL PRIVILEGES Access denied for user
    • 前言
    • 分析过程
      • 登录数据库
      • 检查数据库版本
      • 查看当前登录用户权限
    • 解决方法
    • 小结
    • 参考文档

MariaDB GRANT ALL PRIVILEGES Access denied for user

前言

最近在一台MariaDB 5.5的数据库上试图授全部权限(GRANT ALL PRIVILEGES)给数据库用户时,报错Access denied。

以root用户登录数据库,授权过程:

# 创建数据库用户test,允许其通过任意主机登录数据库,密码为Test123
CREATE USER 'test'@'%' IDENTIFIED BY 'Test123';

# 授全部权限给数据库用户test
GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' IDENTIFIED BY 'Test123' WITH GRANT OPTION;

报错:Access denied for user 'root'@'localhost' (using password: YES)

本文描述了如何解决这一问题的过程,为解决类似问题提供参考。

分析过程

登录数据库

# 以root用户,输入密码登录数据库
mysql -u root -p

也可以通过mysql -uroot -p来登录,但是这种登录方式会在Linux history中泄漏数据库密码。

检查数据库版本

select version();

本例子的数据库版本为:5.5.64-MariaDB。

如果是MySQL5.7,则数据库版本类似:5.7.29。

查看当前登录用户权限

检查当前登录用户:

# 检查当前用户,结果为:root@localhost
select current_user();

查看当前登录的用户权限:

# 查看当前用户权限
show grants;

本例MariaDB 5.5中的root@localhost的用户权限为:

Grants for root@localhost

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '' WITH GRANT OPTION

作为参照,MySQL 5.7中root@localhost的用户权限为;

Grants for root@localhost

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION
GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION

可以看到MySQL5.7中root@localhost用户有GRANT ALL PRIVILEGES权限,而在MariaDB 5.5中尽管root@localhost用户有一大堆权限,但是并不表示其有GRANT ALL PRIVILEGES权限。

既然MariaDB 5.5中的root@localhost用户没有GRANT ALL PRIVILEGES权限,它也就无法给test@%root@%或其它用户GRANT ALL PRIVILEGES

解决方法

其实test用户并不需要全部权限,它只需要部分权限,并且允许从任意主机登录数据库就可以了。

因此授权语句可以改为授予具体的权限(比如GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP),而不是GRANT ALL PRIVILEGES:

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON *.* TO 'test'@'%' IDENTIFIED BY 'Test123' WITH GRANT OPTION;

完整的授权过程如下:

# 以root用户,输入密码登录数据库
mysql -u root -p

# 创建数据库用户
CREATE USER 'test'@'%' IDENTIFIED BY 'Test123';

# 授权
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON *.* TO 'test'@'%' IDENTIFIED BY 'Test123' WITH GRANT OPTION;

# 查看授权
SHOW GRANTS FOR 'test'@'%';

# 保存授权
FLUSH PRIVILEGES;

# 退出
exit

验证是否可以新用户从任意主机登录数据库:

mysql -u <db_user> -p -h <db_host> -P <db_port>

如果不能访问,则需要再检查是否是数据库服务器设置了bind-address为127.0.0.1,或者数据库服务器端口的网络策略是否已开通。

小结

MarialDB和MySQL的root账号权限不同,在MySQL中root账号有GRANT ALL PRIVILEGES权限,因此可以GRANT ALL PRIVILEGES给其它用户,但是MarialDB中root账号没有GRANT ALL PRIVILEGES权限,因此在试图GRANT ALL PRIVILEGES给其它用户时,会报错Access denied for user ‘root’@‘localhost’ (using password: YES)。

参考文档

  • https://stackoverflow.com/questions/8484722/access-denied-for-user-rootlocalhost-while-attempting-to-grant-privileges

你可能感兴趣的:(MySQL)