6.2.2 MySQL 提供的特权

授予 MySQL 帐户的特权确定该帐户可以执行的操作。 MySQL 特权在它们适用的上下文和不同的操作级别中有所不同:

  • Management 特权使用户可以 ManagementMySQL 服务器的操作。这些特权是全局的,因为它们不是特定于特定数据库的。

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

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

有关帐户特权的信息存储在mysql系统数据库的授权 table 中。有关这些 table 的结构和内容的描述,请参见第 6.2.3 节“授权 table”。 MySQL 服务器启动时将授权 table 的内容读取到内存中,并在第 6.2.9 节“特权更改何时生效”所示的情况下重新加载它们。服务器根据授予 table 的内存副本进行访问控制决策。

Important

一些 MySQL 版本对授予 table 进行了更改,以添加新的特权或功能。为了确保您可以利用所有新功能,每当升级 MySQL 时,将授权 table 更新为当前结构。参见第 2.11 节“升级 MySQL”

以下各节概述了可用的特权,提供了每个特权的更详细说明,并提供了使用准则。

可用权限摘要

下 table 显示了GRANTREVOKE语句中使用的特权名称,以及与授予 table 中每个特权关联的列名以及该特权所应用的上下文。

table6.2 GRANT 和 REVOKE 的允许特权

Privilege赠款 table 列Context
ALL [PRIVILEGES]“所有特权”的同义词Server administration
ALTERAlter_privTables
ALTER ROUTINEAlter_routine_privStored routines
CREATECreate_priv数据库,table 或索引
CREATE ROUTINECreate_routine_privStored routines
CREATE TABLESPACECreate_tablespace_privServer administration
创建临时 tableCreate_tmp_table_privTables
CREATE USERCreate_user_privServer administration
CREATE VIEWCreate_view_privViews
DELETEDelete_privTables
DROPDrop_priv数据库,table 或视图
EVENTEvent_privDatabases
EXECUTEExecute_privStored routines
FILEFile_priv服务器主机上的文件访问
GRANT OPTIONGrant_priv数据库,table 或存储的例程
INDEXIndex_privTables
INSERTInsert_privtable 或列
LOCK TABLESLock_tables_privDatabases
PROCESSProcess_privServer administration
PROXYproxies_privtableServer administration
REFERENCESReferences_priv数据库或 table
RELOADReload_privServer administration
REPLICATION CLIENTRepl_client_privServer administration
REPLICATION SLAVERepl_slave_privServer administration
SELECTSelect_privtable 或列
SHOW DATABASESShow_db_privServer administration
SHOW VIEWShow_view_privViews
SHUTDOWNShutdown_privServer administration
SUPERSuper_privServer administration
TRIGGERTrigger_privTables
UPDATEUpdate_privtable 或列
USAGE“没有特权”的同义词Server administration

Privilege Descriptions

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

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

启用使用ALTER TABLE语句来更改 table 的结构。 ALTER TABLE还需要CREATEINSERT特权。重命名 table 需要在旧 table 上使用ALTERDROP,在新 table 上使用CREATEINSERT

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

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

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

启用对创建,更改或删除 table 空间和日志文件组的语句的使用。

启用使用创建临时 table语句创建临时 table。

会话创建临时 table 后,服务器将不再对该 table 执行任何特权检查。创建会话可以对 table 执行任何操作,例如DROP TABLEINSERTUPDATESELECT。有关更多信息,请参见第 13.1.18.2 节“ CREATE TEMPORARY TABLE 语句”

启用对ALTER USERCREATE USERDROP USERRENAME USER撤销所有特权语句的使用。

启用使用CREATE VIEW语句。

使行可以从数据库的 table 中删除。

支持使用删除(删除)现有数据库,table 和视图的语句。在分区 table 上使用ALTER TABLE ... DROP PARTITION语句需要DROP特权。 TRUNCATE TABLE也需要DROP特权。

支持使用为事件计划程序创建,更改,删除或显示事件的语句。

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

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

  • 启用使用LOAD DATA选择...进入外档语句以及LOAD_FILE()函数在服务器主机上读写文件。具有FILE特权的用户可以读取服务器主机上世界上可读的或 MySQL 服务器可读取的任何文件。 (这意味着用户可以读取任何数据库目录中的任何文件,因为服务器可以访问任何这些文件.)

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

    • 从 MySQL 5.7.17 开始,允许对CREATE TABLE语句使用DATA DIRECTORYINDEX DIRECTORY table 选项。

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

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

使您可以授予自己拥有的特权或从其他用户撤消这些特权。

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

允许将行插入数据库的 table 中。 ANALYZE TABLEOPTIMIZE TABLEREPAIR TABLEtable 维护语句也需要INSERT

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

PROCESS特权控制对服务器中正在执行的线程的信息(即,有关会话正在执行的语句的信息)的访问。可以通过以下方式访问使用SHOW PROCESSLIST语句,mysqladmin processlist命令和INFORMATION_SCHEMA.PROCESSLISTtable 可用的线程信息:

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

    • 没有PROCESS特权,非匿名用户只能访问有关其自己线程的信息,而其他用户则不能访问线程,并且匿名用户不能访问线程信息。

