Documentation Home

6.2.9 分配帐户密码

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

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

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

MySQL 使用插件来执行客户端身份验证;请参阅 第 6.2.11 节,“可插入身份验证”。在密码分配语句中,与帐户关联的身份验证插件执行指定的明文密码所需的任何散列。这使 MySQL 能够在将密码存储到mysql.user系统表之前混淆密码。对于此处描述的大多数语句,MySQL 会自动散列指定的密码。一个例外是 ,您可以 明确地使用该函数来散列密码。还有 , , 的语法 ,它 允许按字面意思指定散列值。有关详细信息,请参阅这些语句的描述。 SET PASSWORD ... = PASSWORD('auth_string')PASSWORD()CREATE USERGRANTSET PASSWORD

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

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

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

要为现有帐户分配或更改密码,请使用 SET PASSWORD以下 PASSWORD()功能:

SET PASSWORD FOR 'jeffrey'@'localhost' = PASSWORD('password');

FOR如果您不是以匿名用户身份连接,则可以通过省略以下子句 来更改自己的密码:

SET PASSWORD = PASSWORD('password');

该函数使用由系统变量值PASSWORD()的值确定的哈希方法对密码进行哈希处理 。old_passwords如果因格式不正确而SET PASSWORD拒绝返回的散列密码值 PASSWORD(),则可能需要更改 old_passwords以更改散列方法。请参阅第 13.7.1.7 节,“SET PASSWORD 语句”

GRANT USAGE 在全局级别 使用语句 ( ON *.*) 更改帐户密码而不影响帐户的当前权限:

GRANT USAGE ON *.* TO 'jeffrey'@'localhost' IDENTIFIED BY 'password';

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

mysqladmin -u user_name -h host_name password "password"

此命令为其设置密码的帐户是mysql.user系统表中的行与列中user_name的 行和列中您连接User客户端主机相匹配的帐户 。 Host

警告

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

如果您正在使用 MySQL 复制,请注意,目前,副本作为 CHANGE MASTER TO语句的一部分使用的密码的长度实际上限制为 32 个字符;如果密码较长,则会截断任何多余的字符。这不是由于 MySQL 服务器通常强加的任何限制,而是 MySQL 复制特有的问题。(有关更多信息,请参阅错误 #43439。)