连接到 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 USER
GRANT
SET
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。)