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

mysql权限怎么改,快速搞定数据库访问控制那些事儿

主要综合自MySQL官方文档8.0版本关于权限管理的章节、常见数据库管理实践以及一些技术社区如Stack Overflow上的高频问题解答)

咱们得明白一个核心概念:在MySQL里,谁(用户)能从哪台电脑(主机)登录,能对哪些数据库、表做什么操作(比如只能看还是能增删改),这一整套规矩就是权限管理,这事儿通常由一个叫“root”的超级管理员来干,它权力最大。

最常用的权限修改“三板斧”

别想得太复杂,大部分日常需求,用下面三条命令就能解决。

  1. 创建新用户并给权限(推荐做法) 最好不要直接用root账号去处理所有业务,而是为每个应用或任务创建专属用户,命令长这样: CREATE USER '用户名'@'登录主机' IDENTIFIED BY '密码'; GRANT 权限类型 ON 数据库名.表名 TO '用户名'@'登录主机'; 最后别忘了: FLUSH PRIVILEGES;

    • 举例说明

    • 你想创建一个只能从你自己办公电脑(IP是192.168.1.100)登录的账号,专门用来查询一个叫“sales”的数据库。 CREATE USER 'xiaowang'@'192.168.1.100' IDENTIFIED BY 'a_strong_password123'; GRANT SELECT ON sales.* TO 'xiaowang'@'192.168.1.100'; FLUSH PRIVILEGES; 这样,用户“xiaowang”只能用这个密码从你那台特定电脑登录,而且只能看sales数据库里所有表(sales.*)的数据,不能修改、不能删。

    • 如果你的应用服务器(IP是10.0.0.50)需要完全管理一个叫“app_db”的数据库,可以: CREATE USER 'app_user'@'10.0.0.50' IDENTIFIED BY 'another_strong_password'; GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'10.0.0.50'; FLUSH PRIVILEGES; ALL PRIVILEGES 意味着对这个数据库有所有权限(增删改查、建表删表等),注意,这里范围是app_db.*,不包括其他数据库。

    • 主机名特别提示:如果用户需要从任何一台电脑登录(通常不推荐,有安全风险),主机名部分可以写成,'xiaowang'@'%',如果只允许从安装MySQL的本机登录,就写'localhost'

  2. 修改现有用户的权限 有时候需要给用户加权限或者收回一些权限,这时主要用GRANT(追加权限)和REVOKE(收回权限)命令。

    • 举例说明

    • 觉得上面那个“xiaowang”光能看数据不够,还需要能往sales数据库里插入新数据: GRANT INSERT ON sales.* TO 'xiaowang'@'192.168.1.100'; FLUSH PRIVILEGES; 这条命令是在他原有权限上增加了插入权限,不会删掉他原本的查询权限。

    • 发现“app_user”权限太大了,不想让他能删除app_db数据库里的数据: REVOKE DELETE ON app_db.* FROM 'app_user'@'10.0.0.50'; FLUSH PRIVILEGES;

  3. 查看用户现有权限 改了之后怎么确认呢?用这个命令看看: SHOW GRANTS FOR '用户名'@'登录主机'; SHOW GRANTS FOR 'xiaowang'@'192.168.1.100'; 系统就会列出这个用户当前拥有的所有权限明细。

一些常见的场景和坑

  1. 改完权限一定要“刷新” 上面每条命令后面都跟着一句FLUSH PRIVILEGES;,这可不是废话,这句话的意思是让MySQL立刻重新加载权限表,使刚才的修改生效,如果忘了执行,可能得等MySQL自己重启或者过一会儿才生效,期间会以为修改没成功,这是一个非常常见的新手坑。(来源:MySQL官方文档明确说明修改授权表后建议使用FLUSH PRIVILEGES)

  2. 密码忘了或者要改密码

    • root密码忘了:这是最麻烦的情况,需要先停止MySQL服务,然后用一个特殊的启动参数(如--skip-grant-tables)绕过权限检查来启动,然后进去用UPDATE语句直接修改mysql.user表里的密码字段,再重启MySQL,这个过程稍微复杂点,不同版本命令略有差异,需要查一下对应版本的详细步骤。
    • 普通改密码:用这个命令: ALTER USER '用户名'@'登录主机' IDENTIFIED BY '新密码'; 改完通常不需要显式执行FLUSH PRIVILEGES,因为ALTER USER命令本身会通知系统权限变更。
  3. 想彻底删除一个用户 光把权限收光不行,用户账号还在,要彻底删除: DROP USER '用户名'@'登录主机'; 注意,主机名必须和创建时完全一致,否则会报错说用户不存在。

  4. 权限不生效的排查思路

    • 确认用户和主机名写对了'xiaowang'@'localhost''xiaowang'@'%'在MySQL看来是两个完全不同的用户!经常有人在这里搞混,用SELECT user, host FROM mysql.user;看看都有哪些用户。
    • 确认连数据库时用的主机名和权限里的主机名匹配,如果你用IP地址连接的,但权限是给'localhost'的,那肯定连不上,反过来也一样。
    • SHOW GRANTS确认权限真的授予成功了
    • 记得执行了FLUSH PRIVILEGES(如果用的是GRANT/REVOKE以外的命令修改权限,比如直接改表,则必须执行)。

最小权限原则”

(此理念广泛存在于信息安全和管理学领域,是系统安全管理的基石) 简单说,就是给用户的权限“够用就行”,不要图省事一下子给个ALL PRIVILEGES,一个网站后台只需要查、增、改,那就只给SELECT, INSERT, UPDATE,别给DELETEDROP(删数据和删表)权限,这样万一这个账号密码泄露了,或者程序出bug,造成的破坏也能控制在一定范围内。

快速搞定MySQL权限修改,核心就是理解CREATE USER, GRANT, REVOKE, FLUSH PRIVILEGES这几个关键命令的用法,注意用户和主机名的对应关系,养成修改后查看确认和遵循最小权限原则的习惯,多操作几次,就熟练了。

mysql权限怎么改,快速搞定数据库访问控制那些事儿