MySQL Shell 9.0  /  MySQL InnoDB 集群  /  InnoDB 集群的用户帐户

7.3 InnoDB 集群的用户帐户

InnoDB 集群中的成员服务器使用三种类型的用户帐户。一个 InnoDB 集群服务器配置帐户用于为集群配置服务器实例。可以创建一个或多个 InnoDB 集群管理员帐户,以便管理员在集群设置完成后管理服务器实例。可以为 MySQL Router 实例创建用于连接到集群的一个或多个 MySQL Router 帐户。每个用户帐户必须存在于 InnoDB 集群中的所有成员服务器上,并且具有相同的用户名和密码。

InnoDB 集群服务器配置帐户

此帐户用于创建和配置 InnoDB 集群的成员服务器。每个成员服务器只有一个服务器配置帐户。集群中的每个成员服务器上必须使用相同的用户帐户名和密码。您可以为此目的在服务器上使用 root 帐户,但如果这样做,则集群中每个成员服务器上的 root 帐户必须具有相同的密码。出于安全原因,不建议这样做。

首选方法是使用带有 clusterAdmin 选项的 dba.configureInstance() 命令创建 InnoDB 集群服务器配置帐户。为了提高安全性,请在交互式提示符下指定密码,否则使用 clusterAdminPassword 选项指定密码。在将成为 InnoDB 集群一部分的每个服务器实例(包括您连接以创建集群的实例以及之后将加入集群的实例)上,以相同的方式使用相同的用户名和密码创建相同的帐户。

dba.configureInstance() 命令会自动为该帐户授予所需的权限。如果您愿意,可以手动设置该帐户,并授予 手动配置 InnoDB 集群管理员帐户 中列出的权限。除了完整的 MySQL 管理员权限外,该帐户还需要对 InnoDB 集群元数据表的完整读写权限。

您使用 dba.configureInstance() 操作创建的 InnoDB 集群服务器配置帐户不会复制到 InnoDB 集群中的其他服务器。MySQL Shell 会为 dba.configureInstance() 操作禁用二进制日志记录。这意味着您必须在每个服务器实例上单独创建该帐户。

InnoDB 集群管理员帐户

这些帐户可用于在完成配置过程后管理 InnoDB 集群。您可以设置多个帐户。每个帐户必须存在于 InnoDB 集群中的每个成员服务器上,并且具有相同的用户名和密码。

要为 InnoDB ClusterSet 部署创建 InnoDB 集群管理员帐户,您需要在将所有实例添加到该集群后发出 cluster.setupAdminAccount() 命令。该命令将使用您指定的用户名和密码创建一个帐户,并具有所有必需的权限。使用 cluster.setupAdminAccount() 创建帐户的事务将写入二进制日志并发送到集群中的所有其他服务器实例,以便在这些实例上创建该帐户。

注意

如果主 InnoDB 集群是由 MySQL Shell 8.0.20 之前的版本设置的,则可以使用带有 update 选项的 cluster.setupAdminAccount() 命令来更新 InnoDB 集群服务器配置帐户的权限。这是该命令的一种特殊用法,不会写入二进制日志。

MySQL Router 帐户

MySQL Router 使用这些帐户连接到 InnoDB 集群中的服务器实例。您可以设置多个帐户。每个帐户必须存在于 InnoDB 集群中的每个成员服务器上,并且具有相同的用户名和密码。创建 MySQL Router 帐户的过程与创建 InnoDB 集群管理员帐户的过程相同,但使用的是 cluster.setupRouterAccount() 命令。有关创建或升级 MySQL Router 帐户的说明,请参阅 第 6.10.2 节“配置 MySQL Router 用户”

手动配置 InnoDB 集群管理员帐户

如果要手动配置 InnoDB 集群管理用户,则该用户需要此处列出的权限,所有权限都具有 GRANT OPTION

注意

此权限列表基于当前版本的 MySQL Shell。权限可能会因版本而异。因此,设置管理帐户的推荐方法是使用 dba.configureInstance()cluster.setupAdminAccount() 操作。

重要

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

如果只需要读取操作(例如,创建用于监控目的的用户),则可以使用权限更受限制的帐户。要向用户 your_user 授予监控 InnoDB 集群问题所需的权限,请执行以下操作:

GRANT SELECT ON mysql_innodb_cluster_metadata.* TO your_user@'%';
GRANT SELECT ON mysql.user TO your_user@'%';
GRANT SELECT ON performance_schema.global_status TO your_user@'%';
GRANT SELECT ON performance_schema.global_variables TO your_user@'%';
GRANT SELECT ON performance_schema.replication_applier_configuration TO your_user@'%';
GRANT SELECT ON performance_schema.replication_applier_status TO your_user@'%';
GRANT SELECT ON performance_schema.replication_applier_status_by_coordinator TO your_user@'%';
GRANT SELECT ON performance_schema.replication_applier_status_by_worker TO your_user@'%';
GRANT SELECT ON performance_schema.replication_connection_configuration TO your_user@'%';
GRANT SELECT ON performance_schema.replication_connection_status TO your_user@'%';
GRANT SELECT ON performance_schema.replication_group_member_stats TO your_user@'%';
GRANT SELECT ON performance_schema.replication_group_members TO your_user@'%';
GRANT SELECT ON performance_schema.threads TO your_user@'%' WITH GRANT OPTION;

有关更多信息,请参阅 帐户管理语句

由 InnoDB 集群创建的内部用户帐户

作为使用组复制的一部分,InnoDB 集群会创建内部恢复用户,以启用集群中服务器之间的连接。这些用户是集群内部的用户,生成的用户的用户名遵循 mysql_innodb_cluster_server_id@% 的命名方案,其中 server_id 对于实例是唯一的。在 8.0.17 之前的版本中,生成的用户的用户名遵循 mysql_innodb_cluster_r[10_numbers] 的命名方案。

这些内部用户使用的主机名设置为“%”。有关更多信息,请参阅创建服务器允许列表

每个内部用户都有一个随机生成的密码。AdminAPI 允许您更改内部用户的生成密码。请参阅 重置恢复帐户密码。随机生成的用户将被授予以下权限:

GRANT REPLICATION SLAVE ON *.* to internal_user;

内部用户帐户在种子实例上创建,然后复制到集群中的其他实例。内部用户是:

  • 通过发出 dba.createCluster() 创建新集群时生成

  • 通过发出 Cluster.addInstance() 向集群添加新实例时生成

  • 使用主成员使用的身份验证插件生成

有关组复制所需的内部用户的更多信息,请参阅 分布式恢复的用户凭据

重置恢复帐户密码

您可以使用 Cluster.resetRecoveryAccountsPassword() 操作重置由 InnoDB 集群创建的内部恢复帐户的密码,例如,遵循自定义密码有效期策略。使用 Cluster.resetRecoveryAccountsPassword() 操作重置集群使用的所有内部恢复帐户的密码。该操作会为联机的每个实例上的内部恢复帐户设置一个新的随机密码。如果无法访问某个实例,则操作失败。您可以使用 force 选项忽略此类实例,但这并不推荐,在使用此操作之前将实例恢复联机会更安全。此操作仅适用于由 InnoDB 集群创建的密码,不能用于更新手动创建的密码。

注意

执行此操作的用户必须拥有所有必需的管理权限,尤其是 CREATE USER,以确保无论密码验证要求策略如何,都可以更改恢复帐户的密码。换句话说,与 password_require_current 系统变量是否启用无关。