文档主页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  CREATE USER 语句

15.7.1.3 CREATE USER 语句

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 8.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
}

CREATE USER 语句用于创建新的 MySQL 帐户。它允许为新帐户建立身份验证、角色、SSL/TLS、资源限制、密码管理、注释和属性。它还控制帐户最初是锁定还是解锁。

要使用 CREATE USER,您必须具有全局 CREATE USER 权限,或者对 mysql 系统模式具有 INSERT 权限。当启用了 read_only 系统变量时,CREATE USER 还需要 CONNECTION_ADMIN 权限(或已弃用的 SUPER 权限)。

以下附加权限注意事项也适用

如果要创建的任何帐户被命名为任何存储对象的 DEFINER 属性,则 CREATE USER 将失败并返回错误。(也就是说,如果创建帐户会导致该帐户采用当前孤立的存储对象,则该语句将失败。)要无论如何都要执行此操作,您必须拥有 SET_ANY_DEFINERALLOW_NONEXISTENT_DEFINER 权限;在这种情况下,该语句将成功并发出警告,而不是失败并返回错误。要在没有这两个权限的情况下执行用户创建操作,请删除孤立对象,创建帐户并授予其权限,然后重新创建已删除的对象。有关其他信息,包括如何识别哪些对象将给定帐户命名为 DEFINER 属性,请参阅孤立存储对象

CREATE USER 要么对所有命名的用户都成功,要么在发生任何错误时回滚并且不起作用。默认情况下,如果您尝试创建已存在的用户,则会发生错误。如果给出了 IF NOT EXISTS 子句,则该语句会为每个已存在的命名用户生成警告,而不是错误。

重要

在某些情况下,CREATE USER 可能会记录在服务器日志中,或者记录在客户端的历史文件中,例如 ~/.mysql_history,这意味着任何对该信息具有读取权限的人都可以读取明文密码。有关在服务器日志中发生这种情况的条件以及如何控制它的信息,请参阅第 8.1.2.3 节 “密码和日志记录”。有关客户端日志记录的类似信息,请参阅第 6.5.1.3 节 “mysql 客户端日志记录”

CREATE USER 语句有以下几个方面,将在以下主题中进行描述

CREATE USER 概述

对于每个帐户,CREATE USER 会在 mysql.user 系统表中创建一行。帐户行反映了语句中指定的属性。未指定的属性将设置为其默认值

  • 身份验证:默认身份验证插件(确定方式如默认身份验证插件中所述),以及空凭证

  • 默认角色:NONE

  • SSL/TLS:NONE

  • 资源限制:无限制

  • 密码管理:PASSWORD EXPIRE DEFAULT PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT;失败登录跟踪和临时帐户锁定被禁用

  • 帐户锁定:ACCOUNT UNLOCK

帐户在首次创建时没有任何权限,并且默认角色为 NONE。要为此帐户分配权限或角色,请使用一个或多个 GRANT 语句。

每个帐户名称都使用第 8.2.4 节 “指定帐户名称”中描述的格式。例如

CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';

如果省略帐户名称的主机名部分,则默认为 '%'。您应该注意,虽然 MySQL 8.4 将授予此类用户的权限视为已授予 'user'@'localhost',但此行为已弃用,因此将在未来版本的 MySQL 中删除。

命名帐户的每个 user 值后面都可以跟一个可选的 auth_option 值,该值指示帐户如何进行身份验证。这些值允许指定帐户身份验证插件和凭证(例如,密码)。每个 auth_option 适用于紧接在其前面的帐户。

user 规范之后,该语句可以包含 SSL/TLS、资源限制、密码管理和锁定属性的选项。所有这些选项对于该语句都是全局 的,并且适用于该语句中命名的所有 帐户。

示例:创建一个使用默认身份验证插件和给定密码的帐户。将密码标记为已过期,以便用户在首次连接到服务器时必须选择一个新密码

CREATE USER 'jeffrey'@'localhost'
  IDENTIFIED BY 'new_password' PASSWORD EXPIRE;

