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 显示了GRANT和REVOKE语句中使用的特权名称,以及与授予 table 中每个特权关联的列名以及该特权所应用的上下文。
table6.2 GRANT 和 REVOKE 的允许特权
Privilege | 赠款 table 列 | Context |
---|---|---|
ALL [PRIVILEGES] | “所有特权”的同义词 | Server administration |
ALTER | Alter_priv | Tables |
ALTER ROUTINE | Alter_routine_priv | Stored routines |
CREATE | Create_priv | 数据库,table 或索引 |
CREATE ROUTINE | Create_routine_priv | Stored routines |
CREATE TABLESPACE | Create_tablespace_priv | Server administration |
创建临时 table | Create_tmp_table_priv | Tables |
CREATE USER | Create_user_priv | Server administration |
CREATE VIEW | Create_view_priv | Views |
DELETE | Delete_priv | Tables |
DROP | Drop_priv | 数据库,table 或视图 |
EVENT | Event_priv | Databases |
EXECUTE | Execute_priv | Stored routines |
FILE | File_priv | 服务器主机上的文件访问 |
GRANT OPTION | Grant_priv | 数据库,table 或存储的例程 |
INDEX | Index_priv | Tables |
INSERT | Insert_priv | table 或列 |
LOCK TABLES | Lock_tables_priv | Databases |
PROCESS | Process_priv | Server administration |
PROXY | 见proxies_priv table | Server administration |
REFERENCES | References_priv | 数据库或 table |
RELOAD | Reload_priv | Server administration |
REPLICATION CLIENT | Repl_client_priv | Server administration |
REPLICATION SLAVE | Repl_slave_priv | Server administration |
SELECT | Select_priv | table 或列 |
SHOW DATABASES | Show_db_priv | Server administration |
SHOW VIEW | Show_view_priv | Views |
SHUTDOWN | Shutdown_priv | Server administration |
SUPER | Super_priv | Server administration |
TRIGGER | Trigger_priv | Tables |
UPDATE | Update_priv | table 或列 |
USAGE | “没有特权”的同义词 | Server administration |
Privilege Descriptions
以下列 table 提供了 MySQL 中可用的每个特权的一般说明。特定的 SQL 语句可能具有比此处指示的更具体的特权要求。如果是这样,则有关语句的描述将提供详细信息。
这些特权说明符是“在给定特权级别可用的所有特权”(GRANT OPTION除外)的简写。例如,在全局或 table 级别授予ALL分别授予所有全局特权或所有 table 级别特权。
启用使用ALTER TABLE语句来更改 table 的结构。 ALTER TABLE还需要CREATE和INSERT特权。重命名 table 需要在旧 table 上使用ALTER和DROP,在新 table 上使用CREATE和INSERT。
支持使用更改或删除存储例程(存储过程和函数)的语句。
允许使用创建新数据库和 table 的语句。
允许使用创建存储例程(存储过程和函数)的语句。
启用对创建,更改或删除 table 空间和日志文件组的语句的使用。
启用使用创建临时 table语句创建临时 table。
会话创建临时 table 后,服务器将不再对该 table 执行任何特权检查。创建会话可以对 table 执行任何操作,例如DROP TABLE,INSERT,UPDATE或SELECT。有关更多信息,请参见第 13.1.18.2 节“ CREATE TEMPORARY TABLE 语句”。
启用对ALTER USER,CREATE USER,DROP USER,RENAME 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 DIRECTORY
或INDEX DIRECTORY
table 选项。
-
作为安全措施,服务器不会覆盖现有文件。
要限制文件的读写位置,请将secure_file_priv系统变量设置为特定目录。参见第 5.1.7 节“服务器系统变量”。
使您可以授予自己拥有的特权或从其他用户撤消这些特权。
允许使用创建或删除(删除)索引的语句。 INDEX适用于现有 table。如果您具有 table 的CREATE特权,则可以在CREATE TABLE语句中包括索引定义。
允许将行插入数据库的 table 中。 ANALYZE TABLE,OPTIMIZE TABLE和REPAIR 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
InnoDB
table(名称以INNODB_
开头的 table),以及(从 MySQL 5.7.31 开始)访问INFORMATION_SCHEMA
FILEStable。
使一个用户可以模拟或成为另一用户。参见第 6.2.14 节“代理用户”。
创建外键约束要求父 table 具有REFERENCES特权。
启用使用FLUSH语句。它还启用与FLUSH操作等效的mysqladmin命令:flush-hosts
,flush-logs
,flush-privileges
,flush-status
,flush-tables
,flush-threads
,refresh
和reload
。
reload
命令告诉服务器将授权 table 重新加载到内存中。 flush-privileges
是reload
的同义词。 refresh
命令关闭并重新打开日志文件,并刷新所有 table。其他flush-xxx
命令执行的功能类似于refresh
,但更具体,在某些情况下可能更可取。例如,如果只想刷新日志文件,则flush-logs
比refresh
更好。
RELOAD特权还允许使用RESET MASTER和RESET 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
*赋值的右侧引用的列或DELETE或UPDATE语句的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_format,sql_log_bin和sql_log_off。另请参见第 5.1.8.1 节“系统变量特权”。
-
启用对全局事务 Feature 的更改(请参阅第 13.3.6 节“ SET TRANSACTION 语句”)。
-
使帐户能够启动和停止复制,包括组复制。
-
在执行视图或存储程序时启用设置有效授权 ID。具有此特权的用户可以在视图或存储的程序的
DEFINER
属性中指定任何帐户。 -
启用对CREATE SERVER,ALTER SERVER和DROP SERVER语句的使用。
-
启用mysqladmin debug命令的使用。
-
启用
InnoDB
加密密钥旋转。 -
启用通过DES_ENCRYPT()功能读取 DES 密钥文件。
-
启用执行版本令牌用户定义的功能。
-
启用对非SUPER帐户不允许的 Client 端连接的控制:
-
-
启用使用KILL语句或mysqladmin kill命令杀死属于其他帐户的线程。 (帐户始终可以杀死自己的线程.)
-
当SUPER个 Client 端连接时,服务器不执行init_connect个系统变量内容。
-
即使达到了max_connections系统变量配置的连接限制,服务器也会接受来自SUPERClient 端的一个连接。
-
处于脱机模式(启用offline_mode)的服务器不会在下一个 Client 端请求时终止SUPERClient 端连接,而是接受来自SUPERClient 端的新连接。
-
即使启用了read_only系统变量,也可以执行更新。这适用于显式 table 更新,以及用于隐式更新 table 的GRANT和REVOKE之类的帐户 Management 语句。
-
如果启用了二进制日志记录,则您可能还需要SUPER特权才能创建或更改存储的功能,如第 23.7 节“存储的程序二进制日志”中所述。
启用触发器操作。您必须具有此特权才能使 table 创建,删除,执行或显示该 table 的触发器。
激活触发器后(由有权执行与触发器关联的 table 的INSERT,UPDATE或DELETE语句的用户),触发器的执行要求定义触发器的用户仍对该 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 服务器。