连接到 MySQL 服务器的客户端所需的凭据可能包括密码。本节介绍如何为 MySQL 帐户分配密码。
MySQL 将凭据存储在 mysql
系统数据库中的 user
表中。分配或修改密码的操作仅允许具有 CREATE USER
权限的用户执行,或者具有 mysql
数据库的权限(INSERT
权限以创建新帐户,UPDATE
权限以修改现有帐户)。如果 read_only
系统变量已启用,则使用帐户修改语句(如 CREATE USER
或 ALTER USER
)还需要 CONNECTION_ADMIN
权限(或已弃用的 SUPER
权限)。
此处讨论仅总结了最常见的密码分配语句的语法。有关其他可能性的完整详细信息,请参见 第 15.7.1.3 节,“CREATE USER 语句”、第 15.7.1.1 节,“ALTER USER 语句” 和 第 15.7.1.10 节,“SET PASSWORD 语句”。
MySQL 使用插件执行客户端身份验证;请参见 第 8.2.17 节,“可插拔身份验证”。在密码分配语句中,与帐户关联的身份验证插件执行对指定明文密码所需的任何哈希操作。这使 MySQL 能够在将密码存储到 mysql.user
系统表之前对其进行混淆。对于此处描述的语句,MySQL 会自动对指定的密码进行哈希处理。还有一些 CREATE USER
和 ALTER USER
的语法允许按字面意义指定哈希值。有关详细信息,请参见这些语句的描述。
要创建新帐户时分配密码,请使用 CREATE USER
并包含 IDENTIFIED BY
子句
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
CREATE USER
还支持用于指定帐户身份验证插件的语法。请参见 第 15.7.1.3 节,“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
系统表中的一行,该行在 User
列中匹配 user_name
,并在 Host
列中匹配 您连接到的客户端主机。
使用 mysqladmin 设置密码被认为是 不安全的。在某些系统上,您的密码可能会对系统状态程序(如 ps)可见,其他用户可以使用这些程序来显示命令行。MySQL 客户端通常会在其初始化序列期间将命令行密码参数覆盖为零。但是,在短暂的时间段内,该值仍然可见。此外,在某些系统上,这种覆盖策略无效,密码仍然对 ps 可见。(SystemV Unix 系统以及可能的其他系统存在此问题。)
如果您使用的是 MySQL 复制,请注意,副本在 CHANGE REPLICATION SOURCE TO
中使用的密码实际上限制为 32 个字符;如果密码更长,则会截断多余的字符。这并非由于 MySQL 服务器通常施加的任何限制,而是 MySQL 复制特有的问题。