示例:创建一个使用 caching_sha2_password 身份验证插件和给定密码的帐户。要求每 180 天选择一个新密码,并启用失败登录跟踪,以便连续三次输入错误密码会导致临时帐户锁定两天

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;

每个 auth_option 值(在本例中为 IDENTIFIED WITH ... BY)仅适用于紧接在其前面的帐户,因此每个帐户都使用紧随其后的身份验证插件和密码。

其余属性全局应用于语句中命名的所有帐户,因此对于这两个帐户

  • 必须使用有效的 X.509 证书进行连接。

  • 每小时最多允许 60 个查询。

  • 密码更改不能重复使用最近五个密码中的任何一个。

  • 该帐户最初是被锁定的,因此实际上它是一个占位符,在管理员解锁之前不能使用。

CREATE USER 身份验证选项

帐户名称后面可以跟一个 auth_option 身份验证选项,该选项指定帐户身份验证插件、凭证或两者兼而有之。

注意

MySQL 8.4 支持多因素身份验证 (MFA),因此帐户最多可以有三种身份验证方法。也就是说,帐户可以使用双因素身份验证 (2FA) 或三因素身份验证 (3FA)。auth_option 的语法和语义保持不变,但 auth_option 后面可以跟其他身份验证方法的规范。本节介绍 auth_option。有关可选的 MFA 相关后续子句的详细信息,请参阅CREATE USER 多因素身份验证选项

注意

随机密码生成子句仅适用于使用将凭证存储在 MySQL 内部身份验证插件的帐户。对于使用针对 MySQL 外部凭证系统执行身份验证的插件的帐户,也必须针对该系统在外部处理密码管理。有关内部凭证存储的更多信息,请参阅第 8.2.15 节 “密码管理”

  • auth_plugin 命名身份验证插件。插件名称可以是用引号引起来的字符串字面量或未用引号引起来的名称。插件名称存储在 mysql.user 系统表的 plugin 列中。

    对于未指定身份验证插件的 auth_option 语法,服务器将分配默认插件,确定方式如默认身份验证插件中所述。有关每个插件的说明,请参阅第 8.4.1 节 “身份验证插件”

  • 内部存储的凭证存储在 mysql.user 系统表中。'auth_string' 值或 RANDOM PASSWORD 分别以明文(未加密)字符串或以与帐户关联的身份验证插件预期的格式进行哈希处理,指定帐户凭证

    • 对于使用 BY 'auth_string' 的语法,字符串是明文,并传递给身份验证插件以进行可能的哈希处理。插件返回的结果存储在 mysql.user 表中。插件可以使用指定的值,在这种情况下不会发生哈希处理。

    • 对于使用 BY RANDOM PASSWORD 的语法,MySQL 会生成一个随机密码,并将其作为明文传递给身份验证插件以进行可能的哈希处理。插件返回的结果存储在 mysql.user 表中。插件可以使用指定的值,在这种情况下不会发生哈希处理。

      随机生成的密码具有随机密码生成中描述的特征。

    • 对于使用 AS 'auth_string' 的语法,假定字符串已经是身份验证插件所需的格式,并按原样存储在 mysql.user 表中。如果插件需要哈希值,则该值必须已经以适合该插件的格式进行哈希处理;否则,该插件将无法使用该值,并且不会发生客户端连接的正确身份验证。

      哈希字符串可以是字符串字面量或十六进制值。后者对应于在启用 print_identified_with_as_hex 系统变量时,SHOW CREATE USER 为包含不可打印字符的密码哈希显示的值类型。

      重要

      虽然我们用引号显示 'auth_string',但用于此目的的十六进制值不得 用引号引起来。

    • 如果身份验证插件不对身份验证字符串执行哈希处理,则 BY 'auth_string'AS 'auth_string' 子句具有相同的效果:身份验证字符串按原样存储在 mysql.user 系统表中。

