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