Documentation Home
MySQL 8.0 参考手册  / 第 6 章 安全  / 6.2 访问控制和账户管理  /  6.2.2 MySQL提供的权限

6.2.2 MySQL提供的权限

授予 MySQL 帐户的权限决定了该帐户可以执行哪些操作。MySQL 特权在它们应用的上下文和不同的操作级别上有所不同:

  • 管理权限使用户能够管理 MySQL 服务器的操作。这些权限是全局的,因为它们不特定于特定的数据库。

  • 数据库权限适用于数据库及其中的所有对象。可以为特定数据库或全局授予这些权限,以便它们适用于所有数据库。

  • 可以为数据库中的特定对象、数据库中给定类型的所有对象(例如,数据库中的所有表)或全局为所有对象授予表、索引、视图和存储例程等数据库对象的权限所有数据库中给定类型的对象。

有关帐户权限的信息存储在mysql系统数据库的授权表中。有关这些表的结构和内容的说明,请参阅 第 6.2.3 节,“授权表”。MySQL 服务器在启动时将授权表的内容读入内存,并在 第 6.2.9 节“权限更改生效时”中指示的情况下重新加载它们。服务器根据授权表的内存副本做出访问控制决策。

重要的

一些 MySQL 版本引入了对授权表的更改以添加新的权限或功能。为确保您可以利用任何新功能,请在升级 MySQL 时将授权表更新为当前结构。请参阅 第 2.11 节,“升级 MySQL”

以下部分总结了可用的权限,提供了每个权限的更详细描述,并提供了使用指南。

可用权限摘要

下表显示了在 GRANTREVOKE语句中使用的特权名称,以及与授权表中每个特权相关联的列名以及特权适用的上下文。

表 6.2 GRANT 和 REVOKE 允许的权限

特权 授予表列 语境
ALL [PRIVILEGES] 所有特权的同义词 服务器管理
ALTER Alter_priv
ALTER ROUTINE Alter_routine_priv 存储例程
CREATE Create_priv 数据库、表或索引
CREATE ROUTINE Create_routine_priv 存储例程
CREATE TABLESPACE Create_tablespace_priv 服务器管理
CREATE TEMPORARY TABLES Create_tmp_table_priv
CREATE USER Create_user_priv 服务器管理
CREATE VIEW Create_view_priv 观点
DELETE Delete_priv
DROP Drop_priv 数据库、表或视图
EVENT Event_priv 数据库
EXECUTE Execute_priv 存储例程
FILE File_priv 服务器主机上的文件访问
GRANT OPTION Grant_priv 数据库、表或存储例程
INDEX Index_priv
INSERT Insert_priv 表或列
LOCK TABLES Lock_tables_priv 数据库
PROCESS Process_priv 服务器管理
PROXY 见表proxies_priv_ 服务器管理
REFERENCES References_priv 数据库或表
RELOAD Reload_priv 服务器管理
REPLICATION CLIENT Repl_client_priv 服务器管理
REPLICATION SLAVE Repl_slave_priv 服务器管理
SELECT Select_priv 表或列
SHOW DATABASES Show_db_priv 服务器管理
SHOW VIEW Show_view_priv 观点
SHUTDOWN Shutdown_priv 服务器管理
SUPER Super_priv 服务器管理
TRIGGER Trigger_priv
UPDATE Update_priv 表或列
USAGE 无特权的同义词 服务器管理

权限说明