CREATE USER 允许以下 auth_option 语法

  • IDENTIFIED BY 'auth_string'

    将帐户身份验证插件设置为默认插件,将明文 'auth_string' 值传递给插件以进行可能的哈希处理,并将结果存储在 mysql.user 系统表的帐户行中。

  • IDENTIFIED BY RANDOM PASSWORD

    将帐户身份验证插件设置为默认插件,生成一个随机密码,将明文密码值传递给插件以进行可能的哈希处理,并将结果存储在 mysql.user 系统表的帐户行中。该语句还会在结果集中返回明文密码,以使其对执行该语句的用户或应用程序可用。有关结果集和随机生成的密码特征的详细信息,请参阅随机密码生成

  • IDENTIFIED WITH auth_plugin

    将帐户身份验证插件设置为 auth_plugin,将凭据清除为空字符串,并将结果存储在 mysql.user 系统表中的帐户行中。

  • IDENTIFIED WITH auth_plugin BY 'auth_string'

    将帐户身份验证插件设置为 auth_plugin,将明文 'auth_string' 值传递给插件以进行可能的哈希处理,并将结果存储在 mysql.user 系统表中的帐户行中。

  • IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD

    将帐户身份验证插件设置为 auth_plugin,生成一个随机密码,将明文密码值传递给插件以进行可能的哈希处理,并将结果存储在 mysql.user 系统表中的帐户行中。该语句还将在结果集中返回明文密码,以使其可供执行该语句的用户或应用程序使用。有关结果集和随机生成密码的特征的详细信息,请参阅随机密码生成

  • IDENTIFIED WITH auth_plugin AS 'auth_string'

    将帐户身份验证插件设置为 auth_plugin 并将 'auth_string' 值原样存储在 mysql.user 帐户行中。如果插件需要哈希字符串,则假定该字符串已使用插件所需的格式进行哈希处理。

示例:将密码指定为明文;使用默认插件

CREATE USER 'jeffrey'@'localhost'
  IDENTIFIED BY 'password';

示例:指定身份验证插件以及明文密码值

CREATE USER 'jeffrey'@'localhost'
  IDENTIFIED WITH mysql_native_password BY 'password';

在每种情况下,存储在帐户行中的密码值都是明文值 'password',该值由与该帐户关联的身份验证插件进行哈希处理后得到。

有关设置密码和身份验证插件的其他信息,请参阅第 8.2.14 节“分配帐户密码”第 8.2.17 节“可插拔身份验证”

CREATE USER 多因素身份验证选项

CREATE USER 中的 auth_option 部分定义了一种单因素身份验证 (1FA/SFA) 的身份验证方法。CREATE USER 还支持多因素身份验证 (MFA),这样帐户最多可以拥有三种身份验证方法。也就是说,帐户可以使用双因素身份验证 (2FA) 或三因素身份验证 (3FA)。

authentication_policy 系统变量为包含多因素身份验证 (MFA) 子句的 CREATE USER 语句定义了约束。例如,authentication_policy 设置控制帐户可以拥有的身份验证因素的数量,以及每个因素允许使用哪些身份验证方法。请参阅配置多因素身份验证策略

有关确定未命名插件的身份验证子句的默认身份验证插件的特定于因素的规则的信息,请参阅默认身份验证插件

