MySQL将账户存储在mysql
系统数据库中的user
表中。
账户还可能具有身份验证凭据,例如密码。凭据由帐户身份验证插件处理,MySQL支持多种认证插件。其中一些使用内部认证方法,而另一些使用外部认证方法来启用认证。更多信息请查看 Pluggable Authentication.
MySQL用户和密码的使用与操作系统用户和密码的使用有几个区别:
用于MySQL身份认证的账户与登录Windows或者Unix系统的用户名无关。在 Unix 上,默认情况下,大多数 MySQL 客户端尝试使用当前 Unix 用户名作为 MySQL 用户名登录,但这只是为了方便起见。可以很容易的重写默认值,因为客户端程序允许使用-u
或者--user
选项指定登录MySQL的用户名。这就意味着任何人使用任何用户名去登录MySQL。除非没个MySQL用户名都有密码,否则安全不能保证数据库的安全。
MySQL用户名支持的最大长度为32
个字符。但是不同的操作系统的用户名的长度是不同的。
对于使用内置验证方法的账户验证客户端连接,通常MySQL会使用存储在user
表中的密码。这些密码与你登录操作系统的密码是不同的。用于登录 Windows 或 Unix 机器的密码与用于访问该机器上 MySQL的密码之间没有必要的联系。
如果MySQL使用其他插件对客户端进行认证。则插件实现的身份验证方法可能会或可能不会使用存储在用户表中的密码。
存储在user
表中的密码是通过插件的指定算法进行加密的。
如果用户名和密码只包含 ASCII
字符,则无论字符集设置如何,都可以连接到服务器。当用户名和密码包含非ASCII
字符的时候,如果要启用连接,客户端应用程序应该使用MYSQL_SET_CHARSET_NAME
选项和适当的字符集作为参数来调用C API的mysql_options()
函数 。这会导致使用指定的字符集进行身份验证。否则,除非服务器默认字符集与认证的编码相同,否则认证将失败。
标准 MySQL 客户端程序支持 --default-character-set
选项,该选项会导致 mysql_options()
像刚才描述的那样被调用
MySQL 安装过程中使用初始 root
帐户填充授权表,如Securing the Initial MySQL Account中所述,其中还讨论了如何为其分配密码。此后,您通常会使用 CREATE USER、DROP USER、GRANT
和 REVOKE
等语句来设置、修改和删除 MySQL 帐户。请查看 Adding Accounts, Assigning Privileges, and Dropping Accounts和Account Management Statements。
要使用命令行客户端连接到 MySQL 服务器,请根据需要指定用户名和密码选:
shell> mysql --user=finley --password db_name
如果您更喜欢简短的选项,则命令如下所示:
shell> mysql -u finley -p db_name
如果您省略命令行上 --password
或 -p
选项后面的密码值(如所示),客户端会提示输入一个密码。或者,可以在命令行上指定密码:
shell> mysql --user=finley --password=password db_name
shell> mysql -u finley -ppassword db_name
如果使用 -p
选项,则 -p
和密码值之间不能有空格。
授予 MySQL 帐户的权限决定了该帐户可以执行的操作。 MySQL 权限在它们应用的上下文和不同级别的操作中有所不同:
权限分为静态权限(内置在服务器中的)和动态权限(在运行时定义),这两种有所不同。权限是静态的还是动态的会影响帐户和角色的可用性。
有关账户权限的信息存储在mysql
系统数据库中的权限表中。MySQL服务器在启动时将权限表的内容读入内存中,MySQL 服务器在启动时将授权表的内容读取到内存中,并在When Privilege Changes Take Effect所示的情况下重新加载它们。MySQL服务器根据权限表的内存副本做出访问控制决策。
以下部分总结了可用权限,并提供每个权限的更详细说明,并提供使用指南。
SUPER
权限迁移到动态权限下表显示了GRANT
和REVOKE
语句中使用的静态特权名称,以及与权限表中每个权限相关联的列名和应用特权的上下文。
GRANT
和 REVOKE
允许的静态权限
Table 6.2 Permissible Static Privileges for GRANT and REVOKE
Privilege | Grant Table Column | Context |
---|---|---|
ALL [PRIVILEGES] | Synonym for “all privileges” | Server administration |
ALTER | Alter_priv | Tables |
ALTER ROUTINE | Alter_routine_priv | Stored routines |
CREATE | Create_priv | Databases, tables, or indexes |
CREATE ROLE | Create_role_priv | Server administration |
CREATE ROUTINE | Create_routine_priv | Stored routines |
CREATE TABLESPACE | Create_tablespace_priv | Server administration |
CREATE TEMPORARY TABLES | 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 | Databases, tables, or views |
DROP ROLE | Drop_role_priv | Server administration |
EVENT | Event_priv | Databases |
EXECUTE | Execute_priv | Stored routines |
FILE | File_priv | File access on server host |
GRANT OPTION | Grant_priv | Databases, tables, or stored routines |
INDEX | Index_priv | Tables |
INSERT | Insert_priv | Tables or columns |
LOCK TABLES | Lock_tables_priv | Databases |
PROCESS | Process_priv | Server administration |
PROXY | See proxies_priv table | Server administration |
REFERENCES | References_priv | Databases or tables |
RELOAD | Reload_priv | Server administration |
REPLICATION CLIENT | Repl_client_priv | Server administration |
REPLICATION SLAVE | Repl_slave_priv | Server administration |
SELECT | Select_priv | Tables or columns |
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 | Tables or columns |
USAGE | Synonym for “no privileges” | Server administration |
下表显示了GRANT
和REVOKE
语句中使用的动态特权名称,以及应用特权的上下文。
Privilege | Context |
---|---|
APPLICATION_PASSWORD_ADMIN | Dual password administration |
AUDIT_ADMIN | Audit log administration |
BACKUP_ADMIN | Backup administration |
BINLOG_ADMIN | Backup and Replication administration |
BINLOG_ENCRYPTION_ADMIN | Backup and Replication administration |
CLONE_ADMIN | Clone administration |
CONNECTION_ADMIN | Server administration |
ENCRYPTION_KEY_ADMIN | Server administration |
FIREWALL_ADMIN | Firewall administration |
FIREWALL_EXEMPT | Firewall administration |
FIREWALL_USER | Firewall administration |
FLUSH_OPTIMIZER_COSTS | Server administration |
FLUSH_STATUS | Server administration |
FLUSH_TABLES | Server administration |
FLUSH_USER_RESOURCES | Server administration |
GROUP_REPLICATION_ADMIN | Replication administration |
INNODB_REDO_LOG_ARCHIVE | Redo log archiving administration |
NDB_STORED_USER | NDB Cluster |
PERSIST_RO_VARIABLES_ADMIN | Server administration |
REPLICATION_APPLIER | PRIVILEGE_CHECKS_USER for a replication channel |
REPLICATION_SLAVE_ADMIN | Replication administration |
RESOURCE_GROUP_ADMIN | Resource group administration |
RESOURCE_GROUP_USER | Resource group administration |
ROLE_ADMIN | Server administration |
SESSION_VARIABLES_ADMIN | Server administration |
SET_USER_ID | Server administration |
SHOW_ROUTINE | Server administration |
SYSTEM_USER | Server administration |
SYSTEM_VARIABLES_ADMIN | Server administration |
TABLE_ENCRYPTION_ADMIN | Server administration |
VERSION_TOKEN_ADMIN | Server administration |
XA_RECOVER_ADMIN | Server administration |
与在运行时定义的动态权限相反,静态权限内置于服务器中,以下列表描述了 MySQL 中可用的每个静态权限。
ALL, ALL PRIVILEGES
:这两个权限说明符是“授予特权级别上可用的所有权限”(GRANT
选项除外)的缩写。例如,在全局或表级别授予 ALL
权限,那么会分别授予所有全局权限或所有表级别权限。
ALTER
:允许使用ALTER TABLE
语句来改变表的结构。ALTER TABLE
还需要 CREATE
和 INSERT
权限。重命名表需要对旧表执行 ALTER
和 DROP
,对新表执行 CREATE
和 INSERT
。
ALTER ROUTINE
:允许使用更改或删除存储过程(存储过程和函数)的语句。
CREATE
:允许使用创建语句来创建数据库和表。
CREATE ROLE
:允许使用create role
语句(具有CREATE USER
权限还允许使用 CREATE ROLE
语句)。CREATE ROLE
和 DROP ROLE
权限不如 CREATE USER
强大,因为它们只能用于创建和删除帐户
CREATE ROUTINE
:允许使用创建存储例程(存储过程和函数)语句。
CREATE TABLESPACE
:允许使用创建、更改或删除表空间和日志文件组的语句。
CREATE TEMPORARY TABLES
:允许使用 CREATE TEMPORARY TABLE
语句创建临时表。会话创建临时表后,服务器不再对该表执行进一步的权限检查。会话可以对表执行任何操作,例如 DROP TABLE、INSERT、UPDATE
或 SELECT
。
CREATE USER
:允许使用 ALTER USER、CREATE ROLE、CREATE USER、DROP ROLE、DROP USER、RENAME USER
和 REVOKE ALL PRIVILEGES
语句。
CREATE VIEW
:允许使用 CREATE VIEW
语句。
DELETE
:允许从数据库中的表中删除行。
DROP
:允许使用删除(移除)现有数据库、表和视图的语句。在分区表上使用 ALTER TABLE ... DROP PARTITION
语句需要 DROP
权限。 TRUNCATE TABLE
也需要 DROP
权限。
DROP ROLE
:允许使用 DROP ROLE
语句。 (CREATE USER
权限还允许使用 DROP ROLE
语句)
EVENT
:允许使用为事件调度程序创建、更改、删除或显示事件的语句。
EXECUTE
:允许使用执行存储例程(存储过程和函数)的语句。
FILE
:影响以下操作和服务器行为:
LOAD DATA
和 SELECT ... INTO OUTFILE
语句和 LOAD_FILE()
函数在服务器主机上启用读取和写入文件。具有FILE
权限的用户可以读取服务器主机上的任何文件,这些文件可以是全局可读的,也可以是MySQL服务器可读的。这意味着用户可以读取任何数据库目录中的任何文件,因为服务器可以访问其中的任何文件。CREATE TABLE
语句上使用DATA DIRECTORY
或者 INDEX DIRECTORY
表语句选项。为了安全,MySQL服务器不会覆盖已存在的文件。
要限制可以读取或者写入文件的位置,可以是设置系统变量secure_file_priv
为指定的文件目录。
GRANT OPETION
:允许您向其他用户授权,或者撤销自己拥有的权限。
INDEX
:允许使用创建或者删除索引的语句。INDEX
适用于已存在的表。如果你有创建表的权限,你可以在create table
语句中定义索引。
INSERT
:允许向数据库中的表中插入数据。ANALYZE TABLE、OPTIMIZE TABLE
和 REPAIR TABLE
表维护语句也需要 INSERT
。
LOCK TABLES
:允许使用显式 LOCK TABLES
语句来锁定您具有 SELECT
权限的表。这包括使用写锁,它可以防止其他会话读取锁定的表。
PROCESS
:process
权限控制对MySQL内执行线程信息的访问(也就是说,会话中正在执行的语句信息)。
使用 PROCESS
权限,用户可以访问所有线程的信息,甚至是其他用户的线程信息。
如果没有 PROCESS
权限,非匿名用户可以访问自己线程的信息,但不能访问其他用户的线程信息,而匿名用户则无法访问任何线程信息。
PROXY
:允许一个用户模拟或成为另一个用户。
REFERENCES
:创建外键约束需要父表的REFERENCES
特权
RELOAD
:relaod
允许以下操作:
使用flush
语句
使用等同于 FLUSH
操作的 mysqladmin
命令:flush-hosts、flush-logs、flush-privileges、flush-status、flush-tables、flush-threads、refresh
和 reload
。
reload
的命令告诉服务器重新加载权限表到内存。 flush-privileges
与 reload
是同义词。 refresh
命令关闭并重新打开日志文件并刷新所有表。其他flush-xxx 命令执行类似于refresh 的功能,但更具体,在某些情况下可能更可取。例如,如果您只想刷新日志文件,flush-logs 是比refresh
更好的选择。
使用mysqldump
选项执行各种FLUSH
操作:——FLUSH -logs
和——master-data
。
使用RESET MASTER
和 RESET REPLICA | SLAVE
语句。
REPLICATION CLIENT
:允许使用 SHOW MASTER STATUS, SHOW REPLICA | SLAVE STATUS
和 SHOW BINARY LOGS
语句。
REPLICATION SLAVE
:允许账户使用SHOW REPLICAS | SHOW SLAVE HOSTS, SHOW RELAYLOG EVENTS,
和SHOW BINLOG EVENTS
语句请求副本服务器进行数据库的更新。使用 mysqlbinlog
选项 --read-from-remote-server 、--read-from-remote-source
和 --read-from-remote-master
也需要此权限。将此权限授予副本服务器帐户用于连接到当前服务器作为其复制源的服务器。
SELECT
:允许查询数据库表中的行数据。SELECT
语句仅在实际访问表时才需要 SELECT
权限。有些不访问表的SELECT
语句,可以在没有任何数据库权限的情况下执行。例如,可以使用SELECT
作为简单的计算器来计算:
SELECT 1+1;
SELECT PI()*2;
读取其他列值的语句需要SELECT
权限。例如,在 UPDATE 语句中 col_name=expr
的列或在 DELETE
或 UPDATE
语句的 WHERE
子句中的列需要 SELECT
权限。
与EXPLAIN
一起使用的表或视图(包括视图定义中的任何基础表)需要SELECT
权限。
SHOW DATABASES
:通过发出 SHOW DATABASE
语句使帐户能够查看数据库名称。没有此权限的帐户只能查看他们拥有某些权限的数据库,如果服务器是使用 --skip-show-database
选项启动的,则根本无法使用该语句。
SHOW VIEW
:允许使用 SHOW CREATE VIEW
语句。与 EXPLAIN
一起使用的视图也需要此权限。
SHUTDOWN
:允许使用SHUTDOWN
和restart
语句,mysqladmin shutdown
命令和C API的mysql_shutdown()
函数
SUPER
:SUPER
是一个强大而宽广的权限,不要轻易分配。如果一个账户只需要执行一个super
权限的子集操作,有可能通过授予一个或多个动态特权来实现所需的特权集,每个特权赋予更多有限的能力。
SUPER 已被弃用,它会在 MySQL 的未来版本中被删除。请参阅将帐户从 SUPER 迁移到动态权限。
SUPER
影响以下操作和服务器行为:
在运行时允许修改系统变量:
SET GLOBAL
和 SET PERSIST
启用对全局系统变量的更改。对应的动态权限是SYSTEM_VARIABLES_ADMIN
。SESSION_VARIABLES_ADMIN
。启用对全局事务特性的更改(请参阅SET TRANSACTION Statement)。对应的动态权限是SYSTEM_VARIABLES_ADMIN
。
允许账户启动和停止复制,包括组复制。对应的动态权限是REPLICATION_SLAVE_ADMIN
用于常规复制,GROUP_REPLICATION_ADMIN
用于组复制。
允许使用 CHANGE REPLICATION SOURCE TO
语句(来自 MySQL 8.0.23)、CHANGE MASTER TO
语句(MySQL 8.0.23 之前)和 CHANGE REPLICATION FILTER
语句。对应的动态权限是 REPLICATION_SLAVE_ADMIN。
通过 PURGE BINARY LOGS
和 BINLOG
语句启用二进制日志控制。对应的动态权限为 BINLOG_ADMIN
。
启用在执行视图或存储程序时设置有效的权限ID。具有此特权的用户可以在视图或存储程序的DEFINER
属性中指定任何帐户。对应的动态权限是SET_USER_ID。
允许使用 CREATE SERVER、ALTER SERVER
和 DROP SERVER
语句。
允许使用 mysqladmin
调试命令。
启用 InnoDB
加密密轮询。对应的动态权限是 ENCRYPTION_KEY_ADMIN
。
允许执行版本令牌函数。对应的动态权限为 VERSION_TOKEN_ADMIN
。
允许授权和撤销角色。对应的动态权限为 ROLE_ADMIN
。
允许控制非SUPER
账户的客户端连接:
KILL
语句或 mysqladmin kill
命令来终止属于其他帐户的线程。 (一个帐户总是可以杀死自己的线程。)SUPER
客户端连接时,服务器不会执行 init_connect
系统变量内容。max_connections
系统变量配置的连接限制,服务器也会接受来自 SUPER
客户端的一个连接。SUPER
客户端连接,并接受来自 SUPER
客户端的新连接。read_only
系统变量,也可以执行更新。这适用于显式表更新,以及使用GRANT
和REVOKE
等帐户管理语句隐式更新表。上述连接控制操作对应的动态权限是CONNECTION_ADMIN
。
TRIGGER
:允许触发器操作。您必须具有此权限才能为表创建、删除、执行或查看该表的触发器。
当触发器被激活时(由有权为与触发器关联的表执行INSERT、UPDATE
或DELETE
语句的用户激活),触发器执行要求定义触发器的用户仍具有该表的触发器权限。
UPDATE
:允许更新数据库表中的行。
USAGE
:此权限说明符代表“无权限”。它在全局级别与 GRANT
一起使用以指定诸如 WITH GRANT OPTION
之类的子句,而不在权限列表中命名特定帐户权限。 SHOW GRANTS
语句结果中的USAGE
表示该帐户在权限级别没有权限。
动态权限是在运行时定义的,而静态权限则是内置于服务器中的。以下列表描述了 MySQL 中可用的每个动态权限。
大多数动态权限是在服务器启动时定义的。其他的由特定的组件或插件定义,在这种情况下,除非定义权限的组件或插件已启用,否则权限不可用。
特定的 SQL 语句可能具有比此处指出的更具体的权限要求。如果是,则以下描述会提供详细信息:
APPLICATION_PASSWORD_ADMIN
(在 MySQL 8.0.14 中添加)。对于双密码功能,此权限允许对应用于自己帐户的ALTER USER
和SET PASSWORD
语句使用RETAIN CURRENT PASSWORD
和DISCARD OLD PASSWORD
子句。由于大多数用户只需要一个密码,因此需要此权限才能操作自己的辅助密码。
如果要允许一个帐户为所有帐户操作二级密码,则应授予它 CREATE USER
权限而不是 APPLICATION_PASSWORD_ADMIN
。
有关使用双密码的更多信息,请参阅Password Management.。
AUDIT_ADMIN
:启用审计日志配置。此权限由 audit_log 插件定义;请参阅 “MySQL Enterprise Audit.。
BACKUP_ADMIN
:允许执行 LOCK INSTANCE FOR BACKUP
语句并访问 log_status
表。
提示:除了 BACKUP_ADMIN
,它的访问还需要 log_status
表的 SELECT
权限。
BINLOG_ADMIN
:通过 PURGE BINARY LOGS
和 BINLOG
语句启用二进制日志控制。
BINLOG_ENCRYPTION_ADMIN
:允许设置系统变量 binlog_encryption
,它激活或停用二进制日志文件和中继日志文件的加密。BINLOG_ADMIN、SYSTEM_VARIABLES_ADMIN
或 SESSION_VARIABLES_ADMIN
权限不提供此功能。相关的系统变量binlog_rotate_encryption_master_key_at_startup
在服务器重新启动时自动轮询二进制日志主密钥,它不需要此权限。
CLONE_ADMIN
:允许执行CLONE
语句。包括 BACKUP_ADMIN
和 SHUTDOWN
权限。
CONNECTION_ADMIN
:启用使用 KILL
语句或 mysqladmin kill
命令来终止属于其他帐户的线程。 (一个帐户总是可以杀死自己的线程。)
允许设置与客户端连接相关的系统变量,或绕过与客户端连接相关的限制。CONNECTION_ADMIN
适用于这些系统变量的影响:
init_connect
:当CONNECTION_ADMIN
客户端连接时,服务器不执行init_connect
系统变量内容。max_connections
:即使达到了 max_connections
系统变量配置的连接限制,服务器也会接受来自 CONNECTION_ADMIN
客户端的一个连接。CONNECTION_ADMIN
客户端连接,并接受来自 CONNECTION_ADMIN
客户端的新连接。read_only
系统变量,也可以执行更新。这适用于显式表更新,以及使用GRANT
和REVOKE
等帐户管理语句隐式更新表。ENCRYPTION_KEY_ADMIN
:允许InnoDB 加密密钥轮询。
FIREWALL_ADMIN
:使用户能够为任何用户管理防火墙规则。此权限由 MYSQL_FIREWALL
插件定义;请参阅 MySQL Enterprise Firewall.。
FIREWALL_EXEMPT (added in MySQL 8.0.27)
:具有此权限的用户不受防火墙限制。此权限由 MYSQL_FIREWALL
插件定义;请参阅 MySQL Enterprise Firewall。
FIREWALL_USER
:使用户能够更新他们自己的防火墙规则。此权限由 MYSQL_FIREWALL 插件定义。请参阅 MySQL Enterprise Firewall。
FLUSH_OPTIMIZER_COSTS (added in MySQL 8.0.23)
:允许使用 FLUSH OPTIMIZER_COSTS
语句。
FLUSH_STATUS (added in MySQL 8.0.23)
:允许使用 FLUSH STATUS
语句。
FLUSH_TABLES (added in MySQL 8.0.23)
:允许使用 FLUSH TABLES
语句。
FLUSH_USER_RESOURCES (added in MySQL 8.0.23)
:允许使用 FLUSH USER_RESOURCES
语句。
GROUP_REPLICATION_ADMIN
:
INNODB_REDO_LOG_ARCHIVE
:启用帐户激活和取消重做日志归档。
INNODB_REDO_LOG_ENABLE
:允许使用 ALTER INSTANCE {ENABLE|DISABLE} INNODB REDO_LOG
语句来启用或禁用重做日志记录
NDB_STORED_USER
:使用户或角色及其特权能够在所有启用 NDB
的 MySQL 服务器之间共享和同步,一旦它们加入给定的 NDB Cluster
。只有启用了 NDB 存储引擎时,此权限才可用。对给定用户或角色的权限所做的任何更改或撤销都会立即与所有连接的MySQL服务器(SQL节点)同步。您应该知道,不能保证来自不同SQL节点的权限的语句以相同的顺序在所有SQL节点上执行。因此,强烈建议在单个SQL节点执行所有用户管理。
NDB_STORED_USER
是全局权限,必须使用ON *.*
来授予或撤销。试图为该特权设置任何其他作用域将导致错误。这个特权可以授予大多数应用程序和管理用户,但是不能授予系统保留帐户,如mysql,session@localhost
或mysql.infoschema@localhost
。
被授予NDB_STORED_USER
权限的用户存储在NDB
中(因此由所有SQL节点共享),具有此权限的角色也是如此。仅授予具有NDB_STORED_USER
的角色的用户不存储在NDB中;必须显式地授予每个NDB存储用户权限。
NDB_STORED_USER
权限从 NDB 8.0.18
开始可用。
PERSIST_RO_VARIABLES_ADMIN
:对于拥有SYSTEM_VARIABLES_ADMIN
的用户,PERSIST_RO_VARIABLES_ADMIN
允许使用SET PERSIST_ONLY
将全局系统变量持久化到数据目录中的mysqld-auto.cnf
文件中。该语句类似于SET PERSIST
,但不会修改运行时全局系统变量值。这使得SET PERSIST_ONLY
适用于配置只读系统变量,这些变量只能在服务器启动时设置。
REPLICATION_APPLIER
:
REPLICATION_SLAVE_ADMIN
:使帐户能够连接到复制源服务器,使用START REPLICA | SLAVE
和STOP REPLICA | SLAVE
语句启动和停止复制,并使用CHANGE REPLICATION SOURCE TO
语句(从MySQL 8.0.23开始)或CHANGE MASTER TO
语句(在MySQL 8.0.23之前)和CHANGE REPLICATION FILTER
语句。将此权限授予副本用于连接到当前服务器作为其复制源服务器的帐户。此权限不适用于组复制,请使用GROUP_REPLICATION_ADMIN
。
RESOURCE_GROUP_ADMIN
:允许管理资源组,包括创建、更改和删除资源组,以及将线程和语句分配给资源组。具有此权限的用户可以执行与资源组相关的任何操作。
ROLE_ADMIN
:允许授予和撤销角色,使用GRANT
语句的WITH ADMIN OPTION
子句,并在ROLES_GRAPHML()
函数的结果中使用非空的元素内容。需要设置mandatory_roles
系统变量的值
SERVICE_CONNECTION_ADMIN
:
SESSION_VARIABLES_ADMIN (added in MySQL 8.0.14)
:对于大多数系统变量,设置session值不需要任何特权,任何用户都可以这样做来影响当前会话。对于某些系统变量,设置会话值可能会在当前会话之外产生影响,因此是一个受限操作。对于这些, SESSION_VARIABLES_ADMIN
权限允许用户设置SESSION值。
SET_USER_ID
:允许在执行视图或存储程序时设置有效的权限 ID。具有此权限的用户可以将任何帐户指定为视图或存储程序的 DEFINER
属性。
SYSTEM_USER (added in MySQL 8.0.16)
:SYSTEM_USER
权限将普通 和系统用户区分开来。
SYSTEM_USER
权限的用户是系统用户。SYSTEM_USER
权限的用户是普通用户。系统用户可以影响其他用户的权限
SYSTEM_VARIABLES_ADMIN
:
影响以下操作和服务器行为:
SET GLOBAL
和SET PERSIST
语句对服务全局配置进行修改。PERSIST_RO_VARIABLES_ADMIN
权限,就允许使用 SET PERSIST_ONLY
语句对服务全局配置进行修改。SYSTEM_VARIABLES_ADMIN
权限包含了SESSION_VARIABLES_ADMIN
权限。TABLE_ENCRYPTION_ADMIN (added in MySQL 8.0.16)
:当table_encryption_privilege_check
被启用时,允许用户覆盖默认的加密设置;请参见Defining an Encryption Default for Schemas and General Tablespaces
只授权账户所需要的权限。在授予FILE
权限和管理权限的时候需要格外小心。
FILE
权限的账户可以将MySQL服务所在的服务器主机上任何文件读取到数据库表中。这包括所有全局可读的文件和服务器数据目录中的文件。然后可以使用SELECT
访问该表,将其内容传输到客户机主机。GRANT OPTION
允许用户将自己的权限授予其他用户。两个拥有不同权限并具有GRANT OPTION
权限的用户可以合并权限。ALTER
可以通过重命名表来破坏权限系统。SHUTDOWN
可以被滥用,通过终止服务器来完全拒绝向其他用户提供服务。PROCESS
可用于查看当前正在执行语句的信息,包括设置或更改密码的语句。SUPER
可用于终止其他会话或更改服务器的运行方式。mysql
系统数据库本身授予的权限可用于更改密码和其他访问权限信息:
mysql
有写访问权限的用户。用户系统表authentication_string
列可以修改一个帐户的密码,然后使用该帐户连接到MySQL服务器。mysql
系统数据库授予的 INSERT
或 UPDATE
权限能够使用户添加权限或修改现有权限。mysql
系统数据库的DROP
权限允许用户远程访问权限表,甚至数据库本身。MySQL支持静态和动态权限。
例如,SELECT和INSERT特权是静态的并且总是可用的,而动态特权只有在实现它的组件被启用时才可用。
本节的其余部分将介绍动态权限在MySQL中的工作方式。讨论中使用了“组件”一词,但同样适用于插件。
服务器在内存中内部维护一组已注册的动态权限。服务器关闭被注销。
通常,定义动态特权的组件在安装时的初始化过程中注册它们。卸载时,组件不会注销已注册的动态特权。
尝试注册已注册的动态特权时,不会出现警告或错误。考虑以下语句序列:
INSTALL COMPONENT 'my_component';
UNINSTALL COMPONENT 'my_component';
INSTALL COMPONENT 'my_component';
第一个INSTALL COMPONENT
语句注册my_component
中定义的所有权限,但是UNINSTALL COMPONENT
语句不会注销这些权限。对于第二个STALL COMPONENT
语句,发现该组件已经被注册,但是不会告警或者错误。
动态权限仅适用于全局级别。服务器在 mysql.global_grants
系统表中存储有关当前分配给用户帐户的动态权限的信息:
在服务器启动期间自动注册在 global_grants
中命名的权限(除非提供了 --skip-grant-tables
选项)。
GRANT
和 REVOKE
语句修改 global_grants
的内容。
global_grants
中列出的动态权限分配是持久的。它们不会在服务器关闭时删除。
示例:以下语句授予用户 u1 控制副本上的复制(包括组复制)和修改系统变量所需的权限:
GRANT REPLICATION_SLAVE_ADMIN, GROUP_REPLICATION_ADMIN, BINLOG_ADMIN ON *.* TO 'u1'@'localhost';
已授予的动态特权出现在SHOW GRANTS
语句结果中和INFORMATION_SCHEMA.USER_PRIVILEGES
表中。
对于全局级别的GRANT
和REVOKE
,任何未被识别的静态权限命名都将被已注册的动态权限集所检察,如果知道则授权。否则发生错误并且提示未知的权限标识符。
对于 GRANT
和 REVOKE
全局级别的 ALL [PRIVILEGES]
意味着包括所有静态全局权限,以及所有当前注册的动态权限:
GRANT ALL
授予所有静态全局权限和所有当前注册的动态权限。在执行 GRANT
语句之后注册的动态特权不会追加授予任何帐户。REVOKE ALL
在全局级别撤销所有授予的静态全局权限和所有授予的动态权限。FLUSH PRIVILEGES
语句读取global_grants
表进行动态权限分配,并注册在该表中发现的任何未注册的权限。
SUPER
现在被弃用了;希望在MySQL的未来版本中删除它。删除SUPER
时,以前需要SUPER
的操作将失败,除非被授予SUPER
的帐户授予相应的动态权限。使用以下说明实现该目标,以便在超级SUPER
之前准备好帐户:
执行此查询以识别被授予 SUPER
的帐户:
SELECT GRANTEE FROM INFORMATION_SCHEMA.USER_PRIVILEGES WHERE PRIVILEGE_TYPE = 'SUPER';
对于前面查询的每个帐户并确定它们需要的 SUPER
的操作。然后授予与这些操作对应的动态权限,并撤销 SUPER
权限。
例如,如果 'u1'@'localhost'
需要 SUPER
权限进行二进制日志清除和系统变量修改,则通过以下语句对账户权限进行修改:
GRANT BINLOG_ADMIN, SYSTEM_VARIABLES_ADMIN ON *.* TO 'u1'@'localhost';
REVOKE SUPER ON *.* FROM 'u1'@'localhost';
修改所有查询到的帐户后,第一步中的 INFORMATION_SCHEMA
查询应生成一个空结果集。