Note

Performance Schema threadstable 还提供线程信息,但 table 访问使用不同的特权模型。参见第 25.12.16.3 节“线程 table”

PROCESS特权还允许使用SHOW ENGINE语句,访问INFORMATION_SCHEMA InnoDBtable(名称以INNODB_开头的 table),以及(从 MySQL 5.7.31 开始)访问INFORMATION_SCHEMA FILEStable。

使一个用户可以模拟或成为另一用户。参见第 6.2.14 节“代理用户”

创建外键约束要求父 table 具有REFERENCES特权。

启用使用FLUSH语句。它还启用与FLUSH操作等效的mysqladmin命令:flush-hostsflush-logsflush-privilegesflush-statusflush-tablesflush-threadsrefreshreload

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

RELOAD特权还允许使用RESET MASTERRESET SLAVE语句。

启用对显示主状态显示从站状态显示二进制日志语句的使用。将此特权授予从属服务器用来作为主服务器连接到当前服务器的帐户。

使帐户能够使用显示从主机显示中继事件显示 BINLOG 事件语句请求对主服务器上的数据库进行的更新。使用mysqlbinlog选项--read-from-remote-server(-R)和--read-from-remote-master也是必需的。将此特权授予从属服务器用来作为主服务器连接到当前服务器的帐户。

允许从数据库的 table 中选择行。 SELECT语句仅在实际访问 table 时才需要SELECT特权。某些SELECT语句不访问 table,并且可以在未经任何数据库许可的情况下执行。例如,您可以使用SELECT作为简单的计算器来评估不引用 table 的 table 达式:

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

其他读取列值的语句也需要SELECT特权。例如,对于UPDATE语句中* col_name * = * expr *赋值的右侧引用的列或DELETEUPDATE语句的WHERE子句中命名的列,需要SELECT

EXPLAIN一起使用的 table 或视图(包括视图定义中的所有基础 table)需要SELECT特权。

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

Caution

因为全局特权被视为所有数据库的特权,所以* any *全局特权使用户可以使用SHOW DATABASES或通过检查INFORMATION_SCHEMA SCHEMATAtable 来查看所有数据库名称。

启用使用显示创建视图语句。与EXPLAIN一起使用的视图也需要此特权。

启用SHUTDOWN语句,mysqladmin shutdown命令和mysql_shutdown() C API 函数的使用。

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

  • 通过修改全局系统变量来启用服务器配置更改。对于某些系统变量,设置会话值也需要SUPER特权。如果系统变量是受限制的,并且需要特殊特权来设置会话值,则变量描述将指示该限制。示例包括binlog_formatsql_log_binsql_log_off。另请参见第 5.1.8.1 节“系统变量特权”

  • 启用使用KILL语句或mysqladmin kill命令杀死属于其他帐户的线程。 (帐户始终可以杀死自己的线程.)

    • SUPER个 Client 端连接时,服务器不执行init_connect个系统变量内容。

    • 即使达到了max_connections系统变量配置的连接限制,服务器也会接受来自SUPERClient 端的一个连接。

    • 处于脱机模式(启用offline_mode)的服务器不会在下一个 Client 端请求时终止SUPERClient 端连接,而是接受来自SUPERClient 端的新连接。

    • 即使启用了read_only系统变量,也可以执行更新。这适用于显式 table 更新,以及用于隐式更新 table 的GRANTREVOKE之类的帐户 Management 语句。

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

启用触发器操作。您必须具有此特权才能使 table 创建,删除,执行或显示该 table 的触发器。

激活触发器后(由有权执行与触发器关联的 table 的INSERTUPDATEDELETE语句的用户),触发器的执行要求定义触发器的用户仍对该 table 具有TRIGGER特权。

使行可以在数据库的 table 中更新。

该特权说明符代 table“无特权”。在GRANT全局级别使用它来修改帐户属性,例如资源限制或 SSLFeature,而无需在特权列 table 中命名特定的帐户特权。 SHOW GRANTS显示USAGEtable 示帐户在特权级别没有特权。

Privilege-Granting Guidelines

最好仅向帐户授予所需的特权。在授予FILE和 Management 特权时,应格外小心:

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

  • GRANT OPTION使用户可以将其特权授予其他用户。具有不同特权并具有GRANT OPTION特权的两个用户可以组合特权。

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

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

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

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

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

  • 密码以加密方式存储,因此恶意用户无法简单地阅读它们以了解纯文本密码。但是,对mysql.user系统 tableauthentication_string列具有写访问权的用户可以更改帐户的密码,然后使用该帐户连接到 MySQL 服务器。

    • mysql系统数据库授予的INSERTUPDATE使用户可以分别添加特权或修改现有特权。

    • DROP用于mysql系统数据库,使用户可以远程特权 table,甚至数据库本身。