0

0

Mysql用户权限回收与修改_mysql如何撤销用户特定数据库权限

爱谁谁

爱谁谁

发布时间:2025-08-25 08:18:01

|

261人浏览过

|

来源于php中文网

原创

答案是使用REVOKE语句撤销权限,如REVOKE ALL PRIVILEGES ON my_database.* FROM 'dev_user'@'localhost'; 可精细控制权限,撤销后通常无需FLUSH PRIVILEGES,但可执行以确保生效,查看权限用SHOW GRANTS,权限调整靠GRANT与REVOKE组合操作。

mysql用户权限回收与修改_mysql如何撤销用户特定数据库权限

在MySQL中,撤销用户对特定数据库的权限,核心操作就是使用

REVOKE
语句实现。它允许你精确地收回之前授予的任何权限,无论是针对整个数据库、某个表,甚至是某个特定的操作(如SELECT、INSERT)。

解决方案

要撤销MySQL用户对特定数据库的权限,你需要用到

REVOKE
语句。它的基本语法是:

REVOKE [权限类型] ON [数据库名].[表名或*] FROM '用户名'@'主机名';

这里有几个关键点:

  • 权限类型:可以是
    SELECT
    ,
    INSERT
    ,
    UPDATE
    ,
    DELETE
    ,
    CREATE
    ,
    DROP
    ,
    ALL PRIVILEGES
    等等。如果你想撤销所有权限,就用
    ALL PRIVILEGES
  • **数据库名.表名或***:
    • database_name.*
      表示针对该数据库下的所有表。
    • database_name.table_name
      表示只针对该数据库下的特定表。
  • '用户名'@'主机名':指定要撤销权限的用户及其连接主机。

举几个实际的例子,这应该能让你更清晰:

  1. 撤销用户

    dev_user
    my_database
    数据库的所有权限:

    REVOKE ALL PRIVILEGES ON my_database.* FROM 'dev_user'@'localhost';

    这条命令执行后,

    dev_user
    就无法再对
    my_database
    进行任何操作了。这在我看来,是权限收回最彻底的一种方式,尤其当你需要完全移除一个用户对某个库的访问时。

  2. 撤销用户

    report_user
    sales_data
    数据库的
    INSERT
    UPDATE
    权限,但保留
    SELECT
    权限:

    REVOKE INSERT, UPDATE ON sales_data.* FROM 'report_user'@'localhost';

    你看,我们可以非常精细地控制,只拿掉他不需要或不该有的操作权限。这在很多场景下特别有用,比如一个报表用户,他只需要读取数据,就不应该有修改的权限。

  3. 撤销用户

    app_user
    user_info
    数据库中
    customers
    表的
    DELETE
    权限:

    REVOKE DELETE ON user_info.customers FROM 'app_user'@'%';

    这里的

    %
    表示该用户可以从任何主机连接。这种细粒度的权限控制,对于保护敏感数据表尤其重要。我个人觉得,在生产环境中,权限越细越好,遵循最小权限原则总是没错的。

撤销权限后,通常情况下,MySQL会立即更新内部的权限表,所以用户下次连接或执行操作时,新的权限设置就会生效。

MySQL中,撤销用户权限后是否需要刷新权限?

关于撤销权限后是否需要立即执行

FLUSH PRIVILEGES
,这其实是个老生常谈的问题,也经常让人有些困惑。简单来说,在大多数现代MySQL版本(比如5.7及更高版本)中,当你使用
REVOKE
语句来撤销权限时,MySQL会自动更新内存中的权限缓存以及磁盘上的权限表(
mysql
数据库下的
user
,
db
,
tables_priv
等表)。这意味着,对于新建立的连接,或者当前连接执行的后续操作,权限变更通常会立即生效,不需要手动执行
FLUSH PRIVILEGES

QQ823店铺进存销管理平台
QQ823店铺进存销管理平台

QQ823店铺进存销管理平台采用asp+Access开发,功能有:销售管理 定单管理 库存管理 客户管理 供应商管理 统计分析 系统权限管理等。 QQ823店铺进存销管理平台说明:管理帐号:admin管理密码:admin如修改数据库名称请修改DataBase/QQ823COM_DataBase.mdb系统要求虚拟主机要求:该系统无他特殊组件要求,asp+access虚拟机均可正常运行没有安装运行环

下载

但是,凡事总有例外,或者说一些特殊情况。我通常会在以下几种情况考虑或者干脆就执行一下

FLUSH PRIVILEGES

  • MySQL版本较老: 早期的一些MySQL版本可能在权限变更的实时性上不如新版本那么完善。
  • 权限管理操作频繁且复杂: 如果你正在进行大量、复杂的权限授予和撤销操作,或者有脚本在自动化这些操作,执行一下
    FLUSH PRIVILEGES
    可以作为一种“确保万无一失”的习惯。它强制MySQL重新加载权限表,确保所有更改都已生效。
  • 手动修改了
    mysql
    系统数据库中的权限表:
    这是极不推荐的做法,但如果你真的这么做了,那
    FLUSH PRIVILEGES
    就是必须的了。
  • 用户会话的缓存: 尽管权限表更新了,但某些用户会话可能因为连接池或其他机制,仍然缓存了旧的权限信息。这种情况下,
    FLUSH PRIVILEGES
    可以帮助清理这些缓存,尽管重启应用连接可能更彻底。

