下载本手册
PDF (US Ltr) - 2.2Mb
PDF (A4) - 2.3Mb


MySQL Shell 8.4  /  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 集群集部署创建 InnoDB 集群管理员帐户,请在将所有实例添加到该集群后发出 cluster.setupAdminAccount() 命令。该命令会创建具有您指定的用户名和密码的帐户,并具有所有必需的权限。使用 cluster.setupAdminAccount() 创建帐户的事务将写入二进制日志,并发送到集群中的所有其他服务器实例,以便在这些实例上创建帐户。

注意

如果主要 InnoDB 集群是由 MySQL Shell 8.0.20 之前的 MySQL Shell 版本设置的,则 cluster.setupAdminAccount() 命令可能已与 update 选项一起使用来更新 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 集群集或 InnoDB 副本集部署的每个帐户都必须存在于部署中的所有成员服务器实例上,并具有相同的用户名和密码。

如果只需要读取操作,例如为监控目的创建用户,可以使用权限更受限制的帐户。要授予用户 your_user 监控 InnoDB Cluster 问题的必要权限

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 Cluster 创建的内部用户帐户

作为使用组复制的一部分,InnoDB Cluster 创建内部恢复用户,这些用户能够在集群中的服务器之间建立连接。这些用户是集群内部的,生成的用户的用户名遵循 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 创建的内部恢复帐户的密码,例如,遵循自定义密码生命周期策略。使用 Cluster.resetRecoveryAccountsPassword() 操作来重置集群使用的所有内部恢复帐户的密码。该操作会为每个在线实例上的内部恢复帐户设置一个新的随机密码。如果无法访问某个实例,则该操作将失败。您可以使用 force 选项忽略此类实例,但这不建议这样做,并且在使用此操作之前最好将该实例恢复联机。此操作仅适用于 InnoDB Cluster 创建的密码,不能用于更新手动创建的密码。

注意

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