帐号管理相关
创建用户声明
CREATE USER [IF NOT EXISTS]
user [auth_option] [, user [auth_option]] ...
DEFAULT ROLE role [, role ] ...
[REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
[WITH resource_option [resource_option] ...]
[password_option | lock_option] ...
[COMMENT 'comment_string' | ATTRIBUTE 'json_object']
user:
(see Section 6.2.4, “Specifying Account Names”)
auth_option: {
IDENTIFIED BY 'auth_string' [AND 2fa_auth_option]
| IDENTIFIED BY RANDOM PASSWORD [AND 2fa_auth_option]
| IDENTIFIED WITH auth_plugin [AND 2fa_auth_option]
| IDENTIFIED WITH auth_plugin BY 'auth_string' [AND 2fa_auth_option]
| IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD [AND 2fa_auth_option]
| IDENTIFIED WITH auth_plugin AS 'auth_string' [AND 2fa_auth_option]
| IDENTIFIED WITH auth_plugin [initial_auth_option]
}
2fa_auth_option: {
IDENTIFIED BY 'auth_string' [AND 3fa_auth_option]
| IDENTIFIED BY RANDOM PASSWORD [AND 3fa_auth_option]
| IDENTIFIED WITH auth_plugin [AND 3fa_auth_option]
| IDENTIFIED WITH auth_plugin BY 'auth_string' [AND 3fa_auth_option]
| IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD [AND 3fa_auth_option]
| IDENTIFIED WITH auth_plugin AS 'auth_string' [AND 3fa_auth_option]
}
3fa_auth_option: {
IDENTIFIED BY 'auth_string'
| IDENTIFIED BY RANDOM PASSWORD
| IDENTIFIED WITH auth_plugin
| IDENTIFIED WITH auth_plugin BY 'auth_string'
| IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD
| IDENTIFIED WITH auth_plugin AS 'auth_string'
}
initial_auth_option: {
INITIAL AUTHENTICATION IDENTIFIED BY {RANDOM PASSWORD | 'auth_string'}
| INITIAL AUTHENTICATION IDENTIFIED WITH auth_plugin AS 'auth_string'
}
tls_option: {
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'
}
resource_option: {
MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
}
password_option: {
PASSWORD EXPIRE [DEFAULT | NEVER | INTERVAL N DAY]
| PASSWORD HISTORY {DEFAULT | N}
| PASSWORD REUSE INTERVAL {DEFAULT | N DAY}
| PASSWORD REQUIRE CURRENT [DEFAULT | OPTIONAL]
| FAILED_LOGIN_ATTEMPTS N
| PASSWORD_LOCK_TIME {N | UNBOUNDED}
}
lock_option: {
ACCOUNT LOCK
| ACCOUNT UNLOCK
}
首次创建帐户时没有特权,默认角色为 。要分配特权或角色,请使用 GRANT 语句。NONE
例如:创建用户帐号
mysql> CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
帐户名的主机名部分(如果省略)默认为 。'%'
示例:创建一个使用默认身份验证插件和给定密码的帐户。将密码标记为已过期,以便用户在首次连接到服务器时必须选择一个新密码:
CREATE USER 'jeffrey'@'localhost'
IDENTIFIED BY 'new_password' PASSWORD EXPIRE;
示例:创建一个使用身份验证插件和给定密码的帐户。要求每 180 天选择一个新密码,并启用登录失败跟踪,以便连续三个不正确的密码导致帐户临时锁定两天:caching_sha2_password
CREATE USER 'jeffrey'@'localhost'
IDENTIFIED WITH caching_sha2_password BY 'new_password'
PASSWORD EXPIRE INTERVAL 180 DAY
FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 2;
示例:创建多个帐户,指定一些每个帐户的属性和一些全局属性:
CREATE USER
'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password
BY 'new_password1',
'jeanne'@'localhost' IDENTIFIED WITH caching_sha2_password
BY 'new_password2'
REQUIRE X509 WITH MAX_QUERIES_PER_HOUR 60
PASSWORD HISTORY 5
ACCOUNT LOCK;
删除角色语句
mysql> DROP ROLE [IF EXISTS] *role* [, *role* ] ...
DROP ROLE 'admin', 'developer';
DROP ROLE 'webapp'@'localhost';
角色名的主机名部分(如果省略)默认为 。'%'
删除角色会删除一个或多个角色(命名的权限集合)。要使用此语句,您必须具有全局删除角色或创建用户特权。启用read_only系统变量后,DROP ROLE还需要CONNECTION_ADMIN权限(或已弃用的 SUPER权限)。
删除用户声明
mysql> DROP USER [IF EXISTS] *user* [, *user*] ...
DROP USER 语句删除一个或多个 MySQL 帐户及其权限。它会从所有授权表中删除帐户的权限行。
例如:
DROP USER 'jeffrey'@'localhost';
帐户名的主机名部分(如果省略)默认为 。'%'
授予声明
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user_or_role [, user_or_role] ...
[WITH GRANT OPTION]
[AS user
[WITH ROLE
DEFAULT
| NONE
| ALL
| ALL EXCEPT role [, role ] ...
| role [, role ] ...
]
]
}
GRANT PROXY ON user_or_role
TO user_or_role [, user_or_role] ...
[WITH GRANT OPTION]
GRANT role [, role] ...
TO user_or_role [, user_or_role] ...
[WITH ADMIN OPTION]
object_type: {
TABLE
| FUNCTION
| PROCEDURE
}
priv_level: {
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name
}
user_or_role: {
user (see Section 6.2.4, “Specifying Account Names”)
| role (see Section 6.2.5, “Specifying Role Names”)
}
GRANT不能在同一语句中混合授予特权和角色。给定GRANT语句必须授予特权或角色。
-
该子句区分语句是否授予特权或角色:
ON
- 使用 ,语句将授予特权。
ON
- 如果没有 ,该语句将授予角色。
ON
- 允许将特权和角色都分配给帐户,但必须使用单独的 GRANT 语句,每个语句都具有适合于要授予的内容的语法。
- 使用 ,语句将授予特权。
REVOKE语句与 GRANT相关,使管理员能够删除帐户权限。
例如:
GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
GRANT 'role1', 'role2' TO 'user1'@'localhost', 'user2'@'localhost';
GRANT SELECT ON world.* TO 'role3';
帐户或角色名的主机名部分(如果省略)默认为 。'%'
通常,数据库管理员首先使用 CREATE USER 创建帐户并定义其非特权特征,例如密码、是否使用安全连接以及对服务器资源的访问限制,然后使用GRANT定义其权限。ALTER USER可用于更改现有帐户的非特权特征。例如:
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost';
ALTER USER 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR 90;
若要确定此问题是否适用于您,请执行以下查询,其中列出了任何匿名用户:
SELECT Host, User FROM mysql.user WHERE User='';
MySQL 支持的权限
授予和撤销的允许静态权限
特权 | 含义和可授予级别 |
---|---|
ALL [PRIVILEGES] | 在指定访问级别授予除授予选项和代理之外的所有权限。 |
ALTER | 启用更改表的使用。级别:全局、数据库、表。 |
ALTER ROUTINE | 允许更改或删除存储的例程。级别:全局、数据库、例程。 |
CREATE | 启用数据库和表创建。级别:全局、数据库、表。 |
CREATE ROLE | 启用角色创建。级别:全局。 |
CREATE ROUTINE | 启用存储例程创建。级别:全局,数据库。 |
CREATE TABLESPACE | 允许创建、更改或删除表空间和日志文件组。级别:全局。 |
CREATE TEMPORARY TABLES | 启用创建临时表的使用。级别:全局,数据库。 |
CREATE USER | 启用创建用户、删除用户`、和撤消所有权限。级别:全局。 |
CREATE VIEW | 允许创建或更改视图。级别:全局、数据库、表。 |
DELETE | 启用删除。级别:全局、数据库、表。 |
DROP | 允许删除数据库、表和视图。级别:全局、数据库、表。 |
DROP ROLE | 启用要删除的角色。级别:全局。 |
EVENT | 为事件计划程序启用事件的使用。级别:全局,数据库。 |
EXECUTE | 使用户能够执行存储的例程。级别:全局、数据库、例程。 |
FILE | 使用户能够使服务器读取或写入文件。级别:全局。 |
GRANT OPTION | 启用向其他帐户授予权限或从其他帐户中删除的权限。级别:全局、数据库、表、例程、代理。 |
INDEX | 允许创建或删除索引。级别:全局、数据库、表。 |
INSERT | 启用插入级别:全局、数据库、表、列。 |
LOCK TABLES | 在您具有 SELECT权限的表上启用 LOCK 表。级别:全局,数据库。 |
PROCESS | 使用户能够使用 SHOW 进程列表查看所有进程.级别:全局。 |
PROXY | 启用用户代理。级别:从用户到用户。 |
REFERENCES | 启用外键创建。级别:全局、数据库、表、列。 |
RELOAD | 启用 FLUSH 操作的使用。级别:全局。 |
REPLICATION CLIENT | 使用户能够询问源服务器或副本服务器的位置。级别:全局。 |
REPLICATION SLAVE | 使副本能够从源中读取二进制日志事件。级别:全局。 |
SELECT | 启用 SELECT 的使用。级别:全局、数据库、表、列。 |
SHOW DATABASES | 启用显示数据库以显示所有数据库。级别:全局。 |
SHOW VIEW | 启用显示创建视图的使用。级别:全局、数据库、表。 |
SHUTDOWN | 启用 mysqladmin shutdown 的使用。级别:全局。 |
SUPER | 允许使用其他管理操作,例如将复制源更改为,将主服务器更改为,终止,清除二进制日志,设置全局和mysqladmin调试命令。级别:全局。 |
TRIGGER | 启用触发器操作。级别:全局、数据库、表。 |
UPDATE | 启用更新的使用。级别:全局、数据库、表、列。 |
USAGE | “无特权”的同义词 |
授予和撤销的允许动态权限
特权 | 含义和可授予级别 |
---|---|
APPLICATION_PASSWORD_ADMIN | 启用双密码管理。级别:全局。 |
AUDIT_ABORT_EXEMPT | 允许审核日志筛选器阻止的查询。级别:全局。 |
AUDIT_ADMIN | 启用审核日志配置。级别:全局。 |
AUTHENTICATION_POLICY_ADMIN | 启用身份验证策略管理。级别:全局。 |
BACKUP_ADMIN | 启用备份管理。级别:全局。 |
BINLOG_ADMIN | 启用二进制日志控制。级别:全局。 |
BINLOG_ENCRYPTION_ADMIN | 启用二进制日志加密的激活和停用。级别:全局。 |
CLONE_ADMIN | 启用克隆管理。级别:全局。 |
CONNECTION_ADMIN | 启用连接限制/限制控制。级别:全局。 |
ENCRYPTION_KEY_ADMIN | 启用密钥轮换。级别:全局。InnoDB
|
FIREWALL_ADMIN | 启用防火墙规则管理,任何用户。级别:全局。 |
FIREWALL_EXEMPT | 免除用户防火墙限制。级别:全局。 |
FIREWALL_USER | 启用防火墙规则管理,自行。级别:全局。 |
FLUSH_OPTIMIZER_COSTS | 启用优化程序成本重新加载。级别:全局。 |
FLUSH_STATUS | 启用状态指示灯刷新。级别:全局。 |
FLUSH_TABLES | 启用表刷新。级别:全局。 |
FLUSH_USER_RESOURCES | 启用用户资源刷新。级别:全局。 |
GROUP_REPLICATION_ADMIN | |
INNODB_REDO_LOG_ENABLE | 启用或禁用重做日志记录。级别:全局。 |
INNODB_REDO_LOG_ARCHIVE | 启用重做日志存档管理。级别:全局。 |
NDB_STORED_USER | 启用SQL节点(NDB群集)之间的用户或角色共享。级别:全局。 |
PASSWORDLESS_USER_ADMIN | 启用无密码用户帐户管理。级别:全局。 |
PERSIST_RO_VARIABLES_ADMIN | 启用持久化只读系统变量。级别:全局。 |
REPLICATION_APPLIER | 充当复制通道的 。级别:全局。PRIVILEGE_CHECKS_USER
|
REPLICATION_SLAVE_ADMIN | 启用常规复制控制。级别:全局。 |
RESOURCE_GROUP_ADMIN | 启用资源组管理。级别:全局。 |
RESOURCE_GROUP_USER | 启用资源组管理。级别:全局。 |
ROLE_ADMIN | 启用要授予或撤消的角色,请使用 。级别:全局。WITH ADMIN OPTION
|
SESSION_VARIABLES_ADMIN | 启用设置受限会话系统变量。级别:全局。 |
SET_USER_ID | 启用设置非自身值。级别:全局。DEFINER
|
SHOW_ROUTINE | 启用对存储的例程定义的访问。级别:全局。 |
SYSTEM_USER | 将帐户指定为系统帐户。级别:全局。 |
SYSTEM_VARIABLES_ADMIN | 启用修改或保留全局系统变量。级别:全局。 |
TABLE_ENCRYPTION_ADMIN | 启用覆盖默认加密设置。级别:全局。 |
VERSION_TOKEN_ADMIN | 启用版本令牌功能。级别:全局。 |
XA_RECOVER_ADMIN | 启用 XA 恢复执行。级别:全局。 |
在 GRANT语句中,所有 PRIVILEGE 或 PROXY特权必须单独命名,并且不能与其他特权一起指定ALL PRIVILEGE代表除 GRANT 选项和 PROXY 权限之外,所有可用于授予权限的级别的权限。
例如,此语句全局授予 SELECT INSERT 特权:
GRANT SELECT, INSERT ON *.* TO u1;
则可以通过撤销特定数据库的特权来显式拒绝在全局级别授予的权限:
GRANT SELECT, INSERT, UPDATE ON *.* TO u1;
REVOKE INSERT, UPDATE ON db1.* FROM u1;
全局权限是管理权限或应用于给定服务器上的所有数据库。要分配全局权限,请使用以下语法:ON *.*
GRANT ALL ON *.* TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON *.* TO 'someuser'@'somehost';
The CREATE TABLESPACE, CREATE USER, FILE, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SHOW DATABASES, SHUTDOWN, and SUPER static privileges are administrative and can only be granted globally. all 权限中的权限
MySQL将全局权限存储在系统表中。mysql.user
数据库权限
数据库权限适用于给定数据库中的所有对象。要分配数据库级权限,请使用语法:ON *
db_name*.*
GRANT ALL ON mydb.* TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';
表特权
表权限适用于给定表中的所有列。要分配表级权限,请使用语法:ON *
db_name.tbl_name*
GRANT ALL ON mydb.mytbl TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON mydb.mytbl TO 'someuser'@'somehost';
列权限
列特权适用于给定表中的单列。要在列级别授予的每个权限后面必须跟有一个或多个列,并用括号括起来。
GRANT SELECT (col1), INSERT (col1, col2) ON mydb.mytbl TO 'someuser'@'somehost';
存储的例行权限
ALTER、创建例程、执行和 GRANT 选项特权适用于存储例程(过程和函数)。可以在全局和数据库级别授予它们。除 CREATE 例程外,可以在例程级别为单个例程授予这些特权。
GRANT CREATE ROUTINE ON mydb.* TO 'someuser'@'somehost';
GRANT EXECUTE ON PROCEDURE mydb.myproc TO 'someuser'@'somehost';
代理用户权限
PROXY特权使一个用户成为另一个用户的代理。代理用户模拟或获取代理用户的身份;也就是说,它假定代理用户的权限。
GRANT PROXY ON 'localuser'@'localhost' TO 'externaluser'@'somehost';
授予 PROXY 后,它必须是 GRANT语句中指定的唯一特权,并且唯一允许的选项是 。WITH``WITH GRANT OPTION
代理要求代理用户通过插件进行身份验证,该插件在代理用户连接时将代理用户的名称返回给服务器,并且代理用户具有代理用户的权限。
MySQL将代理权限存储在系统表中。mysql.proxies_priv
授予角色
GRANT`不带子句的语法授予角色而不是个人特权。角色是特权的命名集合;请参见[第 6.2.10 节 “使用角色”。](https://dev.mysql.com/doc/refman/8.0/en/roles.html)例如:`ON
GRANT 'role1', 'role2' TO 'user1'@'localhost', 'user2'@'localhost';
查询权限
mysql> SHOW GRANTS FOR u2;
+-------------------------------------------------+
| Grants for u2@% |
+-------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE ON *.* TO `u2`@`%` |
+-------------------------------------------------+
重命名用户声明
RENAME USER old_user TO new_user
[, old_user TO new_user] ...
RENAME USER语句重命名现有的 MySQL 帐户。不存在的旧帐户或已存在的新帐户会发生错误。
例如:
RENAME USER 'jeffrey'@'localhost' TO 'jeff'@'127.0.0.1';
帐户名的主机名部分(如果省略)默认为 。'%'
撤销语句声明
REVOKE [IF EXISTS]
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
FROM user_or_role [, user_or_role] ...
[IGNORE UNKNOWN USER]
REVOKE [IF EXISTS] ALL [PRIVILEGES], GRANT OPTION
FROM user_or_role [, user_or_role] ...
[IGNORE UNKNOWN USER]
REVOKE [IF EXISTS] PROXY ON user_or_role
FROM user_or_role [, user_or_role] ...
[IGNORE UNKNOWN USER]
REVOKE [IF EXISTS] role [, role ] ...
FROM user_or_role [, user_or_role ] ...
[IGNORE UNKNOWN USER]
user_or_role: {
user (see Section 6.2.4, “Specifying Account Names”)
| role (see Section 6.2.5, “Specifying Role Names”
}
REVOKE 语句使系统管理员能够撤消特权和角色,这些特权和角色可以从用户帐户和角色中撤消。
例如:
REVOKE INSERT ON *.* FROM 'jeffrey'@'localhost';
REVOKE 'role1', 'role2' FROM 'user1'@'localhost', 'user2'@'localhost';
REVOKE SELECT ON world.* FROM 'role3';
要撤消所有权限,请使用第二种语法,该语法将删除指定用户或角色的所有全局、数据库、表、列和例程权限:
REVOKE ALL PRIVILEGES, GRANT OPTION
FROM user_or_role [, user_or_role] ...
设置密码语句
SET PASSWORD [FOR user] auth_option
[REPLACE 'current_auth_string']
[RETAIN CURRENT PASSWORD]
auth_option: {
= 'auth_string'
| TO RANDOM
}
SET PASSWORD 语句为 MySQL 用户帐户分配密码。密码可以在语句中显式指定,也可以由MySQL随机生成。该语句还可能包括一个密码验证子句(指定要替换的帐户当前密码)和一个子句(用于管理帐户是否具有辅助密码)。 每个都表示一个明文(未加密)密码。'*
auth_string*'``'*
current_auth_string*'
ALTER USER不是使用 SET PASSWORD 来分配密码,而是帐户更改(包括分配密码)的首选语句。例如:
ALTER USER user IDENTIFIED BY 'auth_string';
设置密码允许以下auth_option
语法:
-
= '*
auth_string*'
为帐户分配给定的文本密码。
-
TO RANDOM
为帐户分配由MySQL随机生成的密码。该语句还在结果集中返回明文密码,以使其可供执行该语句的用户或应用程序使用。
有关随机生成的密码的结果集和特征的详细信息,请参阅随机密码生成
SET PASSWORD可以与显式命名用户帐户的子句一起使用,也可以不带子句:FOR
-
使用子句,该语句为命名帐户设置密码,该密码必须存在:
FOR *
user*
SET PASSWORD FOR 'jeffrey'@'localhost' = 'auth_string';
-
如果没有子句,该语句将为当前用户设置密码:
FOR *
user*
SET PASSWORD = 'auth_string';
设置角色语句
SET ROLE {
DEFAULT
| NONE
| ALL
| ALL EXCEPT role [, role ] ...
| role [, role ] ...
}
SET ROLE通过指定当前用户授予的角色处于活动状态来修改当前用户在当前会话中的有效权限。授予的角色包括显式授予用户的角色和mandatory_roles系统变量值中指定的角色。
例子:
SET ROLE DEFAULT;
SET ROLE 'role1', 'role2';
SET ROLE ALL;
SET ROLE ALL EXCEPT 'role1', 'role2';
指定帐户名称
帐户名显示在 SQL 语句(如创建用户授予和设置密码中,并遵循以下规则:
- 帐户名语法为 。'user_name'@'host_name'