6.2.10 分配帐户密码

连接到 MySQL 服务器的 Client 端所需的凭据可以包括密码。本节介绍如何为 MySQL 帐户分配密码。

MySQL 将凭据存储在mysql系统数据库的usertable 中。分配或修改密码的操作仅允许具有CREATE USER特权或mysql数据库特权(具有创建新帐户的INSERT特权,具有现有帐户的UPDATE特权)的用户。如果启用了read_only系统变量,则使用CREATE USERALTER USER之类的帐户修改语句还需要SUPER特权。

此处的讨论仅汇总了最常见的密码分配语句的语法。有关其他可能性的完整详细信息,请参见第 13.7.1.2 节“ CREATE USER 语句”第 13.7.1.1 节“ ALTER USER 语句”第 13.7.1.4 节“ GRANT 语句”第 13.7.1.7 节“ SET PASSWORD 语句”

MySQL 使用插件执行 Client 端身份验证;参见第 6.2.13 节“可插入身份验证”。在密码分配语句中,与帐户关联的身份验证插件对指定的明文密码执行所需的任何哈希处理。这样,MySQL 可以先对密码进行混淆处理,然后再将其存储在mysql.user系统 table 中。对于此处描述的语句,MySQL 自动对指定的密码进行哈希处理。 CREATE USERALTER USER的语法也允许按字面值指定散列值。有关详细信息,请参见这些语句的描述。

要在创建新帐户时分配密码,请使用CREATE USER并包含IDENTIFIED BY子句:

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

CREATE USER还支持用于指定帐户身份验证插件的语法。参见第 13.7.1.2 节“ CREATE USER 语句”

要为现有帐户分配或更改密码,请使用带有IDENTIFIED BY子句的ALTER USER语句:

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

如果您不是以匿名用户身份连接的,则可以更改自己的密码,而无需直接命名自己的帐户:

ALTER USER USER() IDENTIFIED BY 'password';

要从命令行更改帐户密码,请使用mysqladmin命令:

mysqladmin -u user_name -h host_name password "password"

此命令为其设置密码的帐户是在mysql.user系统 table 中具有与User列中的* user_name 和在Host列中进行连接的 Client 端主机相匹配的行。

Warning

使用mysqladmin设置密码应视为不安全。在某些系统上,您的密码对系统状态程序(例如 ps )可见,其他用户可能会调用该密码来显示命令行。 MySQLClient 端通常在初始化序列期间用零覆盖命令行密码参数。但是,仍然存在一个短暂的时间间隔,在此间隔内该值是可见的。同样,在某些系统上,这种覆盖策略无效,并且密码对 ps 仍然可见。 (SystemV Unix 系统以及其他系统可能会遇到此问题.)

如果您使用的是 MySQL 复制,请注意,当前复制从属作为更改为主语句的一部分使用的密码长度实际上限制为 32 个字符;如果密码较长,则多余的字符将被截断。这并不是由于 MySQL Server 通常施加的任何限制,而是 MySQL 复制特有的问题。 (有关更多信息,请参见 Bug#43439.)