MySQL Shell 9.0  /  MySQL AdminAPI  /  为 AdminAPI 创建用户帐户

6.4 为 AdminAPI 创建用户帐户

用于在 InnoDB 集群、InnoDB 集群集或 InnoDB 副本集部署中配置和管理成员服务器实例的用户帐户必须对元数据表具有完全读取和写入权限,以及完整的 MySQL 管理员权限(SUPERGRANT OPTIONCREATEDROP 等等)。有关更多信息,请参阅 MySQL 提供的权限

您可以为此目的使用服务器上的 root 帐户,但如果您这样做,则部署中每个成员服务器上的 root 帐户必须具有相同的密码。出于安全原因,不建议使用 root 帐户。

建议的方法是使用 AdminAPI 的 JavaScript dba.configureInstance()cluster.setupAdminAccount() 操作来设置用户帐户。这些操作接受的用户名格式遵循标准 MySQL 帐户名格式,请参阅 指定帐户名

如果您更喜欢手动设置用户帐户,则所需的权限列在 手动配置 InnoDB 集群管理员帐户 中。如果只需要读取操作(例如,用于监控目的),则可以使用权限更受限的帐户,如本主题所述。

重要

用于配置或管理 InnoDB 集群、InnoDB 集群集或 InnoDB 副本集部署的每个帐户都必须存在于部署中的所有成员服务器实例上,并且具有相同的用户名和密码。

服务器配置帐户

要加入 InnoDB 集群、InnoDB 集群集或 InnoDB 副本集部署的每个服务器实例都需要一个服务器配置帐户。您可以使用 dba.configureInstance() JavaScript 命令或 dba.configure_instance() Python 命令(使用 clusterAdmin 选项)设置此帐户。

为了提高安全性,请在交互式提示符下指定密码,否则请使用 clusterAdminPassword 选项指定密码。在将成为部署一部分的每个服务器实例(包括您连接以创建部署的实例以及之后将加入的实例)上,以相同的方式创建具有相同用户名和密码的相同帐户。

您可以使用 clusterAdminPasswordExpiration 选项定义密码过期时间。此选项可以设置为天数、NEVER(永不过期)或 DEFAULT(使用系统默认值)。

如果您使用 SSL 证书进行身份验证,则可以使用 clusterAdminCertIssuerclusterAdminCertSubject 选项分别添加证书颁发者和主题。

您使用 dba.configureInstance() 操作创建的服务器配置帐户不会 复制到 InnoDB 集群、InnoDB 集群集或 InnoDB 副本集部署中的其他服务器。MySQL Shell 禁用 dba.configureInstance() 操作的二进制日志记录。因此,您必须在每个服务器实例上单独创建该帐户。

clusterAdmin 选项必须与基于具有创建具有适当权限的用户的权限的用户的 MySQL Shell 连接一起使用。在此 JavaScript 示例中,使用了 root 用户

mysql-js> dba.configureInstance('root@ic-1:3306', {clusterAdmin: "'icadmin'@'ic-1%'"});

同样,在此 Python 示例中,使用了 root 用户

mysql-py> dba.configure_instance('root@ic-1:3306', clusterAdmin="'icadmin'@'ic-1%'");

管理员帐户

在完成配置过程后,可以使用管理员帐户来管理部署。您可以设置多个管理员帐户。要创建管理员帐户,您需要在将所有实例添加到 InnoDB 集群或 InnoDB 副本集后发出 cluster.setupAdminAccount() JavaScript 命令。或者发出 Python 命令:<Cluster>setup_admin_account()

该命令将使用您指定的用户名和密码创建一个帐户,并授予所有必需的权限。使用 cluster.setupAdminAccount() 创建帐户的事务将写入二进制日志,并发送到集群中的所有其他服务器实例,以便在这些实例上创建帐户。

要使用 setupAdminAccount() 操作,您必须以具有创建用户权限的 MySQL 用户身份连接,例如 root 用户。setupAdminAccount(user) 操作还允许您在执行 dba.upgradeMetadata() JavaScript 操作或 dba.upgrade_metadata() Python 操作之前升级具有必要权限的现有 MySQL 帐户。

必需的 user 参数是要创建的 MySQL 帐户的名称,该帐户将用于管理部署。setupAdminAccount() 操作接受的用户名格式遵循标准 MySQL 帐户名格式。有关更多信息,请参阅 指定帐户名。用户参数格式为 username[@host],其中 host 是可选的,如果未提供,则默认为 % 通配符。

例如,要使用 JavaScript 创建名为 icadmin 的用户来管理分配给变量 myCluster 的 InnoDB 集群,请发出

mysql-js> myCluster.setupAdminAccount('icadmin')

Missing the password for new account icadmin@%. Please provide one.
Password for new account: ********
Confirm password: ********

Creating user icadmin@%.
Setting user password.
Account icadmin@% was successfully created.

或者使用 Python

mysql-py> myCluster.setup_admin_account('icadmin')

Missing the password for new account icadmin@%. Please provide one.
Password for new account: ********
Confirm password: ********

Creating user icadmin@%.
Setting user password.
Account icadmin@% was successfully created.

setupAdminAccount() 具有以下 SSL 特定选项

  • requireCertIssuer:帐户的可选 SSL 证书颁发者。

  • requireCertSubject:帐户的可选 SSL 证书主题。

  • passwordExpiration: numberOfDays | Never | Default:帐户的密码过期设置。

注意

如果设置了 requireCertIssuerrequireCertSubject(或两者都设置),则现有密码将变为可选。

更新旧帐户

如果您有一个使用 MySQL Shell 8.0.20 之前的版本创建的服务器配置帐户或管理员帐户,请将 update 选项与 setupAdminAccount() 操作一起使用以升级现有用户的权限。这在升级过程中非常重要,可以确保用户帐户兼容。例如,要使用 JavaScript 升级名为 icadmin 的用户,请发出

mysql-js> myCluster.setupAdminAccount('icadmin', {'update':1})
Updating user icadmin@%.
Account icadmin@% was successfully updated.

或者使用 Python

mysql-py> myCluster.setup_admin_account('icadmin',update=1})
Updating user icadmin@%.
Account icadmin@% was successfully updated.

这是 cluster.setupAdminAccount() 命令的一种特殊用法,它不会写入二进制日志。