以下列表提供了 MySQL 中可用的每个权限的一般描述。特定的 SQL 语句可能具有比此处指示的更具体的权限要求。如果是这样,相关陈述的描述会提供详细信息。

  • ALL, ALL PRIVILEGES

    这些权限说明符是在给定权限级别可用的所有权限 (除了GRANT OPTION)的简写。例如,ALL在全局或表级授予分别授予所有全局权限或所有表级权限。

  • ALTER

    允许使用ALTER TABLE语句来更改表的结构。 ALTER TABLE还需要 CREATEINSERT特权。重命名表需要在旧表上 和 ALTER在 新表上。 DROPCREATEINSERT

  • ALTER ROUTINE

    允许使用更改或删除存储例程(存储过程和函数)的语句。

  • CREATE

    允许使用创建新数据库和表的语句。

  • CREATE ROUTINE

    允许使用创建存储例程(存储过程和函数)的语句。

  • CREATE TABLESPACE

    允许使用创建、更改或删除表空间和日志文件组的语句。

  • CREATE TEMPORARY TABLES

    允许使用 CREATE TEMPORARY TABLE 语句创建临时表。

    会话创建临时表后,服务器不会对该表执行进一步的权限检查。创建会话可以对表执行任何操作,例如DROP TABLEINSERTUPDATESELECT。有关详细信息,请参阅第 13.1.18.2 节,“CREATE TEMPORARY TABLE 语句”

  • CREATE USER

    允许使用ALTER USERCREATE USERDROP USERRENAME USERREVOKE ALL PRIVILEGES语句。

  • CREATE VIEW

    允许使用CREATE VIEW语句。

  • DELETE

    允许从数据库中的表中删除行。

  • DROP

    允许使用删除(删除)现有数据库、表和视图的语句。 在分区表上使用该语句需要 DROP特权。权限也是必需ALTER TABLE ... DROP PARTITION的 。 DROPTRUNCATE TABLE

  • EVENT

    允许使用为事件计划程序创建、更改、删​​除或显示事件的语句。

  • EXECUTE

    允许使用执行存储例程(存储过程和函数)的语句。

  • FILE

    影响以下操作和服务器行为:

    • LOAD DATA使用and SELECT ... INTO OUTFILE语句和 LOAD_FILE()函数 在服务器主机上启用读写文件。具有FILE 权限的用户可以读取服务器主机上任何全局可读或 MySQL 服务器可读的文件。(这意味着用户可以读取任何数据库目录中的任何文件,因为服务器可以访问这些文件中的任何一个。)

    • 允许在 MySQL 服务器具有写访问权限的任何目录中创建新文件。这包括服务器的数据目录,其中包含实现权限表的文件。

    • 从 MySQL 5.7.17 开始,允许对语句 使用DATA DIRECTORYor INDEX DIRECTORYtable 选项 。CREATE TABLE

    作为一项安全措施,服务器不会覆盖现有文件。

    要限制可以读写文件的位置,请将 secure_file_priv系统变量设置为特定目录。请参阅 第 5.1.7 节,“服务器系统变量”

  • GRANT OPTION

    使您能够向其他用户授予或撤销您自己拥有的那些特权。

  • INDEX

    允许使用创建或删除(删除)索引的语句。INDEX适用于现有表。如果您有表的 权限,则可以在语句 CREATE中包含索引定义 。CREATE TABLE

  • INSERT

    允许将行插入到数据库中的表中。 、 和 表维护语句 INSERT也需要。ANALYZE TABLEOPTIMIZE TABLEREPAIR TABLE

  • LOCK TABLES

    允许使用显式LOCK TABLES语句来锁定您有SELECT权限的表。这包括使用写锁,防止其他会话读取锁定的表。

  • PROCESS

    特权控制对有关服务器内执行的线程的信息的PROCESS访问(即有关会话正在执行的语句的信息)。SHOW PROCESSLIST 使用语句、mysqladmin processlist 命令、 INFORMATION_SCHEMA.PROCESSLIST 表和 Performance Schema 表可用的线程信息可按processlist如下方式访问:

    • 有了PROCESS 特权,用户就可以访问有关所有线程的信息,甚至是属于其他用户的线程。

    • 如果没有PROCESS 特权,非匿名用户可以访问有关他们自己的线程的信息,但不能访问其他用户的线程,而匿名用户则无法访问线程信息。

    笔记

    Performance Schema threads表也提供线程信息,但表访问使用不同的权限模型。请参阅 第 25.12.16.4 节,“线程表”

    PROCESS权限还允许使用SHOW ENGINE语句、访问 INFORMATION_SCHEMA InnoDB表(名称以 开头的表INNODB_)和(从 MySQL 5.7.31 开始)访问INFORMATION_SCHEMA FILES表。

  • PROXY

    使一个用户能够冒充或成为另一个用户。请参阅第 6.2.14 节,“代理用户”

  • REFERENCES

    创建外键约束需要 REFERENCES父表的权限。

  • RELOAD

    RELOAD启用以下操作 :

    • FLUSH 语句 的使用。

    • 使用等效 于 操作的 mysqladmin命令: 、、、、、、、、 和 。 _ FLUSHflush-hostsflush-logsflush-privilegesflush-statusflush-tablesflush-threadsrefreshreload

      reload命令告诉服务器将授权表重新加载到内存中。 flush-privileges是的同义词 reload。该 refresh命令关闭并重新打开日志文件并刷新所有表。其他 命令执行的功能类似于 ,但更具体,在某些情况下可能更可取。例如,如果您只想刷新日志文件, 是比 . flush-xxxrefreshflush-logsrefresh

    • 使用执行各种操作 的mysqldump选项:和 . FLUSH--flush-logs--master-data

    • RESET 语句 的使用。

  • REPLICATION CLIENT

    允许使用SHOW MASTER STATUSSHOW SLAVE STATUSSHOW BINARY LOGS语句。

  • REPLICATION SLAVE

    使帐户能够使用 、 和 语句请求对源服务器上的数据库进行 SHOW SLAVE HOSTSSHOW RELAYLOG EVENTS更新 SHOW BINLOG EVENTS 。使用 mysqlbinlog选项 --read-from-remote-server ( -R) 和 --read-from-remote-master. 将此权限授予副本服务器用于连接到作为其源的当前服务器的帐户。

  • SELECT

    允许从数据库中的表中选择行。 SELECT语句 SELECT只有在实际访问表时才需要特权。有些 SELECT语句不访问表,可以在没有任何数据库权限的情况下执行。例如,您可以 SELECT用作一个简单的计算器来计算不引用表格的表达式:

    SELECT 1+1;
    SELECT PI()*2;

    SELECT其他读取列值的语句也需要 该权限。例如,在语句中= 赋值SELECT右侧引用的 列或在or 语句的子句中 命名的列需要 。 col_nameexprUPDATEWHEREDELETEUPDATE

    SELECT与 一起使用的表或视图需要 该权限EXPLAIN,包括视图定义中的任何基础表。

  • SHOW DATABASES

    SHOW DATABASE通过发出语句 使帐户能够查看数据库名称 。没有此权限的帐户只能看到他们有一些权限的数据库,并且如果服务器是使用该 --skip-show-database选项启动的,则根本无法使用该语句。

    警告

    因为全局权限被认为是所有数据库的权限,所以任何全局权限都使用户能够 通过检查表SHOW DATABASES或通过检查INFORMATION_SCHEMA SCHEMATA表来查看所有数据库名称。

  • SHOW VIEW

    允许使用SHOW CREATE VIEW语句。与 一起使用的视图也需要此权限EXPLAIN

  • SHUTDOWN

    允许使用SHUTDOWN 语句、mysqladmin shutdown 命令和 mysql_shutdown()C API 函数。

  • SUPER

    影响以下操作和服务器行为:

    如果启用二进制日志记录,您可能还需要SUPER 创建或更改存储函数的权限,如 第 23.7 节“存储程序二进制日志记录”中所述。

  • TRIGGER

    启用触发操作。您必须对表具有此权限才能为该表创建、删除、执行或显示触发器。

    当触发器被激活时(由有权对与触发器关联的表执行INSERTUPDATEDELETE语句的用户激活),触发器执行要求定义触发器的用户仍然具有该TRIGGER表的权限。

  • UPDATE

    允许在数据库的表中更新行。

  • USAGE

    此特权说明符代表无特权”。它在全局级别 GRANT用于修改帐户属性,例如资源限制或 SSL 特性,而无需在权限列表中命名特定帐户权限。SHOW GRANTS显示 USAGE以指示帐户在特权级别上没有特权。

