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

[经验分享] MySQL中级:用户管理

[复制链接]

尚未签到

发表于 2018-10-4 12:55:50 | 显示全部楼层 |阅读模式
  MySQL服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少。换句话说,普通用户不能对过多的数据具有过多的访问权。
  最佳实践:
  在生产环境中,不要使用root。应该创建一系列的账号,分别用于管理、供用户使用、供开发人员使用等。
  用户管理
  当MySQL安装完成后,MySQL用户账号信息存储在mysql数据库中。mysql数据库中有一个名为user的表,它包含所有的用户账号。用户管理就是围绕这个表开始的,当然还有一些表,例如:tables_priv,procs_priv,clumns_priv,information_schema数据库里面的USER_PRIVILEGES等。
  1、创建用户账号
Syntax:  
CREATE USER user_specification
  
    [, user_specification] ...
  

  
user_specification:
  
    user [IDENTIFIED BY [PASSWORD] 'password']
  

  
-- For each account, CREATE USER creates a new row in
  
-- the mysql.user table and assigns the account no privileges.
  假设我想创建一个skype用户:
mysql> CREATE USER 'skype'@'localhost' IDENTIFIED BY '123456';  
Query OK, 0 rows affected (0.07 sec)
  但是请注意,CREATE USER虽然可以创建用户,但是它也仅仅是创建用户,并没有给用户账号分配权限,它们能登录MySQL,但是不能执行任何数据库操作。所以我们还得单独使用GRANT命令为用户授权。
  
  使用GRANT或INSERT
  GRANT语句和INSERT语句也可以创建用户账号,因为它们涉及直接操作mysql.user表,不建议这样操作。而使用CREATE USER更简单和清晰,推荐使用。
  2、删除用户账号
Syntax:  
DROP USER user [, user] ...
  

  
-- The DROP USER statement removes one or more MySQL accounts and their
  
-- privileges.
  DROP USER 会删除用户账号和所有该账号相关的权限。
  实例:删除我们刚才创建的账号
mysql> DROP USER 'skype'@'localhost';  
Query OK, 0 rows affected (0.00 sec)
  在这里为什么要用'skype'@'localhost'当用户名,而不是直接skype呢,因为mysql.user这张表,是通过用户名和host共同决定一个用户,你可查看一下表结构就知道了。如果不指定host,则使用默认的主机名 % 通配符。
  用户的构成: uesrname@host
  host可以是下面几种类型:

  •   hostname
  •   IP
  •   网络地址, 如 192.168.%.%
  账号:仅仅用于认证
  权限:对资源的访问控制
show create table mysql.user \G;  你会发现有这个东西PRIMARY KEY (`Host`,`User`),表示联合主键
  设置访问权限
  创建用户账号之后,必须接着分配访问权限。新创建的用户账号没有访问权限。它们能登录MySQL,但是不能看到数据,不能执行任何数据库操作。
  1、查看授予用户的权限
mysql> CREATE USER 'test1'@'localhost' IDENTIFIED BY '123456';  
Query OK, 0 rows affected (0.00 sec)
  

  
mysql> SHOW GRANTS FOR 'test1'@'localhost';
  
+---------------------------------------------------------------------------+
  
| Grants for test1@localhost                                                                                   |
  
+---------------------------------------------------------------------------+
  
| GRANT USAGE ON *.* TO 'test1'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
  
+---------------------------------------------------------------------------------------+
  
1 row in set (0.00 sec)
  USAGE表示没有权限,仅能够连接登陆mysql,能做一些简单的操作。所以,test1用户在任意数据库的任意表上对任何东西都没有权限。
DSC0000.jpg