auth_option 之后,可能会出现不同的可选 MFA 子句

  • 2fa_auth_option:指定因素 2 身份验证方法。以下示例将 caching_sha2_password 定义为因素 1 身份验证方法,并将 authentication_ldap_sasl 定义为因素 2 身份验证方法。

    CREATE USER 'u1'@'localhost'
      IDENTIFIED WITH caching_sha2_password
        BY 'sha2_password'
      AND IDENTIFIED WITH authentication_ldap_sasl
        AS 'uid=u1_ldap,ou=People,dc=example,dc=com';
  • 3fa_auth_option:在 2fa_auth_option 之后,可能会出现一个 3fa_auth_option 子句,用于指定因素 3 身份验证方法。以下示例将 caching_sha2_password 定义为因素 1 身份验证方法,将 authentication_ldap_sasl 定义为因素 2 身份验证方法,并将 authentication_webauthn 定义为因素 3 身份验证方法。

    CREATE USER 'u1'@'localhost'
      IDENTIFIED WITH caching_sha2_password
        BY 'sha2_password'
      AND IDENTIFIED WITH authentication_ldap_sasl
        AS 'uid=u1_ldap,ou=People,dc=example,dc=com'
      AND IDENTIFIED WITH authentication_webauthn;
  • initial_auth_option:指定用于配置 FIDO/FIDO2 无密码身份验证的初始身份验证方法。如下所示,要启用 WebAuthn 无密码身份验证,需要使用生成的随机密码或用户指定的 auth-string 进行临时身份验证。

    CREATE USER user
      IDENTIFIED WITH authentication_webauthn
      INITIAL AUTHENTICATION IDENTIFIED BY {RANDOM PASSWORD | 'auth_string'};

    有关使用 WebAuthn 可插拔身份验证配置无密码身份验证的信息,请参阅WebAuthn 无密码身份验证

CREATE USER 角色选项

DEFAULT ROLE 子句定义了当用户连接到服务器并进行身份验证时,或者当用户在会话期间执行 SET ROLE DEFAULT 语句时,哪些角色将变为活动状态。

每个角色名称都使用第 8.2.5 节“指定角色名称”中描述的格式。例如

CREATE USER 'joe'@'10.0.0.1' DEFAULT ROLE administrator, developer;

角色名称中的主机名部分(如果省略)默认为 '%'

DEFAULT ROLE 子句允许使用一个或多个逗号分隔的角色名称列表。这些角色必须在执行 CREATE USER 时存在;否则该语句将引发错误(ER_USER_DOES_NOT_EXIST),并且不会创建用户。

CREATE USER SSL/TLS 选项

除了基于用户名和凭据的常规身份验证之外,MySQL 还可以检查 X.509 证书属性。有关在 MySQL 中使用 SSL/TLS 的背景信息,请参阅第 8.3 节“使用加密连接”

要为 MySQL 帐户指定与 SSL/TLS 相关的选项,请使用指定了一个或多个 tls_option 值的 REQUIRE 子句。

REQUIRE 选项的顺序无关紧要,但不能两次指定同一个选项。AND 关键字在 REQUIRE 选项之间是可选的。

