• 深入理解MySQL——mysql库中表字段含义


    我们先介绍mysql系统库中的权限系统表。 在mysql系统库中,MySQL访问权限系统表包含如下几个表。

    • user:包含用户账户、全局权限和其他非权限列表(安全配置字段和资源控制字段)。
    • db:数据库级别的权限表。
    • tables_priv:表级别的权限表。
    • columns_priv:字段级别的权限表。
    • procs_priv:存储过程和函数权限表。
    • proxies_priv:代理用户权限表。

    提示:
    要更改权限表的内容,推荐使用账号管理语句(如:CREATE USER、GRANT、REVOKE等)来间接修改,不建议直接使用DML语句修改权限表,否则后果自负。 以下内容主要针对MySQL 5.7版本进行整理。

    user

    user表提供查询全局权限信息。该表中的账号密码信息在认证1阶段(关于认证阶段 的相关内容,我们会在后面的文章中进行介绍)决定着是否允许用户连接,对于通过账号密码认证阶段的连接,如果同时通过user表中的权限检查,那么就代表该用户拥有全局权限。 该表中记录的权限信息代表用户是否拥有该实例下所有数据库的相应全局权限。

    注意:如果在user表中有任意一个权限字段值为Y的,就被认为拥有全局权限,所以用户在使用SHOW DATABASES或者information_schema下的schemata表查询时,可以查询到所有数据库名称列表。 下面是该表中存储的信息内容。

    @localhost:[mysql]>select * from user limit 1\G
    *************************** 1. row ***************************
                      Host: localhost
                      User: root
               Select_priv: Y
               Insert_priv: Y
               Update_priv: Y
               Delete_priv: Y
               Create_priv: Y
                 Drop_priv: Y
               Reload_priv: Y
             Shutdown_priv: Y
              Process_priv: Y
                 File_priv: Y
                Grant_priv: Y
           References_priv: Y
                Index_priv: Y
                Alter_priv: Y
              Show_db_priv: Y
                Super_priv: Y
     Create_tmp_table_priv: Y
          Lock_tables_priv: Y
              Execute_priv: Y
           Repl_slave_priv: Y
          Repl_client_priv: Y
          Create_view_priv: Y
            Show_view_priv: Y
       Create_routine_priv: Y
        Alter_routine_priv: Y
          Create_user_priv: Y
                Event_priv: Y
              Trigger_priv: Y
    Create_tablespace_priv: Y
                  ssl_type: 
                ssl_cipher: 
               x509_issuer: 
              x509_subject: 
             max_questions: 0
               max_updates: 0
           max_connections: 0
      max_user_connections: 0
                    plugin: mysql_native_password
     authentication_string: 
          password_expired: N
     password_last_changed: 2021-12-02 14:23:49
         password_lifetime: NULL
            account_locked: N
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    表字段含义如下。

    Host和User:官方称为范围字段,可以理解为这两个字段构成了允许访问的客户端范围,以及客户端可以访问的数据库资源范围(这里没有像db表那样的Db字段限制库范围,可以理解为整个实例范围的数据库)。

    • Host:代表允许用户从哪些主机访问数据库,可以用通配符和DNS。
    • User:用户名。

    权限字段:从Select_priv到Create_tablespace_priv之间的字段,官方称为权限字段。每一个字段对应一个具体的权限,值为Y代表有权限,值为N代表没有权限。

    以下字段官方称为安全配置字段,与客户端和服务端之间的安全、加密通信有关。

    • ssl_type:如果用户配置了使用加密SSL连接,则该字段记录用户使用的加密证书 类型。
    • ssl_cipher:表示用于SSL连接握手中可能使用到的密码列表。
    • x509_issuer:x509证书相关字段。
    • x509_subject:x509证书相关字段。
    • plugin:代表用户使用的密码认证插件名称。
    • authentication_string:表示用户密码的MD5加密字符串。
    • password_expired:表示用户密码是否过期,值为Y表示用户密码会过期,值为N 表示用户密码永不过期。
    • password_last_changed:表示用户密码的最近一次修改时间。如果使用MySQL内 建的认证插件(mysql_native_password或sha256_password),则该字段值为非空;如果使 用外部认证插件,则该字段值为空;当使用MySQL内建的认证插件时,该字段初始值为 CREATE USER、ALTER USER、SET PASSWORD、GRANT语句执行创建用户或者修改 密码时的时间。
    • password_lifetime:如果password_expired字段值为Y,则该字段记录用户剩余的密 码未过期天数;假设该字段值为N,则表示用户需要每N天修改一次密码。如果用户未单 独指定该值,则使用全局系统变量default_password_lifetime的值代替。当该字段值为 NULL且全局系统变量default_password_lifetime为0或者该字段值为0时,表示该用户的密 码永不过期。
    • account_locked:代表用户当前状态是锁定状态还是激活可用状态。

    以下字段官方称为资源控制字段,用于限制用户的一些访问资源。

    • max_questions:代表所有用户每小时的最大并发查询数。
    • max_updates:代表所有用户每小时的最大并发更新次数。
    • max_connections:代表所有用户每小时的最大并发连接数。
    • max_user_connections:代表该行记录中的用户每小时的最大并发连接数。

    db

    db表提供查询库级别的对象权限信息。该表中记录的权限信息代表用户是否可以使用 这些权限来访问被授予访问的数据库下的所有对象(表或存储程序)。 下面是该表中存储的信息内容。

    @localhost:[mysql]>select * from db limit 1\G
    *************************** 1. row ***************************
                     Host: localhost
                       Db: performance_schema
                     User: mysql.session
              Select_priv: Y
              Insert_priv: N
              Update_priv: N
              Delete_priv: N
              Create_priv: N
                Drop_priv: N
               Grant_priv: N
          References_priv: N
               Index_priv: N
               Alter_priv: N
    Create_tmp_table_priv: N
         Lock_tables_priv: N
         Create_view_priv: N
           Show_view_priv: N
      Create_routine_priv: N
       Alter_routine_priv: N
             Execute_priv: N
               Event_priv: N
             Trigger_priv: N
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    表字段含义如下。

    Host、Db、User:官方称为范围字段,可以理解为这三个字段构成了允许访问的客户端范围,以及客户端可以访问的数据库资源范围。

    • Host:与user表的Host字段含义相同。
    • Db:代表该用户权限记录属于哪个库级别范围。
    • User:与user表的User字段含义相同。

    xxx_priv:与user表的xxx_priv字段含义相同,每一个字段都对应相应的权限,值为Y代表有权限,值为N代表没有权限。与user表相比,少了Reload_priv、 Shutdown_priv、Process_priv、File_priv、Show_db_priv、Super_priv、Repl_slave_priv、Repl_client_priv、Create_user_priv、Create_tablespace_priv等字段,即代表这些字段对应的权限是全局范围的,不区分库表级别。

    tables_priv

    tables_priv表提供查询表级别的权限信息。与db表类似,但粒度更细,tables_priv表中记录的权限信息代表用户是否可以使用这些权限访问某个表中的所有字段。

    下面是该表中存储的信息内容。

    @localhost:[mysql]>select * from tables_priv limit 1\G
    *************************** 1. row ***************************
           Host: localhost
             Db: mysql
           User: mysql.session
     Table_name: user
        Grantor: boot@connecting host
      Timestamp: 0000-00-00 00:00:00
     Table_priv: Select
    Column_priv: 
    1 row in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    表字段含义如下。
    Host、Db、User、Table_name:官方称为范围字段,可以理解为这几个字段构成 了允许访问的客户端范围,以及客户端可以访问的表对象资源范围。

    Table_priv和Column_priv:官方称为权限字段,对应于表级别权限和字段级别权限。需要注意的是,这两个权限字段与user表和db表不同,它们是set类型的,记录着表级 别和字段级别的权限集合,而不是对应于具体的某个权限。Table_priv对应于表级别的 Select, Insert, Update, Delete, Create,Drop,Grant,References,Index,Alter,CreateView,Showview,Trigger权限,Column_priv对应于字段级别的Select,Insert,Update,References权限。

    Grantor:代表该表中记录的用户权限是被谁授予的,即该表中的用户权限被授予时的current_user函数返回的用户值(account形式)。

    Timestamp:代表授予Grantor表示的用户权限时的时间戳。

    columns_priv

    columns_priv表提供查询字段级别的权限信息。与db表类似,但粒度更细,columns_priv表中记录的权限信息代表用户可以使用这些权限来访问某个表的指定字段。

    下面是该表中存储的信息内容。

    ljc@localhost:[mysql]>show create table columns_priv \G
    *************************** 1. row ***************************
           Table: columns_priv
    Create Table: CREATE TABLE `columns_priv` (
      `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
      `Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
      `User` char(32) COLLATE utf8_bin NOT NULL DEFAULT '',
      `Table_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
      `Column_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
      `Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      `Column_priv` set('Select','Insert','Update','References') CHARACTER SET utf8 NOT NULL DEFAULT '',
      PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`,`Column_name`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Column privileges'
    1 row in set (0.00 sec)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    表字段含义如下。

    Host、Db、User、Table_name、Column_name:官方称为范围字段,可以理解为 这几个字段构成了允许访问的客户端范围,以及客户端可以访问的字段对象资源范围。

    Column_priv:官方称为权限字段,与tables_priv表中的Column_priv字段含义相 同,也是一个集合类型,对应于字段级别的Select, Insert,Update, References权限。

    Timestamp:与tables_priv表中的Timestamp字段含义相同。

    procs_priv

    procs_priv表提供查询存储程序(存储过程和函数)的权限信息。该表中记录的权限 信息代表用户是否可以使用这些权限来访问指定的存储程序。 表字段含义如下。

    Host、Db、User、Routine_name、Routine_type:官方称为范围字段,可以理解为 这几个字段构成了允许访问的客户端范围,以及客户端可以访问的存储对象资源。

    Proc_priv:官方称为权限字段,该权限字段也是一个集合类型,代表存储程序的 Execute, Alter Routine, Grant权限。

    Timestamp:与tables_priv表中的Timestamp字段含义相同。

    Grantor:与tables_priv表中的Grantor字段含义相同。

    提示:该表权限数据为空,目前还未找到向表中填充数据的方法。

    proxies_priv

    proxies_priv表提供查询代理用户的权限信息。该表中记录的权限信息代表用户可以充当哪些用户的代理,以及用户是否可以将Proxy权限授予其他用户。 如果一个用户需要将它的Proxy权限授予其他用户,那么该用户必须在该表中有一行权限信息,且With_grant字段值必须为1。

    下面是该表中存储的信息内容。

    @localhost:[mysql]>select * from proxies_priv \G
    *************************** 1. row ***************************
            Host: localhost
            User: root
    Proxied_host: 
    Proxied_user: 
      With_grant: 1
         Grantor: boot@connecting host
       Timestamp: 0000-00-00 00:00:00
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    表字段含义如下。

    • Host、User:这两个字段的含义与前面的权限表相同。

    • Proxied_host和Proxied_user:表示Proxy权限的来源account(被代理的用户)对应 的Host和User字符串。

    • 其他字段的含义和tables_priv表相同。

    注意:对于所有的权限表,一些字段有长度存储限制,具体如下。

    • Host,Proxied_host:长度限制为60个字符。

    User

    • Proxied_user:长度限制为32个字符。
    • authentication_string:长度限制为41个字符(注:在MySQL 5.6.x及之前的版本中该字段原名为 Password,从MySQL 5.7.x版本开始该字段变更为authentication_string,且使用mysql_native_password认证插件 时该字段长度限制为41个字节。从MySQL 8.0.x版本开始认证插件变更为caching_sha2_password,在使用该认 证插件时authentication_string字段长度限制为70个字节)。
    • Db:长度限制为64个字符。
    • Table_name:长度限制为64个字符。
    • Column_name:长度限制为64个字符。
    • Routine_name:长度限制为64个字符。
  • 相关阅读:
    PYTHON中的字符编码
    spring和springMVC整合父子容器问题:整合Spring时Service层为什么不做全局包扫描详解
    化合物修饰壳聚糖水凝胶:丙烯酸接枝/聚乙烯醇/温敏淫羊藿苷/醛-亚胺-壳聚糖水凝胶的制备
    Mysql8在Windows上离线安装时忘记root密码
    4年软件测试工作经验,跳槽之后面试20余家公司的总结
    LeetCode34 在排序数组中寻找元素的第一个和最后一个位置
    大模型产品化第一年​:战术、运营与战略
    【Hack The Box】windows练习-- Resolute
    删除 word 中嵌入文字下方的图片
    优秀工具|使用Reqable替换处理过的动态混淆js
  • 原文地址:https://blog.csdn.net/lijuncheng963375877/article/details/127985696