所以,我的建议是,对于标准的

REVOKE
操作,通常不需要。但如果你遇到权限不生效的问题,或者出于谨慎,执行一下也无妨,它不会有什么副作用。

如何查看MySQL用户当前拥有哪些权限?

了解一个用户当前到底有哪些权限,这在权限管理中是至关重要的一步,尤其是在你进行授予或撤销操作之后,需要验证结果时。最直接、最常用的方法就是使用

SHOW GRANTS
语句。

语法很简单:

SHOW GRANTS FOR '用户名'@'主机名';

举个例子,要查看

dev_user
localhost
上的权限:

SHOW GRANTS FOR 'dev_user'@'localhost';

执行这条命令后,你会得到一个结果集,每行代表一个授予的权限。比如,你可能会看到类似这样的输出:

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for dev_user@localhost                                                                                                                                                      |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `dev_user`@`localhost`                                                                                                                                       |
| GRANT SELECT, INSERT, UPDATE ON `my_database`.* TO `dev_user`@`localhost`                                                                                                         |
| GRANT SELECT ON `another_database`.`some_table` TO `dev_user`@`localhost`                                                                                                         |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

这清晰地展示了

dev_user
拥有的权限:

  • GRANT USAGE ON *.* TO 'dev_user'@'localhost'
    :这表示用户有连接到MySQL服务器的权限,但没有对任何数据库或表的特定操作权限。这是所有用户都会有的基本权限。
  • GRANT SELECT, INSERT, UPDATE ON my_database.* TO 'dev_user'@'localhost'
    :表明该用户对
    my_database
    数据库下的所有表拥有
    SELECT
    ,
    INSERT
    ,
    UPDATE
    权限。
  • GRANT SELECT ON another_database.some_table TO 'dev_user'@'localhost'
    :表示该用户只对
    another_database
    中的
    some_table
    表拥有
    SELECT
    权限。

通过这种方式,你可以一目了然地确认用户权限是否符合你的预期。我个人觉得,在任何权限变更后,都应该养成

SHOW GRANTS
一下的习惯,这是避免配置错误最有效的方法之一。

除了撤销,MySQL用户权限还可以如何修改或调整?

当我们谈论“修改”或“调整”MySQL用户权限时,这通常不是一个单一的命令就能完成的,而是

GRANT
REVOKE
语句的组合使用。MySQL没有一个直接的
MODIFY PRIVILEGES
命令。它更像是一种“加法”和“减法”的游戏。

  1. 通过

    GRANT
    增加权限: 这是最常见的“修改”方式。如果你想给一个用户增加新的权限,比如之前只有
    SELECT
    ,现在想让他也能
    INSERT
    ,你就直接用
    GRANT
    语句:

    GRANT INSERT ON my_database.* TO 'dev_user'@'localhost';

    即使这个用户已经有了其他权限,

    GRANT
    命令也只会把新的权限添加上去,而不会覆盖或移除已有的权限。这是一种累加式的操作。

  2. 通过

    REVOKE
    减少权限: 就像我们前面详细讨论的,当你想从用户那里拿走某些权限时,就用
    REVOKE
    。这其实也是一种“修改”——把权限从多变少。

  3. 组合使用

    REVOKE
    GRANT
    来“重置”权限:
    有时候,你可能觉得一个用户的权限结构有点混乱,或者想彻底重新定义他的权限。这时候,一个常见且稳妥的做法是:

    • 首先,使用
      REVOKE ALL PRIVILEGES ON database_name.* FROM 'user'@'host';
      彻底收回该用户对特定数据库的所有权限(或
      REVOKE ALL PRIVILEGES ON *.*
      收回所有权限,但要小心)。
    • 然后,再使用
      GRANT
      语句,精确地授予他所需的所有权限。 这种“先清空再重建”的方式,可以有效避免权限残留或意外的权限叠加,在我看来,对于复杂权限的梳理和调整,是比较推荐的策略。
  4. ALTER USER
    用于用户属性修改(非权限): 虽然不直接涉及数据库操作权限,但
    ALTER USER
    命令是用来修改用户本身的属性的,比如修改密码、修改认证插件、锁定/解锁账户等。这在用户管理中也很重要,但它和我们讨论的数据库操作权限是两个不同的维度。

    ALTER USER 'dev_user'@'localhost' IDENTIFIED BY 'new_secure_password';

    这只是修改了用户密码,不会影响他在数据库上的读写权限。

所以,总结来说,MySQL的权限“修改”更多是一种管理策略,通过

GRANT
REVOKE
的灵活组合来实现权限的增、减、以及“重置”。在实际操作中,我总是建议在测试环境充分验证权限设置,确保最小权限原则得到贯彻,这能大大降低潜在的安全风险。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

663

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

246

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

281

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

514

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

253

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

386

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

529

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

599

2023.08.14

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 801人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号