CREATE USER 允许使用以下 tls_option

  • NONE

    表示该语句命名的所有帐户都没有 SSL 或 X.509 要求。如果用户名和密码有效,则允许未加密的连接。如果客户端具有正确的证书和密钥文件,则可以使用加密连接(由客户端选择)。

    CREATE USER 'jeffrey'@'localhost' REQUIRE NONE;

    客户端默认尝试建立安全连接。对于具有 REQUIRE NONE 的客户端,如果无法建立安全连接,则连接尝试将回退到未加密的连接。要要求加密连接,客户端只需指定 --ssl-mode=REQUIRED 选项;如果无法建立安全连接,则连接尝试将失败。

    如果没有指定与 SSL 相关的 REQUIRE 选项,则默认为 NONE

  • SSL

    指示服务器仅允许对该语句命名的所有帐户进行加密连接。

    CREATE USER 'jeffrey'@'localhost' REQUIRE SSL;

    客户端默认尝试建立安全连接。对于具有 REQUIRE SSL 的帐户,如果无法建立安全连接,则连接尝试将失败。

  • X509

    对于该语句命名的所有帐户,要求客户端提供有效的证书,但确切的证书、颁发者和主题无关紧要。唯一的要求是应该可以使用其中一个 CA 证书验证其签名。使用 X.509 证书始终意味着加密,因此在这种情况下不需要 SSL 选项。

    CREATE USER 'jeffrey'@'localhost' REQUIRE X509;

    对于具有 REQUIRE X509 的帐户,客户端必须指定 --ssl-key--ssl-cert 选项才能连接。(建议但不要求也指定 --ssl-ca,以便可以验证服务器提供的公共证书。)对于 ISSUERSUBJECT 也是如此,因为那些 REQUIRE 选项隐含了 X509 的要求。

  • ISSUER 'issuer'

    对于该语句命名的所有帐户,要求客户端提供由 CA 'issuer' 颁发的有效 X.509 证书。如果客户端提供的证书有效但颁发者不同,则服务器将拒绝连接。使用 X.509 证书始终意味着加密,因此在这种情况下不需要 SSL 选项。

    CREATE USER 'jeffrey'@'localhost'
      REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/
        O=MySQL/CN=CA/[email protected]';

    因为 ISSUER 隐含了 X509 的要求,所以客户端必须指定 --ssl-key--ssl-cert 选项才能连接。(建议但不要求也指定 --ssl-ca,以便可以验证服务器提供的公共证书。)

  • SUBJECT 'subject'

    对于该语句命名的所有帐户,要求客户端提供包含主题 subject 的有效 X.509 证书。如果客户端提供的证书有效但主题不同,则服务器将拒绝连接。使用 X.509 证书始终意味着加密,因此在这种情况下不需要 SSL 选项。

    CREATE USER 'jeffrey'@'localhost'
      REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/
        O=MySQL demo client certificate/
        CN=client/[email protected]';

    MySQL 会将 'subject' 值与证书中的值进行简单的字符串比较,因此字母大小写和组件顺序必须与证书中显示的完全相同。

    因为 SUBJECT 隐含了 X509 的要求,所以客户端必须指定 --ssl-key--ssl-cert 选项才能连接。(建议但不要求也指定 --ssl-ca,以便可以验证服务器提供的公共证书。)

  • CIPHER 'cipher'

    对于该语句命名的所有帐户,都需要一种特定的加密方法来加密连接。需要此选项以确保使用足够强度的密码和密钥长度。如果使用具有短加密密钥的旧算法,则加密可能会很弱。

    CREATE USER 'jeffrey'@'localhost'
      REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';

SUBJECTISSUERCIPHER 选项可以在 REQUIRE 子句中组合使用

CREATE USER 'jeffrey'@'localhost'
  REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/
    O=MySQL demo client certificate/
    CN=client/[email protected]'
  AND ISSUER '/C=SE/ST=Stockholm/L=Stockholm/
    O=MySQL/CN=CA/[email protected]'
  AND CIPHER 'EDH-RSA-DES-CBC3-SHA';
CREATE USER 资源限制选项

可以限制帐户对服务器资源的使用,如第 8.2.21 节“设置帐户资源限制”中所述。为此,请使用指定了一个或多个 resource_option 值的 WITH 子句。

WITH 选项的顺序无关紧要,除非多次指定了给定的资源限制,在这种情况下,最后一个实例优先。

CREATE USER 允许使用以下 resource_option

  • MAX_QUERIES_PER_HOUR countMAX_UPDATES_PER_HOUR countMAX_CONNECTIONS_PER_HOUR count

    对于语句中命名的所有帐户,这些选项限制了在任何给定的一小时内,每个帐户允许对服务器进行的查询、更新和连接的数量。如果 count0(默认值),则表示该帐户没有限制。

  • MAX_USER_CONNECTIONS count

    对于语句中命名的所有帐户,限制每个帐户到服务器的同时连接的最大数量。非零的 count 显式指定帐户的限制。如果 count0(默认值),则服务器根据 max_user_connections 系统变量的全局值确定帐户的同时连接数。如果 max_user_connections 也为零,则对该帐户没有限制。

示例

CREATE USER 'jeffrey'@'localhost'
  WITH MAX_QUERIES_PER_HOUR 500 MAX_UPDATES_PER_HOUR 100;
创建用户密码管理选项

