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

mysql数据库权限怎么改,访问控制设置那些事儿你得知道

主要综合自MySQL官方文档的权限管理章节、常见数据库管理实践以及技术社区如Stack Overflow的典型问题讨论)

想把MySQL数据库的权限问题搞明白,其实没那么复杂,你就把它想象成管理一栋大楼的门禁系统就行了,数据库就是这栋大楼,里面有很多房间(数据库、表),你创建的用户就是拥有不同门禁卡的人,权限设置就是决定谁能用哪张卡、在什么时间、进哪个房间、以及进去后是只能看(SELECT)还是能搬东西(INSERT/DELETE)甚至是拆房子(DROP)。

你得知道权限是给谁的:用户和主机

mysql数据库权限怎么改,访问控制设置那些事儿你得知道

在MySQL里,光有用户名还不行,还得知道这个用户是从哪台电脑登录的,这很重要!你给用户xiaowang设置权限,必须同时指定他是从localhost(也就是数据库服务器本机)登录,还是从168.1.100这个IP地址登录,或者是从任何地方(用表示)登录。'xiaowang'@'localhost''xiaowang'@'%'在MySQL看来完全是两个不同的用户,他们的密码和权限都可以不一样,这是很多人一开始会搞混的地方,你希望管理员只能从公司内部的某台安全电脑登录数据库,那就应该设置成'admin'@'公司内部IP',而不是'admin'@'%',后者意味着从世界上任何能连上你服务器的电脑都能用admin账号登录,这太危险了。

有哪些常见的“门禁卡”权限?

权限分很多种,有大楼的管理员权限,也有单个房间的权限,你不需要一下子记住所有,但常用的这几个得心里有数:

mysql数据库权限怎么改,访问控制设置那些事儿你得知道

  1. 全局权限: 像大楼的超级管理员,拥有这种权限的用户可以对整个MySQL服务器做任何事情,比如创建删除任意数据库、管理所有用户等,代表性的权限是ALL PRIVILEGES(所有权限)和GRANT OPTION(允许他把自己有的权限再授予别人),这种权限权力极大,千万不能随便给。
  2. 数据库权限: 像是某一层楼的楼长,权限仅限于某个特定的数据库,比如GRANT ALL ON my_database.* TO ...,意思是这个用户可以对my_database这个数据库里的所有表为所欲为,但不能碰其他数据库。
  3. 表权限: 像是某个房间的钥匙,可以精确控制用户对某个表能做什么,比如SELECT(查看看数据)、INSERT(插入新数据)、UPDATE(修改数据)、DELETE(删除数据),如果你只想让一个用户能看某张表但不能修改,就只给SELECT权限。
  4. 列权限: 这更细了,像是只能看房间里的某个保险柜,但不能动别的,比如一张表里有工资列和姓名列,你可以设置某个用户只能查询姓名列,而不能查看工资列,但这种权限用得比较少,因为管理起来太麻烦。

怎么具体修改和设置这些权限?

最常用的工具是GRANTREVOKE这两个SQL命令。

  • 发卡:GRANT命令 语法大概是这样的:GRANT 权限列表 ON 范围 TO '用户名'@'主机名' IDENTIFIED BY '密码'; 举个例子:

    mysql数据库权限怎么改,访问控制设置那些事儿你得知道

    • 创建一个用户,让他能从任何地方登录,并且对app_db数据库有所有权限:GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'%' IDENTIFIED BY 'strongpassword123';
    • 让用户xiaoli只能从内网IP168.1.20登录,并且只能查询report数据库下的sales表:GRANT SELECT ON report.sales TO 'xiaoli'@'192.168.1.20' IDENTIFIED BY 'anotherpassword';

    注意:执行完GRANT命令后,最好紧接着执行一句FLUSH PRIVILEGES;,这个命令是让MySQL系统立刻重新加载权限表,使刚才的授权马上生效,虽然在某些情况下MySQL会自动刷新,但手动执行一下是个保险的好习惯。

  • 收卡:REVOKE命令 如果想把给出去的权限收回来,就用REVOKE,语法和GRANT很像:REVOKE 权限列表 ON 范围 FROM '用户名'@'主机名'; 想收回之前给xiaoli的查询权限:REVOKE SELECT ON report.sales FROM 'xiaoli'@'192.168.1.20'; 同样,执行完后也可以FLUSH PRIVILEGES;一下。

  • 查看权限:SHOW GRANTS命令 想看看某个用户现在都有哪些“卡”,可以用:SHOW GRANTS FOR '用户名'@'主机名'; 这个命令非常有用,尤其是在检查和排查问题的时候。

一些你必须知道的注意事项

  1. 最小权限原则: 这是安全管理的黄金法则,一个用户账号只赋予他完成工作所必需的最小权限,千万不要图省事给一个普通应用账号授予ALL PRIVILEGES,一旦这个账号的密码泄露,你的整个数据库就非常危险了。
  2. 谨慎使用GRANT OPTION 把这个权限给一个用户,就意味着他可以把他自己的权限再给别人,甚至可能创建新的超级用户,除非你非常信任他并且有充分理由,否则不要给。
  3. 密码安全: 创建用户时一定要用IDENTIFIED BY设置一个强密码,对于生产环境的数据库,弱密码是致命的。
  4. 定期审计: 时不时用SHOW GRANTS看看各个用户都有什么权限,清理掉那些不再需要的账号和权限,人员离职或岗位变动后,一定要记得及时回收权限。

管理MySQL权限就像分配钥匙,心里要有一本清楚的账:谁、在哪儿、能进哪儿、能干什么,遵循最小权限原则,谨慎操作,你的数据库大门就能守得牢牢的。