Syntax:  
GRANT
  
    priv_type [(column_list)]
  
      [, priv_type [(column_list)]] ...
  
    ON [object_type] priv_level
  
    TO user_specification [, user_specification] ...
  
    [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
  
    [WITH with_option ...]
  

  
object_type:
  
    TABLE
  
  | FUNCTION
  
  | PROCEDURE
  

  
priv_level:
  
    *
  
  | *.*
  
  | db_name.*
  
  | db_name.tbl_name
  
  | tbl_name
  
  | db_name.routine_name
  

  
user_specification:
  
    user [IDENTIFIED BY [PASSWORD] 'password']
  

  
ssl_option:
  
    SSL                    -- SSL 加密
  
  | X509                   -- x509证书
  
  | CIPHER 'cipher'        -- 加密算法
  
  | ISSUER 'issuer'        -- 证书颁发机构
  
  | SUBJECT 'subject'      -- 主题
  

  
with_option:
  
    GRANT OPTION
  
  | MAX_QUERIES_PER_HOUR count        -- 每小时最多执行多少条SQL
  
  | MAX_UPDATES_PER_HOUR count        -- 每小时最多更新多少条数据
  
  | MAX_CONNECTIONS_PER_HOUR count    -- 每小时最大的连接数是多少
  
  | MAX_USER_CONNECTIONS count        -- 最大用户连接数
  看着这一大堆语法头就晕了,那么只要根据上述那个图,就很好理解了:
  GRANT 权限
  ON 应用范围(数据库表,方法等)
  TO 用户(用@隔开,前面是用户名后面是主机名'用户名'@'主机名')
  IDENTITIED BY 密码
  REQUIRE 要求什么的
  WITH 对用户的进行的执行sql的条数控制。
  假设,我为test1账号授予对study库中所有表有SELECT权限:
-- test1用户对study库中的所有表可SELECT  
mysql> GRANT SELECT ON study.* TO 'test1'@'localhost';
  
Query OK, 0 rows affected (0.00 sec)
  

  
GRANT SELECT, UPDATE ON study.orders TO 'test1'@'localhost';
  
--对study.orders表有SELECT, UPDATE 权限
  

  
GRANT SELECT(order_num), update(order_num, order_date) ON study.orders TO 'test1'@'localhost';
  
-- 对orders表的order_num字段可SELECT,对order_num, order_date有UPDATE权限
  相反, 我要取消test1用户的SELECT权限:
mysql> REVOKE SELECT ON study.* FROM 'test1'@'localhost';  
Query OK, 0 rows affected (0.00 sec)
  这个是去掉一个权限,如果我要全部去掉怎么办呢,一个一个写太麻烦了,看下面的一个例子
mysql> REVOKE ALL, GRANT OPTION  FROM 'test1'@'localhost'; -- 这玩意儿很好用哦  
Query OK, 0 rows affected (0.00 sec)
  

  
mysql> FLUSH PRIVILEGES;
  
Query OK, 0 rows affected (0.00 sec)
  注意, 添加完用户账号和授予权限后,别忘了: FLUSH PRIVILEGES;  重新载入权限表
  GRANT是授予用户权限 TO, 而REVOKE是从用户那儿拿走权限 FROM。
  GRANT和REVOKE可以在几个层次上控制访问权限:

  •   整个服务器, 使用GRANT ALL 和 REVOKE ALL
  •   整个数据库, 使用ON database.*
  •   特定的表, 使用 ON database.table
  •   特定的列
  •   特定的存储过程
  下面列出各种权限:
DSC0001.jpg

  更改密码
Syntax:  
SET PASSWORD [FOR user] =
  
    {
  
        PASSWORD('cleartext password')
  
      | OLD_PASSWORD('cleartext password')
  
      | 'encrypted password'
  
    }
  把test1的密码改为'helloworld':
mysql> SET PASSWORD FOR 'test1'@'localhost' = PASSWORD('helloworld');  
Query OK, 0 rows affected (0.04 sec)
  查看更多实例:http://dihuo.blog.51cto.com/1657091/1576377



运维网声明 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-611867-1-1.html 上篇帖子: Django连接数据mysql 下篇帖子: MySQL入门-9:分组数据
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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