CREATE USER 支持多种用于密码管理的 password_option

  • 密码过期选项:您可以手动使帐户密码过期,并建立其密码过期策略。策略选项不会使密码过期。相反,它们根据密码有效期(从最近一次帐户密码更改的日期和时间算起)确定服务器如何对帐户应用自动过期。

  • 密码重用选项:您可以根据密码更改次数、经过时间或两者来限制密码重用。

  • 密码验证要求选项:您可以指示尝试更改帐户密码是否必须指定当前密码,以验证尝试进行更改的用户是否确实知道当前密码。

  • 错误密码登录失败跟踪选项:您可以使服务器跟踪登录失败尝试,并临时锁定那些连续输入过多错误密码的帐户。所需的失败次数和锁定时间都是可配置的。

本节介绍密码管理选项的语法。有关建立密码管理策略的信息,请参阅 第 8.2.15 节“密码管理”

如果指定了多个给定类型的密码管理选项,则最后一个选项优先。例如,PASSWORD EXPIRE DEFAULT PASSWORD EXPIRE NEVERPASSWORD EXPIRE NEVER 相同。

注意

除了与登录失败跟踪相关的选项外,密码管理选项仅适用于使用将凭据存储在 MySQL 内部身份验证插件的帐户。对于使用插件针对 MySQL 外部凭据系统执行身份验证的帐户,密码管理也必须针对该系统在外部进行处理。有关内部凭据存储的更多信息,请参阅 第 8.2.15 节“密码管理”

如果帐户密码已手动过期或密码有效期被视为超过其允许的自动过期策略,则客户端的密码已过期。在这种情况下,服务器将断开客户端连接或限制允许对其执行的操作(请参阅 第 8.2.16 节“服务器对过期密码的处理”)。受限客户端执行的操作会导致错误,直到用户建立新的帐户密码。

CREATE USER 允许使用以下 password_option 值来控制密码过期

  • PASSWORD EXPIRE

    立即将语句中命名的所有帐户的密码标记为过期。

    CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE;
  • PASSWORD EXPIRE DEFAULT

    设置语句中命名的所有帐户,以便应用全局过期策略,如 default_password_lifetime 系统变量所指定。

    CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT;
  • PASSWORD EXPIRE NEVER

    此过期选项会覆盖语句中命名的所有帐户的全局策略。对于每个帐户,它都禁用密码过期,以便密码永不过期。

    CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;
  • PASSWORD EXPIRE INTERVAL N DAY

    此过期选项会覆盖语句中命名的所有帐户的全局策略。对于每个帐户,它都将密码有效期设置为 N 天。以下语句要求每 180 天更改一次密码

    CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 180 DAY;

CREATE USER 允许使用以下 password_option 值,根据所需的最小密码更改次数来控制先前密码的重用

  • PASSWORD HISTORY DEFAULT

    设置语句中命名的所有帐户,以便应用有关密码历史记录长度的全局策略,以禁止在 password_history 系统变量指定的更改次数之前重用密码。

    CREATE USER 'jeffrey'@'localhost' PASSWORD HISTORY DEFAULT;
  • PASSWORD HISTORY N

    此历史记录长度选项会覆盖语句中命名的所有帐户的全局策略。对于每个帐户,它都将密码历史记录长度设置为 N 个密码,以禁止重用最近选择的任何 N 个密码。以下语句禁止重用之前的 6 个密码中的任何一个

    CREATE USER 'jeffrey'@'localhost' PASSWORD HISTORY 6;

CREATE USER 允许使用以下 password_option 值,根据经过的时间来控制先前密码的重用

  • PASSWORD REUSE INTERVAL DEFAULT

    设置帐户命名的所有语句,以便应用有关经过时间的全局策略,以禁止重用比 password_reuse_interval 系统变量指定的天数更新的密码。

    CREATE USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL DEFAULT;
  • PASSWORD REUSE INTERVAL N DAY

    此经过时间选项会覆盖语句中命名的所有帐户的全局策略。对于每个帐户,它都将密码重用间隔设置为 N 天,以禁止重用比该天数更新的密码。以下语句禁止在 360 天内重用密码

    CREATE USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL 360 DAY;

