设为首页 收藏本站
查看: 1042|回复: 0

[经验分享] MySQL管理之用户权限

[复制链接]

尚未签到

发表于 2018-9-30 08:33:35 | 显示全部楼层 |阅读模式
  MySQL用户管理
  mysql授权级别
  ·全局级别
  ·数据库级别 (能否删除创建库
  ·表级别
  ·字段级别
  ·储存过程、存储函数级别
  需要了解的三种权限类型
  ·管理类
  ·数据库访问类
  ·字段类
  如果某用户访问数据库服务器的时候频率非常大,每秒N个查询并发,这样会消耗太多服务器资源,也有可能恶意访问数据库服务器,所以为了避免类似情况出现,一般可以在授权的同时限定其操作的次数,这些在执行用户授权时则可以定义的
  用户的创建
  创建用户命令
  mysql> help create user;
  Name: 'CREATE USER'
  Description:
  Syntax:
  CREATE USER user_specification                          使用create user 直接跟用户名以及可选项
  [, user_specification] ...
  user_specification:
  user
  [
  IDENTIFIED BY [PASSWORD] 'password'         #创建用户的同时,直接加identified by 即可创建用户密码

  |>  ]
  创建用户过程中,IDENTIFIED BY可以省略
  授权用户只有select权限,并查看其用户能否创建数据库,一般以这种方式创建完后的用户的权限只有use权限,和简单的show 等权限
  比如

  mysql> create user test1@'%'>  Query OK, 0 rows affected (0.00 sec)
  凡是使用create user方式创建用户则可以默认触发flush privileges
  或使用insert into mysql.user
  但是不会主动刷新权限,必须手动执行flush privileges;
  使用创建好的用户进入数据库
  [root@test2 data]# mysql -utest1 -p123456
  mysql> show databases;          #show命令不需要单独授权,但是其他数据库都不能看到
  +--------------------+
  | Database       |
  +--------------------+
  | information_schema |
  | test         |
  +--------------------+
  2 rows in set (0.00 sec)
  用户授权
  mysql> help grant;
  Name: 'GRANT'
  Description:
  Syntax:
  GRANT
  priv_type [(column_list)]                           #指明权限类型,比如select insert 等
  [, priv_type [(column_list)]] ...                 #如果有多个权限则使用逗号隔开
  ON [object_type] priv_level                         #权限级别
  TO user_specification [, user_specification] ...
  [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}] #需求
  [WITH with_option ...]
  GRANT PROXY ON user_specification
  TO user_specification [, user_specification] ...
  [WITH GRANT OPTION]
  有可能表跟函数重名的,如果重名我们的授权只授权于数据库的表,如果授权的是存储函数,一定加FUNCTION并指定函数名
  object_type:
  TABLE
  | FUNCTION
  | PROCEDURE
  创建用户并指定函数
  grant execute on function db.abc to username@'host';
  既有表有bac 也有存储函数名为abc 那么如果想定义函数的话 则需要加function参数:
  grant execute on function function db.abc to username@'host';
  继续往下看
  user_specification:
  user
  [
  IDENTIFIED BY [PASSWORD] 'password'            #指定用户密码,如果授权密码时,用户不存在,则自动创建用户

  |>  ]
  with_option:
  GRANT OPTION                           #权限可以转授予其他用户,不到万不得已不要使用
  | MAX_QUERIES_PER_HOUR count             #每小时最多允许发出的查询次数,如果不想限定将其值改为0即可
  | MAX_UPDATES_PER_HOUR count             #每个小时最多允许执行的更新的次数
  | MAX_CONNECTIONS_PER_HOUR count         #每小时允许建立几次连接
  | MAX_USER_CONNECTIONS count             #同一个用户账号允许并发连接个数
  授权方式
  格式

  GRANT priv(指定权限),priv2..ON[{TABLE|function|PROCEDURE}] {db.tb| routine} to user@host,可定义多个  with option>  授权test1对test1数据库有创建的权限
  mysql> grant create on test1.* to 'test1'@'%';
  Query OK, 0 rows affected (0.00 sec)
  切换至test1登录数据库
  [root@test2 data]# mysql -utest1 -p123456;
  mysql> create database test1;
  Query OK, 1 row affected (0.01 sec)
  测试创建表
  mysql>create table testtb (id intunsigned auto_increment not null,name char(20),primary key(id));
  Query OK, 0 rows affected (0.06 sec)
  创建没问题,接下来测试插入数据
  mysql>insert into testtb(name) values('to');
  ERROR 1142 (42000): INSERT command denied to user 'test1'@'localhost' for table'testtb'
  可显是不行的 因为只给了创建的权限但并没有赋予写入表的权限
  于是再次授权于其用户insert权限
  mysql>grant insert on test1.* to 'test1'@'%';
  Query OK, 0 rows affected (0.00 sec)
  #这里直接写insert表示直接插入表即可
  但是插入数据缺报错了
  mysql>insert into testtb(name) values('to');
  ERROR 1142 (42000): INSERT command denied to user 'test1'@'localhost' for table'testtb'
  重启会话再次执行
  插入成功,说明必要时必须要重新建立会话才可以
  [root@test2data]# mysql -utest1 -p123456;
  mysql>insert into testtb(name) values('to');
  Query OK, 1 row affected (0.01 sec)
  查看用户权限表
  格式: SHOW GRANTS FORUSER;
  mysql> SHOW GRANTS FOR 'test1'@'%' ;
  +------------------------------------------------------------------------------------------------------+
  | Grants fortest1@%                                                                                    |
  +------------------------------------------------------------------------------------------------------+

  | GRANT USAGE ON *.* TO 'test1'@'%'>  | GRANT CREATE ON `wpdb`.* TO'test1'@'%'                                                               |
  | GRANT CREATE ON `abc`.* TO'test1'@'%'                                                                |
  | GRANT INSERT, CREATE ON `test1`.* TO'test1'@'%'                                                      |
  | GRANT CREATE ON `mysql`.`wpdb` TO'test1'@'%'                                                         |
  +------------------------------------------------------------------------------------------------------+
  5 rows in set (0.00 sec)
  赋予其select权限
  mysql>grant select on test1.* to 'test1'@'%';
  Query OK, 0 rows affected (0.00 sec)
  mysql> show grants for 'test1'@'%';
  +------------------------------------------------------------------------------------------------------+
  | Grants fortest1@%                                                                                    |
  +------------------------------------------------------------------------------------------------------+

  | GRANT USAGE ON *.* TO 'test1'@'%'>  | GRANT CREATE ON `wpdb`.* TO'test1'@'%'                                                               |
  | GRANT CREATE ON `abc`.* TO'test1'@'%'                                                                |
  | GRANT SELECT, INSERT, CREATE ON `test1`.* TO'test1'@'%'                                              |
  | GRANT CREATE ON `mysql`.`wpdb` TO 'test1'@'%'                                                        |
  +------------------------------------------------------------------------------------------------------+
  5 rows in set (0.00 sec)
  授权具有执行alter权限
  我们要在testtb表中加入一个字段,如下所示
  mysql>use test1;
  Database changed
  mysql> select * from testtb;
  +----+------+

  |>  +----+------+
  |  1 | to   |
  +----+------+
  1 row in set (0.00 sec)
  授权其alter权限

  mysql>grant>  重启会话
  mysql>alter table testtb add age tinyint unsigned;
  Query OK, 1 row affected (0.07 sec)
  Records: 1  Duplicates: 0  Warnings: 0
  如下所示可以看到我们新加的字段了
  mysql>select * from testtb;
  +----+------+------+

  |>  +----+------+------+
  |  1 | to  | NULL  |
  +----+------+------+
  1 row in set (0.00 sec)
  只授权某表中的某个字段的权限
  mysql>grant update(age) on test1.testtb to 'test1'@'%';
  Query OK, 0 rows affected (0.01 sec)
  更新age某字段

  mysql>update testtb set age=30 where>  Query OK, 1 row affected (0.03 sec)
  Rows matched: 1  Changed: 1  Warnings: 0
  mysql> select * from testtb;
  +----+------+------+

  |>  +----+------+------+
  |  1 | to |  30    |
  +----+------+------+
  1 row in set (0.00 sec)
  更改name字段出现了错误

  mysql>update testtb set name=ot where>  ERROR 1143 (42000): UPDATE command denied to user 'test1'@'localhost' forcolumn 'name' in table 'testtb'
  再次showgrants for 查看其用户权限
  在字段上是单独写的,其他权限全部合并起来了
  #只要在表级别存储过程级别或存储函数、库级别 全都合并在了一起
  在字段或列级别而都以字段级别和列级别合并在一起
  mysql>show grants for test1@'%';
  +------------------------------------------------------------------------------------------------------+
  | Grants fortest1@%                                                                                    |
  +------------------------------------------------------------------------------------------------------+

  | GRANT USAGE ON *.* TO 'test1'@'%'>  | GRANT CREATE ON `wpdb`.* TO'test1'@'%'                                                               |
  | GRANT CREATE ON `abc`.* TO'test1'@'%'                                                                |

  | GRANT SELECT, INSERT, CREATE,>  | GRANT UPDATE (age) ON `test1`.`testtb` TO'test1'@'%'                                                 |
  | GRANT CREATE ON `mysql`.`wpdb` TO'test1'@'%'                                                         |
  +------------------------------------------------------------------------------------------------------+
  6 rows in set (0.00 sec)
  删除用户
  格式 :
  mysql>drop user@host;
  用户重命名
  renameuser
  mysql>help rename user;
  Name: 'RENAME USER'
  Description:
  Syntax:
  RENAME USER old_user TO new_user
  [, old_user TO new_user] ...
  RENAMEUSER 'jeffrey'@'localhost' TO 'jeff'@'127.0.0.1';
  取消授权
  revokefrom
  mysql>help revoke;
  Name: 'REVOKE'
  Description:
  Syntax:
  REVOKE
  priv_type [(column_list)]              #想收回那个权限
  [, priv_type [(column_list)]] ...    #如果是字段上的权限也可以明确指定并收回
  ON [object_type] priv_level
  FROM user [, user] ...
  REVOKE ALL PRIVILEGES, GRANT OPTION
  FROM user [, user] ...
  REVOKE PROXY ON user
  FROM user [, user] ...
  取消其用户的select权限
  mysql>show grants for test1@'%';
  +------------------------------------------------------------------------------------------------------+
  | Grants fortest1@%                                                                                     |
  +------------------------------------------------------------------------------------------------------+

  | GRANT USAGE ON *.* TO 'test1'@'%'>  | GRANT CREATE ON `wpdb`.* TO'test1'@'%'                                                              |
  | GRANT CREATE ON `abc`.* TO'test1'@'%'                                                               |

  | GRANT SELECT, INSERT, CREATE,>  | GRANT UPDATE (age) ON `test1`.`testtb` TO 'test1'@'%'                                               |
  | GRANT CREATE ON `mysql`.`wpdb` TO'test1'@'%'                                                        |
  +------------------------------------------------------------------------------------------------------+
  6 rows in set (0.00 sec)
  mysql>revoke select on test1.* from test1@'%';
  Query OK, 0 rows affected (0.00 sec)
  #select已经没有了
  mysql> showgrants for test1@'%';
  +------------------------------------------------------------------------------------------------------+
  | Grants for test1@%                                                                                  |
  +------------------------------------------------------------------------------------------------------+

  | GRANT USAGE ON *.* TO 'test1'@'%'>  | GRANT CREATE ON `wpdb`.* TO'test1'@'%'                                                               |
  | GRANT CREATE ON `abc`.* TO 'test1'@'%'                                                               |

  | GRANT INSERT, CREATE,>  | GRANT UPDATE (age) ON `test1`.`testtb` TO'test1'@'%'                                                 |
  | GRANT CREATE ON `mysql`.`wpdb` TO'test1'@'%'                                                         |
  +------------------------------------------------------------------------------------------------------+
  6 rows in set (0.00 sec)
  一般来讲select都是读权限,一般可以赋予,其他权限则都为写权限需要慎重考虑授权


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-606459-1-1.html 上篇帖子: mysql示例employees数据库 下篇帖子: mysql-binlog格式详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表