美文网首页
MySQL(Mariadb)总结3 - 用户和权限管理,查询缓存

MySQL(Mariadb)总结3 - 用户和权限管理,查询缓存

作者: drfung | 来源:发表于2017-11-17 15:41 被阅读106次

    mysql权限级别:

    • 库级别
    • 表级别
    • 字段级别
    • 管理类
    • 程序类

    • 管理类
      create temporary tables
      create user
      file
      show databases
      reload
      shutdown
      replication slave
      replication client
      lock tables
      process

    • 程序类
      function
      procedure
      trigger
      create, alter, drop, excute

    • 库和表级别
      alter
      create
      create view
      drop
      index
      grant option

    • 数据操作
      select
      insert
      delete
      update

    • 字段级别
      select(col1,col2,...)
      update(col1,col2,...)
      insert(col1,col2,...)

    • 所有
      all privilege, all

    这些权限都是保存在数据的元数据表'mysql'库中

    • 授权表
      • db,host,user
      • columns_priv, tables_priv, procs_priv, proxies_priv

    用户帐号:
    'username'@'host'

    创建用户:create user 'user'@'host' [identity by 'password']

    查看用户权限: show grants for 'username'@'host'

    用户重命名:rename user old to new

    删除用户: drop user 'username'@'host'

    修改密码:

    1. set password for
    2. update mysql.user set password=PASSWORD('password')
    3. mysqladmin password
    

    忘记管理员密码:

    1. 启动mysqld时,为其使用--skip-grant-tables --skip-networking
    2. 使用update命令修改管理员密码
    3. 关闭mysqld进程,移除上述两个权限,重启mysqld

    授权:

    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 ...]
    
    GRANT PROXY ON user_specification
        TO user_specification [, user_specification] ...
        [WITH GRANT 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'
          | IDENTIFIED WITH auth_plugin [AS 'auth_string']
        ]
    
    ssl_option:
        SSL
      | X509
      | CIPHER 'cipher'
      | ISSUER 'issuer'
      | SUBJECT 'subject'
    
    with_option:
        GRANT OPTION
      | MAX_QUERIES_PER_HOUR count
      | MAX_UPDATES_PER_HOUR count
      | MAX_CONNECTIONS_PER_HOUR count
      | MAX_USER_CONNECTIONS count
    
    

    取消授权

    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] ...
    

    练习

    授权test用户通过任意主机连接到当前的mysqld,但每秒钟最大查询次数不超过5次:此账户同时连接次数不得超过3次.

    查询缓存

    如何判断是否命中:

    • 通过查询语句的哈希值来判断,哈希值考虑的因素包括

      • 查询本身\要查询的数据库\客户端使用的协议版本
      • 查询语句任何字符上的不同,都会导致缓存不能命中
    • 那些查询可能不会被缓存

      • 查询钟包含UDF\存储函数\用户自定义变量\临时表\mysql库钟的是同表\包含列级权限的表\有着不确定的函数(now())
    • 查询缓存相关的服务器变量:

      • query_cache_min_res_unit: MySQL能够缓存的最大查询结果;如果某查询大于此值,则不会被缓存;
      • query_cache_limit: 查询缓存钟分配内存的最小单位;
        计算公式:(query_cache_size-Qcache_free_memory)/ Qcache_queries_in_cache
      • query_cache_size: 查询缓存的总体可用空间,必须为1024的整数倍
      • query_cache_type:
      • query_cache_wlock_invalidate: 当其它会话锁定此次查询用到的资源时,是否不能再从缓存中返回数据(默认为false)
    • 与缓存相关的状态变量

    SHOW GLOBAL STATUS LIKE 'Qcache%';
    +-------------------------+----------+
    | Variable_name           | Value    |
    +-------------------------+----------+
    | Qcache_free_blocks      | 1        |
    | Qcache_free_memory      | 16759656 |
    | Qcache_hits             | 16       |
    | Qcache_inserts          | 71       |
    | Qcache_lowmem_prunes    | 0        |
    | Qcache_not_cached       | 57       |
    | Qcache_queries_in_cache | 0        |
    | Qcache_total_blocks     | 1        |
    +-------------------------+----------+
    

    缓存命中率计算公式:Qcache_hits/Com_select

    衡量缓存是否足够有效的另一种思路:Qcache_hits/Qcache_inserts,如果此比值大于3:1, 说明缓存也是有效的;如果高于10:1,相当理想;

    缓存优化的思路:
    1、批量写入比单次写入对缓存的影响要小得多;
    2、缓存空间不宜过大,大量缓存的同时失效会导致MySQL假死;
    3、必要时,使用SQL_CACHE或SQL_NO_CACHE手动控制缓存;
    4、对写密集型的应用场景,禁用缓存反而能提高性能;

    碎片整理:FLUSH QUERY_CACHE
    清空缓存:RESET QUERY_CACHE

    image.png
    graph LR
    Start[开始] --> A{是否命中}
    A -->|是| End[结束]
    A --> |否| B{大部分查询都不是可缓存的?}
    B --> |是| C{query_cache_limit是够大么?}
    C --> |是| End
    C --> |否| E[增加query_cache_limit] 
    E --> Start
    B --> |否| F{发生了很多验证工作?}
    F --> |是| G{缓存被碎片化了么?}
    G --> |是| G1[减少query_cache_min_res_unit或者使用FLUSH QUERY CACHE命令减少碎片]
    G --> |否| G2{有很多因为内存过低而发生的修整工作?}
    G2 --> |是| GG1[增加queru_cache_size] 
    GG1 --> Start
    G2 --> |否| GG2{有很多新语句么?}
    GG2 --> |是| End
    GG2 --> |否| GGG[有其他的东西配置错了]
    
    F --> |否| F1{缓存已经启动了吗?}
    F1 --> |否| FF1[启动缓存]
    FF1 --> Start
    FF1 --> |是| End
    

    相关文章

      网友评论

          本文标题:MySQL(Mariadb)总结3 - 用户和权限管理,查询缓存

          本文链接:https://www.haomeiwen.com/subject/vkjjvxtx.html