CREATE USER 允许使用以下 password_option 值,以控制尝试更改帐户密码是否必须指定当前密码,以验证尝试进行更改的用户是否确实知道当前密码

  • PASSWORD REQUIRE CURRENT

    此验证选项会覆盖语句中命名的所有帐户的全局策略。对于每个帐户,它都要求密码更改指定当前密码。

    CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT;
  • PASSWORD REQUIRE CURRENT OPTIONAL

    此验证选项会覆盖语句中命名的所有帐户的全局策略。对于每个帐户,它不要求密码更改指定当前密码。(可以提供当前密码,但不是必须提供。)

    CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT OPTIONAL;
  • PASSWORD REQUIRE CURRENT DEFAULT

    设置帐户命名的所有语句,以便应用有关密码验证的全局策略,如 password_require_current 系统变量所指定。

    CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT DEFAULT;

CREATE USER 允许使用以下 password_option 值来控制登录失败跟踪

  • FAILED_LOGIN_ATTEMPTS N

    是否跟踪指定了错误密码的帐户登录尝试。N 必须是 0 到 32767 之间的数字。值为 0 表示禁用登录失败跟踪。大于 0 的值表示多少次连续密码失败会导致帐户被临时锁定(如果 PASSWORD_LOCK_TIME 也不为零)。

  • PASSWORD_LOCK_TIME {N | UNBOUNDED}

    在太多次连续登录尝试提供错误密码后锁定帐户的时间。N 必须是 0 到 32767 之间的数字,或者为 UNBOUNDED。值为 0 表示禁用临时帐户锁定。大于 0 的值表示以天为单位锁定帐户的时间。值为 UNBOUNDED 会导致帐户锁定持续时间不受限制;一旦锁定,帐户将保持锁定状态,直到解锁。有关解锁条件的信息,请参阅 登录失败跟踪和临时帐户锁定

要进行登录失败跟踪和临时锁定,帐户的 FAILED_LOGIN_ATTEMPTSPASSWORD_LOCK_TIME 选项都必须为非零值。以下语句创建一个帐户,该帐户在连续四次密码失败后将被锁定两天

CREATE USER 'jeffrey'@'localhost'
  FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME 2;
创建用户注释和属性选项

您还可以在创建用户时包含可选的注释或属性,如下所述

  • 用户注释

    要设置用户注释,请将 COMMENT 'user_comment' 添加到 CREATE USER 语句中,其中 user_comment 是用户注释的文本。

    示例(省略任何其他选项)

    CREATE USER 'jon'@'localhost' COMMENT 'Some information about Jon';
  • 用户属性

    用户属性是由一个或多个键值对组成的 JSON 对象,通过在 CREATE USER 中包含 ATTRIBUTE 'json_object' 来设置。json_object 必须是有效的 JSON 对象。

    示例(省略任何其他选项)

    CREATE USER 'jim'@'localhost'
        ATTRIBUTE '{"fname": "James", "lname": "Scott", "phone": "123-456-7890"}';

用户注释和用户属性一起存储在信息架构 USER_ATTRIBUTES 表的 ATTRIBUTE 列中。此查询显示此表中由刚才显示的用于创建用户 jim@localhost 的语句插入的行

mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->    WHERE USER = 'jim' AND HOST = 'localhost'\G
*************************** 1. row ***************************
     USER: jim
     HOST: localhost
ATTRIBUTE: {"fname": "James", "lname": "Scott", "phone": "123-456-7890"}
1 row in set (0.00 sec)

COMMENT 选项实际上提供了一种快捷方式,用于设置用户属性,该属性的唯一元素的键为 comment,其值为为该选项提供的参数。您可以通过执行语句 CREATE USER 'jon'@'localhost' COMMENT '关于 Jon 的一些信息' 并观察它插入到 USER_ATTRIBUTES 表中的行来看到这一点

