当前位置:首页 > 问答 > 正文

MySQL授权那些事儿,教你怎么快速搞定数据库权限管理

主要基于MySQL官方文档8.0版本以及常见的数据库管理实践经验)

说到管理MySQL数据库,给用户分配权限是个绕不开的活儿,不管是新项目上线需要创建个账户,还是开发人员需要查询数据的权限,作为管理员,你都得清楚怎么把手里的“钥匙”安全又准确地交出去,这事儿听起来可能有点技术性,但别怕,咱们今天就用大白话把它捋清楚,让你能快速上手搞定。

核心思想:最小权限原则

在开始具体操作之前,得先明白一个最重要的原则:最小权限原则,简单说,就是给用户的权限“刚刚好”就行,一个只负责从某个表里查数据的账号,你就别给它删除数据或者修改表结构的权力,这就像给小区门卫钥匙,他只负责开大门,就别把每户人家的钥匙都给他,这样做能最大程度地减少因为误操作或者账号泄露带来的风险,权限越大,责任越大,风险也越大。

认识两个关键命令:GRANT 和 REVOKE

管理权限,主要就靠这两个命令,一个给权,一个收权。

  • GRANT:这个命令就是用来给用户授权的,你可以用它指定把哪些权限(比如查数据、插数据),在哪个数据库的哪个表上,授予给哪个用户,并且允许他从哪台电脑登录。
  • REVOKE:这个是GRANT的反操作,当需要收回某个用户的某些权限时,就用它。

实战操作:从创建用户到授权

光说不练假把式,我们一步步来看怎么实际操作。

MySQL授权那些事儿,教你怎么快速搞定数据库权限管理

  1. 创建用户(CREATE USER) 在授权之前,你得先有个用户,创建用户的命令很简单: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 这里有几个地方要注意:

    • username:就是你给用户起的名字,readonly_user
    • host:这个特别重要!它指定了这个用户只能从哪台机器连接到MySQL服务器。
      • 如果只允许从本机登录,就写 'localhost'
      • 如果允许从任何一台机器登录(慎用!),就写 。
      • 如果只允许从IP地址为192.168.1.100的机器登录,就写 '192.168.1.100'
      • 如果允许从一个网段登录,比如192.168.1.x的所有机器,可以写 '192.168.1.%'
    • password:给用户设置一个强密码。

    举个例子,创建一个只能从内网IP段192.168.1.0/24登录的只读用户:CREATE USER 'read_user'@'192.168.1.%' IDENTIFIED BY 'StrongPassword123!';

  2. 授予权限(GRANT) 用户创建好了,但这时候它还是个“光杆司令”,啥也干不了,接下来我们用GRANT给它授权。 GRANT的基本语法是: GRANT privilege_type ON database_name.table_name TO 'username'@'host';

    • privilege_type:权限类型,这是核心。
      • 常用权限有:
        • SELECT:查询数据。
        • INSERT:插入新数据。
        • UPDATE:更新已有数据。
        • DELETE:删除数据。
        • ALL PRIVILEGES:所有权限(相当于数据库的“超级管理员”,轻易不要给)。
      • 如果要授予多个权限,用逗号隔开,GRANT SELECT, INSERT ON ...
    • ON database_name.table_name:指定权限的作用范围。
      • 如果想授权给所有数据库的所有表(权限极大,非常危险),可以写 。
      • 如果只授权给某个数据库(比如叫 app_db)的所有表,可以写 app_db.*
      • 如果只授权给某个数据库的某个特定表(app_db 下的 users 表),可以写 app_db.users

    接上面的例子,我们给刚创建的 read_user 授予对 app_db 数据库所有表的只读权限: GRANT SELECT ON app_db.* TO 'read_user'@'192.168.1.%';

  3. 让授权生效(FLUSH PRIVILEGES) 在执行完GRANT命令后,强烈建议运行一下这个命令:FLUSH PRIVILEGES; 这个命令的作用是让MySQL服务器重新加载权限表,使刚才的授权设置立即生效,尤其是在某些版本的MySQL或某些情况下,不执行这个命令,新授权可能不会马上被识别,养成好习惯,授权完就 FLUSH 一下。

    MySQL授权那些事儿,教你怎么快速搞定数据库权限管理

查看和回收权限

  1. 查看用户权限 你怎么知道一个用户现在都有哪些权限呢?用这个命令: SHOW GRANTS FOR 'username'@'host'; 它会清晰地列出该用户被授予的所有权限语句,一目了然。

  2. 回收权限(REVOKE) 如果发现权限给多了,或者员工岗位变动不再需要某些权限,就要及时收回。 REVOKE的语法和GRANT很像: REVOKE privilege_type ON database_name.table_name FROM 'username'@'host'; 要收回 read_user 的插入权限(假设之前误给了): REVOKE INSERT ON app_db.* FROM 'read_user'@'192.168.1.%'; 同样,操作完后最好也执行一下 FLUSH PRIVILEGES;

一些实用的进阶技巧

  • 创建管理员账号:如果需要创建一个拥有所有权限的管理员账号(比如给运维同事),可以这样:GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'VeryStrongAdminPwd'; 注意,主机名最好限制在安全的服务器IP,不要用 。
  • 只授权某个存储过程:如果只想让用户执行某个特定的存储过程,而不想让它直接操作底层表,可以授予 EXECUTE 权限:GRANT EXECUTE ON PROCEDURE db_name.procedure_name TO 'user'@'host';

最后的小贴士

  • 定期审计:时不时用 SHOW GRANTS 检查一下重要账号的权限,确保没有多余的权限。
  • 删除无用账户:对于离职员工或不再使用的应用账户,直接用 DROP USER 'username'@'host'; 彻底删除,而不是仅仅收回权限。
  • 密码安全:定期更换密码,尤其是高权限账户的密码。

MySQL的权限管理就像是在给数据库的大门加上一道道精细的锁,刚开始可能觉得有点繁琐,但只要你理解了 GRANTREVOKE 的基本用法,并牢牢记住“最小权限”这个黄金法则,多练习几次,就能轻松驾驭,确保你的数据库既安全又好用,希望这些实实在在的步骤能帮你快速搞定数据库权限管理这件“大事儿”。