特权授予准则

只授予帐户所需的权限是个好主意。FILE在授予和管理权限 时,您应该特别小心:

  • FILE可以滥用将 MySQL 服务器可以在服务器主机上读取的任何文件读入数据库表。这包括所有世界可读的文件和服务器数据目录中的文件。然后可以访问该表 SELECT以将其内容传输到客户端主机。

  • GRANT OPTION使用户能够将他们的特权授予其他用户。具有不同权限和具有GRANT OPTION权限的两个用户能够合并权限。

  • ALTER可用于通过重命名表来颠覆特权系统。

  • SHUTDOWN可以被滥用以通过终止服务器来完全拒绝为其他用户提供服务。

  • PROCESS可用于查看当前正在执行的语句的纯文本,包括设置或更改密码的语句。

  • SUPER可用于终止其他会话或更改服务器的操作方式。

  • 为系统数据库本身授予的权限mysql可用于更改密码和其他访问权限信息:

    • 密码是加密存储的,因此恶意用户无法简单地阅读它们来获知明文密码。mysql.user但是,对系统表 列具有写入权限的用户 authentication_string可以更改帐户的密码,然后使用该帐户连接到 MySQL 服务器。

    • INSERTUPDATE授予 mysql系统数据库使用户能够分别添加权限或修改现有权限。

    • DROP对于 mysql系统数据库,用户可以远程访问权限表,甚至是数据库本身。