mysql> CREATE USER 'jon'@'localhost' COMMENT 'Some information about Jon';
Query OK, 0 rows affected (0.06 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->    WHERE USER = 'jon' AND HOST = 'localhost';
+------+-----------+-------------------------------------------+
| USER | HOST      | ATTRIBUTE                                 |
+------+-----------+-------------------------------------------+
| jon  | localhost | {"comment": "Some information about Jon"} |
+------+-----------+-------------------------------------------+
1 row in set (0.00 sec)

您不能在同一个 CREATE USER 语句中同时使用 COMMENTATTRIBUTE;尝试这样做会导致语法错误。要与设置用户属性同时设置用户注释,请使用 ATTRIBUTE,并在其参数中包含一个值为 comment 键的值,如下所示

mysql> CREATE USER 'bill'@'localhost'
    ->        ATTRIBUTE '{"fname":"William", "lname":"Schmidt",
    ->        "comment":"Website developer"}';
Query OK, 0 rows affected (0.16 sec)

由于 ATTRIBUTE 行的内容是一个 JSON 对象,因此您可以使用任何适当的 MySQL JSON 函数或运算符来操作它,如下所示

mysql> SELECT
    ->   USER AS User,
    ->   HOST AS Host,
    ->   CONCAT(ATTRIBUTE->>"$.fname"," ",ATTRIBUTE->>"$.lname") AS 'Full Name',
    ->   ATTRIBUTE->>"$.comment" AS Comment
    -> FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    -> WHERE USER='bill' AND HOST='localhost';
+------+-----------+-----------------+-------------------+
| User | Host      | Full Name       | Comment           |
+------+-----------+-----------------+-------------------+
| bill | localhost | William Schmidt | Website developer |
+------+-----------+-----------------+-------------------+
1 row in set (0.00 sec)

要设置或更改现有用户的用户注释或用户属性,可以使用带有 COMMENTATTRIBUTE 选项的 ALTER USER 语句。

因为用户注释和用户属性在内部存储在一个 JSON 列中,所以这为它们的组合最大大小设置了一个上限;有关详细信息,请参阅 JSON 存储要求

有关更多信息和示例,另请参阅信息架构 USER_ATTRIBUTES 表的说明。

创建用户帐户锁定选项

MySQL 支持使用 ACCOUNT LOCKACCOUNT UNLOCK 选项进行帐户锁定和解锁,这些选项指定帐户的锁定状态。有关其他讨论,请参阅 第 8.2.20 节“帐户锁定”

如果指定了多个帐户锁定选项,则最后一个选项优先。

CREATE USER 二进制日志记录

如果 CREATE USER 语句成功,则会写入二进制日志;如果失败,则不会写入二进制日志;在这种情况下,会发生回滚,并且不会进行任何更改。写入二进制日志的语句包括所有命名的用户。如果给出了 IF NOT EXISTS 子句,则即使是已经存在且未创建的用户也会包括在内。

写入二进制日志的语句为每个用户指定一个身份验证插件,确定方式如下:

  • 如果指定了插件,则使用原始语句中命名的插件。

  • 否则,使用默认的身份验证插件。特别是,如果用户 u1 已经存在并且使用非默认的身份验证插件,则为 CREATE USER IF NOT EXISTS u1 写入二进制日志的语句会命名默认的身份验证插件。(如果写入二进制日志的语句必须为用户指定非默认的身份验证插件,请将其包含在原始语句中。)

如果服务器在写入二进制日志的语句中为任何不存在的用户添加了默认的身份验证插件,它会向错误日志写入一条警告,其中会列出这些用户的名称。

如果原始语句指定了 FAILED_LOGIN_ATTEMPTSPASSWORD_LOCK_TIME 选项,则写入二进制日志的语句会包含该选项。

包含支持多因素身份验证 (MFA) 的子句的 CREATE USER 语句将被写入二进制日志。

  • CREATE USER ... IDENTIFIED WITH .. INITIAL AUTHENTICATION IDENTIFIED WITH ... 语句将以 CREATE USER .. IDENTIFIED WITH .. INITIAL AUTHENTICATION IDENTIFIED WITH .. AS 'password-hash' 的形式写入二进制日志,其中 password-hash 是用户指定的 auth-string 或服务器在指定 RANDOM PASSWORD 子句时生成的随机密码。