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

6.4 为 AdminAPI 创建用户帐户

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

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

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

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

重要

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

服务器配置帐户

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

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

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

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

您使用 dba.configureInstance() 操作创建的服务器配置帐户 不会 复制到 InnoDB Cluster、InnoDB ClusterSet 或 InnoDB ReplicaSet 部署中的其他服务器。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 Cluster 或 InnoDB ReplicaSet 后发出 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 Cluster,请发出

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() 操作一起使用来升级现有用户的权限。这在升级期间很重要,以确保用户帐户兼容。例如,要升级名为 icadmin 的用户,请使用 JavaScript 发出

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() 命令的一种特殊用法,不会写入二进制日志。