MySQL8-中文参考-三十七-

MySQL8 中文参考(三十七)

原文:docs.oracle.com/javase/tutorial/reallybigindex.html

原文:dev.mysql.com/doc/refman/8.0/en/group-replication-upgrade-with-mysqlbackup.html

20.8.3.4 使用mysqlbackup进行组复制升级

作为一种供应方法的一部分,您可以使用 MySQL 企业备份将数据从一个组成员复制并恢复到新成员。但是,您不能直接使用此技术将从运行较旧版本 MySQL 的成员中获取的备份直接恢复到运行较新版本 MySQL 的成员。解决方案是将备份恢复到运行与备份来源成员相同版本 MySQL 的新服务器实例,然后升级该实例。此过程包括:

  • 从较旧组的成员使用mysqlbackup进行备份。参见第 20.5.6 节,“使用 MySQL 企业备份与组复制”。

  • 部署一个新的服务器实例,该实例必须运行与获取备份的较旧成员相同版本的 MySQL。

  • 使用mysqlbackup将备份从较旧成员恢复到新实例。

  • 在新实例上升级 MySQL,请参见第三章,升级 MySQL

重复此过程以创建适当数量的新实例,例如以处理故障转移。然后根据第 20.8.3.3 节,“组复制在线升级方法”将实例加入到组中。

20.9 组复制变量

原文:dev.mysql.com/doc/refman/8.0/en/group-replication-options.html

20.9.1 组复制系统变量

20.9.2 组复制状态变量

接下来的两个部分包含了关于 MySQL 服务器系统和服务器状态变量的信息,这些变量是特定于组复制插件的。

表 20.4 组复制变量和选项摘要

名称 命令行 选项文件 系统变量 状态变量 变量范围 动态
group_replication_advertise_recovery_endpoints 全局
group_replication_allow_local_lower_version_join 全局
group_replication_auto_increment_increment 全局
group_replication_autorejoin_tries 全局
group_replication_bootstrap_group 全局
group_replication_clone_threshold 全局
group_replication_communication_debug_options 全局
group_replication_communication_max_message_size 全局
group_replication_communication_stack 全局
group_replication_components_stop_timeout 全局
group_replication_compression_threshold 全局
group_replication_consistency 两者
group_replication_enforce_update_everywhere_checks 全局
group_replication_exit_state_action 全局
group_replication_flow_control_applier_threshold 全局
group_replication_flow_control_certifier_threshold 全局
group_replication_flow_control_hold_percent 全局
group_replication_flow_control_max_quota 全局
group_replication_flow_control_member_quota_percent 全局
group_replication_flow_control_min_quota 全局
group_replication_flow_control_min_recovery_quota 全局
group_replication_flow_control_mode 全局
group_replication_flow_control_period 全局
group_replication_flow_control_release_percent 全局
group_replication_force_members 全局
group_replication_group_name 全局
group_replication_group_seeds 全局
group_replication_gtid_assignment_block_size 全局
group_replication_ip_allowlist 全局
group_replication_ip_whitelist 全局
group_replication_local_address 全局
group_replication_member_expel_timeout 全局
group_replication_member_weight 全局
group_replication_message_cache_size 全局
group_replication_paxos_single_leader 全局
group_replication_poll_spin_loops 全局
group_replication_primary_member 全局
group_replication_recovery_complete_at 全局
group_replication_recovery_get_public_key 全局
group_replication_recovery_public_key_path 全局
group_replication_recovery_reconnect_interval ��局
group_replication_recovery_retry_count 全局
group_replication_recovery_ssl_ca 全局
group_replication_recovery_ssl_capath 全局
group_replication_recovery_ssl_cert 全局
group_replication_recovery_ssl_cipher 全局
group_replication_recovery_ssl_crl 全局
group_replication_recovery_ssl_crlpath 全局
group_replication_recovery_ssl_key 全局
group_replication_recovery_ssl_verify_server_cert 全局
group_replication_recovery_tls_ciphersuites 全局
group_replication_recovery_tls_version 全局
group_replication_recovery_use_ssl 全局
group_replication_single_primary_mode 全局
group_replication_ssl_mode 全局
group_replication_start_on_boot 全局
group_replication_transaction_size_limit 全局
group_replication_unreachable_majority_timeout 全局
group_replication_view_change_uuid 全局
名称 命令行 选项文件 系统变量 状态变量 变量范围 动态

20.9.1 Group Replication 系统变量

原文:dev.mysql.com/doc/refman/8.0/en/group-replication-system-variables.html

本节列出了特定于 Group Replication 插件的系统变量。

每个 Group Replication 系统变量的名称都以group_replication_为前缀。

注意

InnoDB Cluster 使用 Group Replication,但 Group Replication 系统变量的默认值可能与本节中记录的默认值不同。例如,在 InnoDB Cluster 中,group_replication_communication_stack的默认值是MYSQL,而不是默认 Group Replication 实现的XCOM

更多信息,请参阅 MySQL InnoDB Cluster。

一些 Group Replication 组成员的系统变量,包括一些 Group Replication 特定的系统变量和一些通用的系统变量,都是组范围的配置设置。这些系统变量在所有组成员上必须具有相同的值,并且需要对组进行完全重启(由具有group_replication_bootstrap_group=ON的服务器引导)才能使值更改生效。有关在所有成员已停止的组中重新启动的说明,请参阅 Section 20.5.2, “Restarting a Group”。

如果运行中的组对于组范围的配置设置有一个值设置,而加入的成员对于该系统变量有不同的值设置,则加入的成员在值匹配之前无法加入该组。如果组对于这些系统变量中的一个设置了一个值,而加入的成员不支持该系统变量,则无法加入该组。

以下系统变量是组范围的配置设置:

  • group_replication_single_primary_mode

  • group_replication_enforce_update_everywhere_checks

  • group_replication_gtid_assignment_block_size

  • group_replication_view_change_uuid

  • group_replication_paxos_single_leader

  • group_replication_communication_stack(这是一个特殊情况,不受 Group Replication 自身检查的限制;有关详细信息,请参阅系统变量描述)

  • default_table_encryption

  • lower_case_table_names

  • transaction_write_set_extraction(从 MySQL 8.0.26 开始已弃用)

在 Group Replication 运行时无法通过通常的方法更改组范围的配置设置。然而,从 MySQL 8.0.16 开始,您可以使用group_replication_switch_to_single_primary_mode()group_replication_switch_to_multi_primary_mode()函数在组仍在运行时更改group_replication_single_primary_modegroup_replication_enforce_update_everywhere_checks的值。更多信息,请参阅 Section 20.5.1.2, “Changing the Group Mode”。

大多数 Group Replication 的系统变量在不同的组成员上可以有不同的值。对于以下系统变量,建议在组的所有成员上设置相同的值,以避免事务不必要的回滚、消息传递失败或消息恢复失败:

  • group_replication_auto_increment_increment

  • group_replication_communication_max_message_size

  • group_replication_compression_threshold

  • group_replication_message_cache_size

  • group_replication_transaction_size_limit

大多数 Group Replication 的系统变量被描述为动态的,它们的值可以在服务器运行时更改。然而,在大多数情况下,更改只有在您使用STOP GROUP_REPLICATION语句停止并重新启动组复制后才会生效,随后是一个START GROUP_REPLICATION语句。以下系统变量的更改在不停止和重新启动 Group Replication 的情况下生效:

  • group_replication_advertise_recovery_endpoints

  • group_replication_autorejoin_tries

  • group_replication_consistency

  • group_replication_exit_state_action

  • group_replication_flow_control_applier_threshold

  • group_replication_flow_control_certifier_threshold

  • group_replication_flow_control_hold_percent

  • group_replication_flow_control_max_quota

  • group_replication_flow_control_member_quota_percent

  • group_replication_flow_control_min_quota

  • group_replication_flow_control_min_recovery_quota

  • group_replication_flow_control_mode

  • group_replication_flow_control_period

  • group_replication_flow_control_release_percent

  • group_replication_force_members

  • group_replication_ip_allowlist

  • group_replication_ip_whitelist

  • group_replication_member_expel_timeout

  • group_replication_member_weight

  • group_replication_transaction_size_limit

  • group_replication_unreachable_majority_timeout

当您更改任何 Group Replication 系统变量的值时,请记住,如果在每个成员同时通过 STOP GROUP_REPLICATION 语句或系统关闭停止 Group Replication 的某一点,那么必须像第一次启动一样通过引导重新启动组。有关安全执行此操作的说明,请参见 Section 20.5.2, “重新启动组”。对于整个组的配置设置,这是必需的,但如果您正在更改其他设置,请尽量确保至少有一个成员始终在运行。

重要

  • 如果将一些 Group Replication 的系统变量作为命令行参数传递给服务器,则在服务器启动期间,一些 Group Replication 的系统变量在启动时并未完全验证。这些系统变量包括 group_replication_group_namegroup_replication_single_primary_modegroup_replication_force_members、SSL 变量和流量控制系统变量。它们只在服务器启动后完全验证。

  • 指定组成员的 IP 地址或主机名的 Group Replication 系统变量在发出 START GROUP_REPLICATION 语句之前不会被验证。直到那时,Group Replication 的组通信系统 (GCS) 才可用于验证这些值。

专用于 Group Replication 插件的系统变量如下:

  • group_replication_advertise_recovery_endpoints

    命令行格式 --group-replication-advertise-recovery-endpoints=value
    引入版本 8.0.21
    系统变量 group_replication_advertise_recovery_endpoints
    作用范围 全局
    动态
    SET_VAR 提示适用
    类型 字符串
    默认值 DEFAULT

    此系统变量的值可以在 Group Replication 运行时更改。更改立即在成员上生效。但是,已经接收到系统变量先前值的加入成员将继续使用该值。只有在值更改后加入的成员才会接收新值。

    group_replication_advertise_recovery_endpoints指定加入成员如何为分布式恢复的状态传输与现有成员建立连接。该连接用于远程克隆操作和从捐赠者的二进制日志进行状态传输。

    值为DEFAULT,即默认设置,表示加入成员使用现有成员的标准 SQL 客户端连接,如 MySQL Server 的hostnameport系统变量所指定。如果report_port系统变量指定了替代端口号,则使用该端口号。性能模式表replication_group_membersMEMBER_HOSTMEMBER_PORT字段中显示此连接的地址和端口号。这是截至 MySQL 8.0.20 版本的组成员的行为。

    您可以指定一个或多个分布式恢复端点,而不是DEFAULT,现有成员向加入成员广告这些端点供其使用。提供分布式恢复端点可以让管理员单独控制分布式恢复流量,与对组成员的常规 MySQL 客户端连接分开。加入成员按照列表上指定的顺序依次尝试每个端点。

    将分布式恢复端点指定为逗号分隔的 IP 地址和端口号列表,例如:

    group_replication_advertise_recovery_endpoints= "127.0.0.1:3306,127.0.0.1:4567,[::1]:3306,localhost:3306"
    

    IPv4 和 IPv6 地址以及主机名可以任意组合使用。IPv6 地址必须在方括号中指定。主机名必须解析为本地 IP 地址。不能使用通配符地址格式,也不能指定空列表。请注意,标准 SQL 客户端连接不会自动包含在分布式恢复端点列表中。如果要将其用作端点,必须在列表中明确包含它。

    有关如何选择 IP 地址和端口作为分布式恢复端点,以及加入成员如何使用它们的详细信息,请参见 Section 20.5.4.1.1,“选择分布式恢复端点的地址”。要求的摘要如下:

    • IP 地址不必为 MySQL Server 配置,但必须分配给服务器。

    • 端口必须使用portreport_portadmin_port系统变量为 MySQL Server 配置。

    • 如果使用admin_port,则需要为分布式恢复的复制用户授予适当的权限。

    • IP 地址不需要添加到由group_replication_ip_allowlistgroup_replication_ip_whitelist系统变量指定的组复制允许列表中。

    • 连接的 SSL 要求由group_replication_recovery_ssl_*选项指定。

  • group_replication_allow_local_lower_version_join

    命令行格式 --group-replication-allow-local-lower-version-join[={OFF|ON}]
    系统变量 group_replication_allow_local_lower_version_join
    范围 全局
    动态
    SET_VAR提示适用
    类型 布尔值
    默认值 OFF

    此系统变量的值可以在运行 Group Replication 时更改,但更改仅在您停止并重新启动组成员上的 Group Replication 后生效。

    group_replication_allow_local_lower_version_join允许当前服务器即使运行低于组的 MySQL 服务器版本也加入组。默认设置为OFF,如果运行低于现有组成员的版本,则不允许服务器加入复制组。此标准策略确保组的所有成员能够交换消息并应用事务。请注意,运行 MySQL 8.0.17 或更高版本的成员在检查兼容性时考虑发布的补丁版本。运行 MySQL 8.0.16 或更低版本,或 MySQL 5.7 的成员只考虑主要版本。

    仅在以下情况下将group_replication_allow_local_lower_version_join设置为ON

    • 必须在紧急情况下将服务器添加到组中以提高组的容错能力,且只有旧版本可用。

    • 您希望为一个或多个复制组成员回滚升级,而无需关闭整个组并重新引导。

    警告

    将此选项设置为ON并不会使新成员与组兼容,并允许其加入组而没有任何防范措施防止现有成员的不兼容行为。为确保新成员的正确操作,请采取以下两项预防措施:

    1. 在运行较低版本的服务器加入组之前,请停止该服务器上的所有写操作。

    2. 从运行较低版本的服务器加入组的那一点开始,在组中的其他服务器上停止所有写操作。

    如果没有这些预防措施,运行较低版本的服务器很可能会遇到困难,并以错误终止。

  • group_replication_auto_increment_increment

    命令行格式 --group-replication-auto-increment-increment=#
    系统变量 group_replication_auto_increment_increment
    范围 全局
    动态
    SET_VAR提示适用
    类型 整数
    默认值 7
    最小值 1
    最大值 65535

    所有组成员的此系统变量应具有相同的值。在 Group Replication 运行时,您不能更改此系统变量的值。您必须停止 Group Replication,更改系统变量的值,然后在每个组成员上重新启动 Group Replication。在此过程中,系统变量的值允许在组成员之间有所不同,但是一些组成员上的事务可能会被回滚。

    group_replication_auto_increment_increment确定在此服务器实例上执行的事务的自增列的连续值之间的间隔。增加一个间隔可以避免在组成员上写入时选择重复的自增值,这会导致事务回滚。默认值 7 代表可用值的数量和复制组的允许最大大小(9 个成员)之间的平衡。如果您的组成员更多或更少,您可以在启动 Group Replication 之前将此系统变量设置为匹配预期的组成员数量。

    重要

    group_replication_single_primary_modeON时,设置group_replication_auto_increment_increment不起作用。

    当在服务器实例上启动组复制时,服务器系统变量auto_increment_increment的值将更改为此值,服务器系统变量auto_increment_offset的值将更改为服务器 ID。当停止组复制时,这些更改将被还原。仅当auto_increment_incrementauto_increment_offset的默认值均为 1 时,才会进行这些更改和还原。如果它们的值已经从默认值修改过,则组复制不会更改它们。在 MySQL 8.0 中,当组复制处于单主模式时,系统变量也不会被修改,只有一个服务器进行写入。

  • group_replication_autorejoin_tries

    命令行格式 --group-replication-autorejoin-tries=#
    引入版本 8.0.16
    系统变量 group_replication_autorejoin_tries
    作用范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值(≥ 8.0.21) 3
    默认值(≤ 8.0.20) 0
    最小值 0
    最大值 2016

    可以在组复制运行时更改此系统变量的值,并且更改会立即生效。当发生需要该行为的问题时,会读取系统变量的当前值。

    group_replication_autorejoin_tries指定成员在被驱逐或在达到group_replication_unreachable_majority_timeout设置之前无法联系到大多数组时,尝试自动重新加入组的次数。当成员被驱逐或无法联系到大多数组时,它会尝试重新加入(使用当前插件选项值),然后继续进行进一步的自动重新加入尝试,直到达到指定的尝试次数。在一次不成功的自动重新加入尝试后,成员会在下一次尝试之前等待 5 分钟。如果在没有成员重新加入或停止的情况下耗尽了指定的尝试次数,则成员将执行由group_replication_exit_state_action系统变量指定的操作。

    在 MySQL 8.0.20 版本之前,默认设置为 0,表示成员不会尝试自动重新加入。从 MySQL 8.0.21 开始,默认设置为 3,表示成员会自动尝试重新加入群组,每次间隔 5 分钟,最多可以指定 2016 次尝试。

    在自动重新加入尝试期间和之间,成员保持在超级只读模式,并且不接受写入,但仍然可以在成员上进行读取,随着时间的推移,过时读取的可能性会增加。如果无法容忍任何时间段内可能出现的过时读取,请将 group_replication_autorejoin_tries 设置为 0。有关自动重新加入功能的更多信息以及在选择此选项的值时的考虑事项,请参见 第 20.7.7.3 节,“自动重新加入”。

  • group_replication_bootstrap_group

    命令行格式 --group-replication-bootstrap-group[={OFF|ON}]
    系统变量 group_replication_bootstrap_group
    范围 全局
    动态
    SET_VAR 提示适用
    类型 布尔值
    默认值 OFF

    group_replication_bootstrap_group 配置此服务器引导群组。此系统变量应在一个服务器上设置,并且在第一次启动群组或重新启动整个群组时设置。群组引导完成后,将此选项设置为 OFF。应在动态和配置文件中将其设置为 OFF。在运行群组时启动两个服务器或重新启动一个服务器并将此选项设置可能会导致人为的脑裂情况,即引导两个具有相同名称的独立群组。

    有关首次引导群组的说明,请参见 第 20.2.1.5 节,“引导群组”。有关在已执行和认证事务的情况下安全引导群组的说明,请参见 第 20.5.2 节,“重新启动群组”。

  • group_replication_clone_threshold

    命令行格式 --group-replication-clone-threshold=#
    引入版本 8.0.17
    系统变量 group_replication_clone_threshold
    范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 9223372036854775807
    最小值 1
    最大值 9223372036854775807
    单位 事务

    在 Group Replication 运行时可以更改此系统变量的值,但更改只有在停止并重新启动组成员的 Group Replication 后才会生效。

    group_replication_clone_threshold 指定现有成员(捐赠者)和加入成员(接收者)之间的事务间隔,触发在分布式恢复过程中使用远程克隆操作将状态传输给加入成员。如果加入成员和合适的捐赠者之间的事务间隔超过阈值,则 Group Replication 将开始使用远程克隆操作进行分布式恢复。如果事务间隔低于阈值,或者远程克隆操作在技术上不可行,则 Group Replication 直接从捐赠者的二进制日志进行状态传输。

    警告

    在活动组中不要使用低设置的 group_replication_clone_threshold。如果在远程克隆操作正在进行时组中发生超过阈值的事务数量,加入成员在重新启动后会再次触发远程克隆操作,并可能无限继续。为避免这种情况,请确保将阈值设置为预期在远程克隆操作所需时间内组中可能发生的事务数量更高的数字。

    要使用此功能,捐赠者和加入成员必须事先设置为支持克隆。有关说明,请参见 Section 20.5.4.2, “分布式恢复的克隆”。当执行远程克隆操作时,Group Replication 会为您管理它,包括所需的服务器重新启动,前提是设置了 group_replication_start_on_boot=ON。如果没有设置,则必须手动重新启动服务器。远程克隆操作会替换加入成员上的现有数据字典,但如果加入成员有其他组成员上不存在的额外事务,则 Group Replication 会进行检查并不继续进行,因为这些事务将被克隆操作擦除。

    默认设置(即 GTID 中事务的最大允许序列号)意味着几乎总是尝试从捐赠者的二进制日志进行状态传输,而不是克隆。但是,请注意,无论您的阈值如何,Group Replication 始终尝试执行克隆操作,如果从捐赠者的二进制日志中无法进行状态传输,例如因为加入成员所需的事务在任何现有组成员的二进制日志中都不可用。如果您不希望在复制组中完全使用克隆,请不要在成员上安装克隆插件。

  • group_replication_communication_debug_options

    命令行格式 --group-replication-communication-debug-options=value
    系统变量 group_replication_communication_debug_options
    范围 全局
    动态
    SET_VAR提示适用
    类型 字符串
    默认值 GCS_DEBUG_NONE
    有效数值 GCS_DEBUG_NONE``GCS_DEBUG_BASIC``GCS_DEBUG_TRACE``XCOM_DEBUG_BASIC``XCOM_DEBUG_TRACE``GCS_DEBUG_ALL

    在 Group Replication 运行时可以更改此系统变量的值,并立即生效。

    group_replication_communication_debug_options 配置不同 Group Replication 组件(如 Group Communication System(GCS)和组通信引擎(XCom,一种 Paxos 变体))提供的调试消息级别。调试信息存储在数据目录中的GCS_DEBUG_TRACE文件中。

    可以组合作为字符串指定的可用选项集。以下选项可用:

    • GCS_DEBUG_NONE 禁用 GCS 和 XCom 的所有调试级别。

    • GCS_DEBUG_BASIC 在 GCS 中启用基本调试信息。

    • GCS_DEBUG_TRACE 在 GCS 中启用跟踪信息。

    • XCOM_DEBUG_BASIC 在 XCom 中启用基本调试信息。

    • XCOM_DEBUG_TRACE 在 XCom 中启用跟��信息。

    • GCS_DEBUG_ALL 在 GCS 和 XCom 中启用所有调试级别。

    将调试级别设置为GCS_DEBUG_NONE仅在没有任何其他选项的情况下提供时才生效。将调试级别设置为GCS_DEBUG_ALL会覆盖所有其他选项。

  • group_replication_communication_max_message_size

    命令行格式 --group-replication-communication-max-message-size=#
    引入 8.0.16
    系统变量 group_replication_communication_max_message_size
    范围 全局
    动态
    SET_VAR提示适用
    类型 整数
    默认值 10485760
    最小值 0
    最大值 1073741824
    单位 字节

    所有组成员应该具有相同的系统变量值。在组复制运行时,无法更改此系统变量的值。您必须停止组复制,更改系统变量的值,然后在每个组成员上重新启动组复制。在此过程中,系统变量的值允许在组成员之间有所不同,但某些组成员上的事务可能会被回滚。

    group_replication_communication_max_message_size指定了组复制通信的最大消息大小。超过此大小的消息会自动分割成片段单独发送,并由接收方重新组装。更多信息,请参见第 20.7.5 节,“消息分段”。

    默认情况下,最大消息大小为 10485760 字节(10 MiB),这意味着在 MySQL 8.0.16 版本中默认使用分段。最大允许值与replica_max_allowed_packetslave_max_allowed_packet系统变量的最大值相同,即 1073741824 字节(1 GB)。group_replication_communication_max_message_size的设置必须小于replica_max_allowed_packetslave_max_allowed_packet的设置,因为应用程序线程无法处理大于最大允许数据包大小的消息片段。要关闭分段,请为group_replication_communication_max_message_size指定零值。

    为了使复制组的成员使用分段,组的通信协议版本必须是 MySQL 8.0.16 或更高。使用group_replication_get_communication_protocol()函数查看组的通信协议版本。如果使用较低版本,则组成员不会分段消息。如果所有组成员支持,可以使用group_replication_set_communication_protocol()函数将组的通信协议设置为更高版本。更多信息,请参阅 Section 20.5.1.4, “设置组的通信协议版本”。

  • group_replication_communication_stack

    引入版本 8.0.27
    系统变量 group_replication_communication_stack
    作用范围 全局
    动态
    SET_VAR提示适用
    类型 字符串
    默认值 XCOM
    有效值 XCOM``MYSQL

    注意

    这个系统变量实际上是一个整个组的配置设置,更改生效需要对复制组进行完全重启。

    group_replication_communication_stack指定了是使用 XCom 通信栈还是 MySQL 通信栈来建立组成员之间的组通信连接。XCom 通信栈是 Group Replication 自己的实现,在 MySQL 8.0.27 之前的所有版本中始终使用,并且不支持认证或网络命名空间。MySQL 通信栈是 MySQL 服务器的本机实现,支持认证和网络命名空间,并在发布后立即访问新的安全功能。组的所有成员必须使用相同的通信栈。

    当你使用 MySQL 的通信栈代替 XCom 时,MySQL 服务器使用自己的认证和加密协议在组成员之间建立每个连接。

    注意

    如果你正在使用 InnoDB Cluster,group_replication_communication_stack的默认值是MYSQL

    更多信息,请参阅 MySQL InnoDB Cluster。

    在设置组使用 MySQL 通信堆栈时需要进行额外配置;请参阅 第 20.6.1 节,“连接安全管理的通信堆栈”。

    group_replication_communication_stack 实际上是一个组范围的配置设置,所有组成员必须具有相同的设置。但是,Group Replication 对于组范围配置设置并不执行检查。具有与其余组不同值的成员无法与其他成员通信,因为通信协议不兼容,因此无法交换有关其配置设置的信息。

    这意味着虽然在 Group Replication 运行时可以更改系统变量的值,并在重新启动组成员的情况下生效,但成员仍然无法重新加入组,直到在所有成员上更改了设置。因此,您必须在所有成员上停止 Group Replication 并更改系统变量的值,然后才能重新启动组。由于所有成员都已停止,因此需要对组进行完全重启(由具有 group_replication_bootstrap_group=ON 的服务器引导)以使值更改生效。有关从一种通信堆栈迁移到另一种的说明,请参阅 第 20.6.1 节,“连接安全管理的通信堆栈”。

  • group_replication_components_stop_timeout

    命令行格式 --group-replication-components-stop-timeout=#
    系统变量 group_replication_components_stop_timeout
    范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值(≥ 8.0.27) 300
    默认值(≤ 8.0.26) 31536000
    最小值 2
    最大值 31536000
    单位

    此系统变量的值可以在 Group Replication 运行时更改,但更改只有在您停止并重新启动组成员上的 Group Replication 后才会生效。

    group_replication_components_stop_timeout 指定 Group Replication 在关闭时等待其各个模块完成正在进行的进程的时间,单位为秒。组件超时在发出 STOP GROUP_REPLICATION 语句后应用,该语句在服务器重新启动或自动重新加入时会自动执行。

    超时时间用于解决 Group Replication 组件无法正常停止的情况,这可能发生在成员处于错误状态时被驱逐出组,或者在诸如 MySQL Enterprise Backup 正在持有成员上的表的全局锁时。在这种情况下,成员无法停止应用程序线程或完成分布式恢复过程以重新加入。STOP GROUP_REPLICATION 不会完成,直到情况得到解决(例如,通过释放锁),或者组件超时到期并且模块无论其状态如何都会被关闭。

    在 MySQL 8.0.27 之前,默认组件超时时间为 31536000 秒,即 365 天。在这种情况下,组件超时对于描述的情况并不起作用,因此建议设置一个较低的值。从 MySQL 8.0.27 开始,默认值为 300 秒,因此如果在此时间之前未解决问题,Group Replication 组件将在 5 分钟后停止,允许成员重新启动并重新加入。

  • group_replication_compression_threshold

    命令行格式 --group-replication-compression-threshold=#
    系统变量 group_replication_compression_threshold
    范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 1000000
    最小值 0
    最大值 4294967295
    单位 字节

    在组成员之间发送的消息超过此阈值字节时应用压缩。如果此系统变量设置为零,则禁用压缩。group_replication_compression_threshold 的值应在所有组成员上保持一致。

    Group Replication 使用 LZ4 压缩算法来压缩组内发送的消息。请注意,LZ4 压缩算法支持的最大输入大小为 2113929216 字节。此限制低于 group_replication_compression_threshold 系统变量的最大可能值,该值与 XCom 接受的最大消息大小相匹配。使用 LZ4 压缩算法时,请不要为 group_replication_compression_threshold 设置大于 2113929216 字节的值,因为启用消息压缩时,超过此大小的事务无法提交。

    更多信息,请参见 第 20.7.4 节,“消息压缩”。

  • group_replication_consistency

    命令行格式 --group-replication-consistency=value
    引入版本 8.0.14
    系统变量 group_replication_consistency
    范围 全局,会话
    动态
    SET_VAR 提示适用
    类型 枚举
    默认值 EVENTUAL
    有效值 EVENTUAL``BEFORE_ON_PRIMARY_FAILOVER``BEFORE``AFTER``BEFORE_AND_AFTER

    在运行 Group Replication 时可以更改此系统变量的值。group_replication_consistency 是一个服务器系统变量,而不是 Group Replication 插件特定的变量,因此不需要重新启动 Group Replication 才能使更改生效。更改系统变量的会话值会立即生效,更改全局值会影响在更改后启动的新会话。需要 GROUP_REPLICATION_ADMIN 权限才能更改此系统变量的全局设置。

    group_replication_consistency 控制组提供的事务一致性保证。您可以全局配置一致性,也可以针对每个事务进行配置。group_replication_consistency 还配置了单主组中新选举的主节点使用的围栏机制。必须考虑该变量对只读(RO)和读写(RW)事务的影响。以下列表显示了该变量的可能值,按照事务一致性保证递增的顺序排列:

    • EVENTUAL

      在执行之前,RO 和 RW 事务都不会等待前置事务被应用。这是在添加此变量之前 Group Replication 的行为。一个 RW 事务不会等待其他成员应用事务。这意味着一个事务在其他成员之前可能在一个成员上被外部化。这也意味着在主要故障转移发生时,新的主要成员可以在之前的主要事务全部应用之前接受新的 RO 和 RW 事务。RO 事务可能导致过时的值,RW 事务可能由于冲突而导致回滚。

    • BEFORE_ON_PRIMARY_FAILOVER

      具有新选举的主要成员正在应用来自旧主要成员的积压时,新的 RO 或 RW 事务将被保留(不被应用),直到任何积压都被应用。这确保了主要故障转移发生时,无论是故意还是非故意,客户端始终看到主要成员上的最新值。这保证了一致性,但意味着客户端必须能够处理应用积压时的延迟。通常这种延迟应该是最小的,但取决于积压的大小。

    • BEFORE

      一个 RW 事务在被应用之前等待所有前置事务完成。一个 RO 事务在执行之前等待所有前置事务完成。这确保了该事务通过仅影响事务的延迟来读取最新值。这减少了每个 RW 事务上同步的开销,通过确保同步仅在 RO 事务上使用。这种一致性级别还包括BEFORE_ON_PRIMARY_FAILOVER提供的一致性保证。

    • AFTER

      一个 RW 事务等待直到其更改已应用到所有其他成员。这个值对 RO 事务没有影响。这种模式确保了当事务在本地成员上提交时,任何后续事务都会读取任何组成员上写入的值或更近期的值。在主要用于 RO 操作的组中使用此模式,以确保一旦提交,应用的 RW 事务就会在所有地方应用。您的应用程序可以使用此模式确保后续读取获取包含最新写入的最新数据。这减少了每个 RO 事务上同步的开销,通过确保同步仅在 RW 事务上使用。这种一致性级别还包括BEFORE_ON_PRIMARY_FAILOVER提供的一致性保证。

    • BEFORE_AND_AFTER

      一个 RW 事务等待 1) 所有前置事务完成后才被应用,2) 直到其更改在其他成员上被应用。一个 RO 事务在执行之前等待所有前置事务完成。这种一致性级别还包括BEFORE_ON_PRIMARY_FAILOVER提供的一致性保证。

    有关更多信息,请参见 Section 20.5.3, “事务一致性保证”。

  • group_replication_enforce_update_everywhere_checks

    命令行格式 --group-replication-enforce-update-everywhere-checks[={OFF|ON}]
    系统变量 group_replication_enforce_update_everywhere_checks
    范围 全局
    动态
    SET_VAR 提示适用
    类型 布尔值
    默认值 OFF

    注意

    这个系统变量是一个群组范围的配置设置,需要对复制组进行完全重启才能使更改生效。

    group_replication_enforce_update_everywhere_checks 启用或禁用多主更新到处的严格一致性检查。默认情况下,检查是禁用的。在单主模式下,所有群组成员必须禁用此选项。在多主模式下,当启用此选项时,语句将按以下方式进行检查,以确保它们与多主模式兼容:

    • 如果事务在 SERIALIZABLE 隔离级别下执行,则在与群组同步时其提交将失败。

    • 如果事务针对具有级联约束的外键的表执行,则在与群组同步时,事务将无法提交。

    这个系统变量是一个群组范围的配置设置。在所有群组成员上必须具有相同的值,在 Group Replication 运行时不能更改,并且需要通过一个具有 group_replication_bootstrap_group=ON 的服务器进行完全重启群组(引导)以使值更改生效。有关在已执行和认证事务的情况下安全引导群组的说明,请参见 Section 20.5.2, “重新启动群组”。

    如果群组为此系统变量设置了一个值,并且加入的成员为该系统变量设置了不同的值,则加入的成员在将值更改为匹配之前无法加入群组。如果群组成员为此系统变量设置了一个值,而加入的成员不支持该系统变量,则无法加入群组。

    从 MySQL 8.0.16 版本开始,您可以使用group_replication_switch_to_single_primary_mode()group_replication_switch_to_multi_primary_mode()函数在群组仍在运行时更改此系统变量的值。有关更多信息,请参见第 20.5.1.2 节,“更改群组模式”。

  • group_replication_exit_state_action

    命令行格式 --group-replication-exit-state-action=value
    引入版本 8.0.12
    系统变量 group_replication_exit_state_action
    作用范围 全局
    动态
    SET_VAR 提示适用
    类型 枚举
    默认值(≥ 8.0.16) READ_ONLY
    默认值(≥ 8.0.12, ≤ 8.0.15) ABORT_SERVER
    有效取值(≥ 8.0.18) ABORT_SERVER``OFFLINE_MODE``READ_ONLY
    有效取值(≥ 8.0.12, ≤ 8.0.17) ABORT_SERVER``READ_ONLY

    当 Group Replication 在运行时,可以更改此系统变量的值,并且更改会立即生效。当发生需要该行为的问题时,会读取系统变量的当前值。

    group_replication_exit_state_action 配置了当此服务器实例意外离开群组时 Group Replication 的行为,例如在遇到应用程序错误后,或在丢失多数情况下,或当群组的另一个成员因超时而将其驱逐时。在丢失多数情况下,成员离开群组的超时期由group_replication_unreachable_majority_timeout系统变量设置,而对于怀疑的超时期由group_replication_member_expel_timeout系统变量设置。请注意,被驱逐的群组成员在重新连接到群组之前不知道自己被驱逐,因此只有在成员成功重新连接或成员对自己提出怀疑并驱逐自己时才会执行指定的操作。

    当由于超时的怀疑或多数丢失而将组成员驱逐时,如果成员将group_replication_autorejoin_tries系统变量设置为指定自动重新加入尝试次数,则首先在超级只读模式下进行指定次数的尝试,然后按照group_replication_exit_state_action指定的操作进行。在出现应用程序错误时不会进行自动重新加入尝试,因为这些错误无法恢复。

    group_replication_exit_state_action设置为READ_ONLY时,如果成员意外退出组或耗尽自动重新加入尝试次数,则实例将将 MySQL 切换到超级只读模式(通过将系统变量super_read_only设置为ON)。READ_ONLY退出操作是在引入系统变量之前的 MySQL 8.0 版本中的行为,并且从 MySQL 8.0.16 开始再次成为默认设置。

    group_replication_exit_state_action设置为OFFLINE_MODE时,如果成员意外退出组或耗尽自动重新加入尝试次数,则实例将将 MySQL 切换到离线模式(通过将系统变量offline_mode设置为ON)。在此模式下,连接的客户端用户在下一次请求时将被断开连接,不再接受连接,但具有CONNECTION_ADMIN权限(或已弃用的SUPER权限)的客户端用户除外。Group Replication 还将系统变量super_read_only设置为ON,因此即使使用CONNECTION_ADMINSUPER权限连接,客户端也无法进行任何更新。OFFLINE_MODE退出操作从 MySQL 8.0.18 开始提供。

    group_replication_exit_state_action设置为ABORT_SERVER时,如果成员意外退出组或耗尽自动重新加入尝试次数,则实例将关闭 MySQL。此设置从 MySQL 8.0.12(添加系统变量时)到 MySQL 8.0.15(含)期间为默认设置。

    重要提示

    如果成员成功加入组之前发生故障,则指定的退出操作不会执行。如果在本地配置检查期间发生故障,或者加入成员的配置与组的配置不匹配,则会出现这种情况。在这些情况下,super_read_only系统变量保持其原始值,继续接受连接,并且服务器不会关闭 MySQL。因此,为了确保在 Group Replication 未启动时服务器无法接受更新,我们建议在服务器启动时在配置文件中设置super_read_only=ON,Group Replication 在成功启动后会将其更改为OFF。当服务器配置为在服务器启动时启动 Group Replication(group_replication_start_on_boot=ON命令手动启动 Group Replication 时也很有用。

    有关使用此选项的更多信息以及采取退出操作的全部情况,请参见 Section 20.7.7.4, “退出操作”。

  • group_replication_flow_control_applier_threshold

    命令行格式 --group-replication-flow-control-applier-threshold=#
    系统变量 group_replication_flow_control_applier_threshold
    范围 全局
    动态
    SET_VAR提示适用
    类型 整数
    默认值 25000
    最小值 0
    最大值 2147483647
    单位 事务

    此系统变量的值可以在 Group Replication 运行时更改,并立即生效。

    group_replication_flow_control_applier_threshold指定了在应用程序队列中等待的事务数量,触发流量控制。

  • group_replication_flow_control_certifier_threshold

    命令行格式 --group-replication-flow-control-certifier-threshold=#
    系统变量 group_replication_flow_control_certifier_threshold
    范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 25000
    最小值 0
    最大值 2147483647
    单位 事务

    此系统变量的值可以在 Group Replication 运行时更改,并立即生效。

    group_replication_flow_control_certifier_threshold 指定了在认证者队列中等待的事务数量触发流量控制。

  • group_replication_flow_control_hold_percent

    命令行格式 --group-replication-flow-control-hold-percent=#
    系统变量 group_replication_flow_control_hold_percent
    作用域 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 10
    最小值 0
    最大值 100
    单位 百分比

    此系统变量的值可以在 Group Replication 运行时更改,并立即生效。

    group_replication_flow_control_hold_percent 定义了集群配额剩余未使用的百分比,以允许处于流量控制状态的集群赶上积压工作。 值为 0 意味着没有配额的任何部分用于赶上工作积压。

  • group_replication_flow_control_max_quota

    命令行格式 --group-replication-flow-control-max-quota=#
    系统变量 group_replication_flow_control_max_quota
    作用域 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 0
    最小值 0
    最大值 2147483647

    此系统变量的值可以在 Group Replication 运行时更改,并立即生效。

    group_replication_flow_control_max_quota 定义了组的最大流量控制配额,或者在启用流量控制时任何时期的最大可用配额。值为 0 意味着没有设置最大配额。此系统变量的值不能小于group_replication_flow_control_min_quotagroup_replication_flow_control_min_recovery_quota

  • group_replication_flow_control_member_quota_percent

    命令行格式 --group-replication-flow-control-member-quota-percent=#
    系统变量 group_replication_flow_control_member_quota_percent
    范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 0
    最小值 0
    最大值 100
    单位 百分比

    此系统变量的值可以在 Group Replication 运行时更改,并立即生效。

    group_replication_flow_control_member_quota_percent 定义了成员在计算配额时应该假定自己可用的配额百分比。值为 0 意味着配额应该在上一个时期是写入者的成员之间均匀分配。

  • group_replication_flow_control_min_quota

    命令行格式 --group-replication-flow-control-min-quota=#
    系统变量 group_replication_flow_control_min_quota
    范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 0
    最小值 0
    最大值 2147483647

    此系统变量的值可以在 Group Replication 运行时更改,并立即生效。

    group_replication_flow_control_min_quota 控制着可以分配给成员的最低流量控制配额,独立于上一个周期执行的计算最小配额。数值为 0 意味着没有最低配额。此系统变量的值不能大于group_replication_flow_control_max_quota

  • group_replication_flow_control_min_recovery_quota

    命令行格式 --group-replication-flow-control-min-recovery-quota=#
    系统变量 group_replication_flow_control_min_recovery_quota
    作用范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 0
    最小值 0
    最大值 2147483647

    此系统变量的值可以在 Group Replication 运行时更改,并立即生效。

    group_replication_flow_control_min_recovery_quota 控制着因为组中另一个正在恢复的成员而可以分配给成员的最低配额,独立于上一个周期执行的计算最小配额。数值为 0 意味着没有最低配额。此系统变量的值不能大于group_replication_flow_control_max_quota

  • group_replication_flow_control_mode

    命令行格式 --group-replication-flow-control-mode=value
    系统变量 group_replication_flow_control_mode
    作用范围 全局
    动态
    SET_VAR 提示适用
    类型 枚举
    默认值 QUOTA
    有效值 DISABLED``QUOTA

    此系统变量的值可以在 Group Replication 运行时更改,并立即生效。

    group_replication_flow_control_mode 指定了流量控制的模式。

  • group_replication_flow_control_period

    命令行格式 --group-replication-flow-control-period=#
    系统变量 group_replication_flow_control_period
    范围 全局
    Dynamic
    SET_VAR Hint Applies No
    类型 整数
    默认值 1
    最小值 1
    最大值 60
    单位

    此系统变量的值可以在 Group Replication 运行时更改,并立即生效。

    group_replication_flow_control_period 定义了在流量控制迭代之间等待多少秒,其中发送流量控制消息并运行流量控制管理任务。

  • group_replication_flow_control_release_percent

    命令行格式 --group-replication-flow-control-release-percent=#
    系统变量 group_replication_flow_control_release_percent
    范围 全局
    Dynamic Yes
    SET_VAR Hint Applies No
    类型 整数
    默认值 50
    最小值 0
    最大值 1000
    单位 百分比

    此系统变量的值可以在 Group Replication 运行时更改,并立即生效。

    group_replication_flow_control_release_percent 定义了当流量控制不再需要限制写入成员时,如何释放组配额,其中百分比是每个流量控制周期的配额增加。 值为 0 意味着一旦流量控制阈值在限制范围内,配额就会在单个流量控制迭代中释放。 该范围允许配额释放高达当前配额的 10 倍,这样可以更好地适应,主要是当流量控制周期较长且配额非常小时。

  • group_replication_force_members

    命令行格式 --group-replication-force-members=value
    系统变量 group_replication_force_members
    范围 全局
    Dynamic
    SET_VAR Hint Applies No
    类型 字符串

    此系统变量用于强制应用新的组成员。在 Group Replication 运行时,可以更改此系统变量的值,并立即生效。您只需要在要保留在组中的一个组成员上设置系统变量的值。有关可能需要强制应用新的组成员的情况以及在使用此系统变量时要遵循的程序的详细信息,请参见第 20.7.8 节,“处理网络分区和失去法定人数”。

    group_replication_force_members指定一组对等地址,以逗号分隔的列表形式,例如host1:port1host2:port2。未包含在列表中的任何现有成员将不会接收到组的新视图,并将被阻止。对于每个要继续作为成员的现有成员,您必须包括 IP 地址或主机名以及端口,就像在group_replication_local_address系统变量中为每个成员给出的那样。IPv6 地址必须用方括号指定。例如:

    "198.51.100.44:33061,[2001:db8:85a3:8d3:1319:8a2e:370:7348]:33061,example.org:33061"
    

    Group Replication 的组通信引擎(XCom)检查提供的 IP 地址是否具有有效格式,并检查您是否包含了当前无法访问的任何组成员。否则,新配置将不被验证,因此您必须小心地只包括在线可访问的组成员。列表中的任何不正确值或无效主机名都可能导致组被阻止,出现无效配置。

    在强制应用新的成员配置之前,确保要排除的服务器已关闭是很重要的。如果没有关闭,请在继续之前将它们关闭。仍然在线的组成员可以自动形成新的配置,如果已经发生了这种情况,强制进一步的新配置可能会为组创建人为的脑裂情况。

    在使用group_replication_force_members系统变量成功强制应用新的组成员并解除组阻塞后,请确保清除该系统变量。为了发出START GROUP_REPLICATION语句,group_replication_force_members必须为空。

  • group_replication_group_name

    命令行格式 --group-replication-group-name=value
    系统变量 group_replication_group_name
    作用范围 全局
    动态
    SET_VAR 提示适用
    类型 字符串

    此系统变量的值在 Group Replication 运行时无法更改。

    group_replication_group_name 指定了此服务器实例所属的组的名称,必须是有效的 UUID。这个 UUID 是 GTID 的一部分,当组成员从客户端接收到事务,以及组成员内部生成的视图更改事件被写入二进制日志时使用。

    重要提示

    必须使用唯一的 UUID。

  • group_replication_group_seeds

    命令行格式 --group-replication-group-seeds=value
    系统变量 group_replication_group_seeds
    作用范围 全局
    动态
    SET_VAR 提示适用
    类型 字符串

    此系统变量的值可以在 Group Replication 运行时更改,但更改只有在您停止并重新启动组成员的 Group Replication 后才会生效。

    group_replication_group_seeds 是一个组成员的列表,加入的成员可以连接到这些组成员以获取所有当前组成员的详细信息。加入的成员使用这些详细信息来选择并连接到一个组成员,以获取与组的同步所需的数据。该列表包含每个包含的种子成员的单个内部网络地址或主机名,如在种子成员的 group_replication_local_address 系统变量中配置的那样(而不是种子成员的 SQL 客户端连接,如 MySQL Server 的 hostnameport 系统变量所指定的)。种子成员的地址被指定为逗号分隔的列表,例如 host1:port1,host2:port2。IPv6 地址必须用方括号指定。例如:

    group_replication_group_seeds= "198.51.100.44:33061,[2001:db8:85a3:8d3:1319:8a2e:370:7348]:33061, example.org:33061"
    

    请注意,您为此变量指定的值在发出 START GROUP_REPLICATION 语句并且 Group Communication System (GCS) 可用之前不会被验证。

    通常,此列表包含组的所有成员,但您可以选择一组成员的子集作为种子。列表必须至少包含一个有效成员地址。在启动 Group Replication 时,每个地址都会被验证。如果列表不包含任何有效成员地址,则发出START GROUP_REPLICATION将失败。

    当服务器加入复制组时,它会尝试连接到其group_replication_group_seeds系统变量中列出的第一个种子成员。如果连接被拒绝,加入成员会尝试按顺序连接列表中的其他种子成员。如果加入成员连接到一个种子成员,但由于某种原因未被添加到复制组(例如,因为种子成员没有在其允许列表中包含加入成员的地址并关闭了连接),则加入成员会继续按顺序尝试剩余的种子成员。

    加入成员必须使用与种子成员在group_replication_group_seeds选项中广告的协议(IPv4 或 IPv6)与种子成员进行通信。对于 Group Replication 的 IP 地址权限,种子成员的允许列表必须包含加入成员的 IP 地址,以便与种子成员提供的协议匹配,或者解析为该协议的地址的主机名。如果加入成员的协议与种子成员广告的协议不匹配,则必须设置并允许此地址或主机名,除了加入成员的group_replication_local_address。如果加入成员没有适当协议的允许地址,则其连接尝试将被拒绝。有关更多信息,请参见第 20.6.4 节,“Group Replication IP 地址权限”。

  • group_replication_gtid_assignment_block_size

    命令行格式 --group-replication-gtid-assignment-block-size=#
    系统变量 group_replication_gtid_assignment_block_size
    范围 全局
    动态
    SET_VAR提示适用
    类型 整数
    默认值 1000000
    最小值 1
    最大值(64 位平台) 9223372036854775807
    最大值(32 位平台) 4294967295

    注意

    这个系统变量是一个群组范围的配置设置,需要对复制组进行完全重启才能使更改生效。

    group_replication_gtid_assignment_block_size 指定为每个组成员保留的连续 GTID 数。每个成员消耗自己的块,并在需要时保留更多。

    这个系统变量是一个群组范围的配置设置。在所有群组成员上必须具有相同的值,不能在 Group Replication 运行时更改,并且需要对群组进行完全重启(由具有 group_replication_bootstrap_group=ON 的服务器引导)才能使值更改生效。有关在已执行和认证事务的情况下安全引导群组的说明,请参见 第 20.5.2 节,“重新启动群组”。

    如果群组为此系统变量设置了一个值,并且加入成员为该系统变量设置了不同的值,则加入成员无法加入群组,直到将值更改为匹配。如果群组成员为此系统变量设置了一个值,而加入成员不支持该系统变量,则无法加入群组。

  • group_replication_ip_allowlist

    命令行格式 --group-replication-ip-allowlist=value
    引入版本 8.0.22
    系统变量 group_replication_ip_allowlist
    作用范围 全局
    动态
    SET_VAR提示适用
    类型 字符串
    默认值 AUTOMATIC

    group_replication_ip_allowlist 在 MySQL 8.0.22 中可用,用于替换 group_replication_ip_whitelist。从 MySQL 8.0.24 开始,可以在 Group Replication 运行时更改此系统变量的值,并且更改立即在成员上生效。

    group_replication_ip_allowlist指定哪些主机被允许连接到组。当 XCom 通信堆栈用于组时(group_replication_communication_stack=XCOM),白名单用于控制对组的访问。当 MySQL 通信堆栈用于组时(group_replication_communication_stack=MYSQL),用户认证用于控制对组的访问,白名单不会被使用,如果设置了则会被忽略。

    您在group_replication_local_address中为每个组成员指定的地址必须在复制组中的其他服务器上得到允许。请注意,直到发出START GROUP_REPLICATION语句并且组通信系统(GCS)可用之前,您为此变量指定的值不会被验证。

    默认情况下,此系统变量设置为AUTOMATIC,允许来自主机上活动的私有子网的连接。组复制的组通信引擎(XCom)会自动扫描主机上的活动接口,并识别具有私有子网地址的接口。这些地址以及 IPv4 和(从 MySQL 8.0.14 开始)IPv6 的localhost IP 地址用于创建组复制白名单。有关自动允许地址的范围列表,请参见 Section 20.6.4, “Group Replication IP Address Permissions”。

    自动私有地址白名单不能用于来自私有网络之外的服务器的连接。对于位于不同机器上的服务器实例之间的组复制连接,您必须提供公共 IP 地址并将其指定为显式白名单。如果为白名单指定了任何条目,则私有地址不会自动添加,因此如果使用其中任何一个,必须明确指定。localhost IP 地址会自动添加。

    作为group_replication_ip_allowlist选项的值,您可以指定以下任意组合:

    • IPv4 地址(例如,198.51.100.44

    • 具有 CIDR 表示法的 IPv4 地址(例如,192.0.2.21/24

    • IPv6 地址,从 MySQL 8.0.14 开始(例如,2001:db8:85a3:8d3:1319:8a2e:370:7348

    • 具有 CIDR 表示法的 IPv6 地址,从 MySQL 8.0.14 开始(例如,2001:db8:85a3:8d3::/64

    • 主机名(例如,example.org

    • 具有 CIDR 表示法的主机名(例如,www.example.com/24)

    在 MySQL 8.0.14 之前,主机名只能解析为 IPv4 地址。从 MySQL 8.0.14 开始,主机名可以解析为 IPv4 地址、IPv6 地址或两者都有。如果主机名解析为 IPv4 和 IPv6 地址,始终使用 IPv4 地址进行组复制连接。您可以结合主机名或 IP 地址使用 CIDR 表示法来允许具有特定网络前缀的 IP 地址块,但确保指定子网中的所有 IP 地址都在您的控制之下。

    每个允许列表中的条目之间必须用逗号分隔。例如:

    "192.0.2.21/24,198.51.100.44,203.0.113.0/24,2001:db8:85a3:8d3:1319:8a2e:370:7348,example.org,www.example.com/24"
    

    如果组的任何种子成员在加入成员具有 IPv4 group_replication_local_address时列出了带有 IPv6 地址的group_replication_group_seeds选项,或反之亦然,则还必须设置和允许加入成员的另一地址,以供种子成员提供的协议使用(或解析为该协议的地址的主机名)。有关更多信息,请参见第 20.6.4 节,“组复制 IP 地址权限”。

    可以根据您的安全需求在不同的组成员上配置不同的允许列表,例如,为了保持不同的子网分开。然而,当重新配置组时可能会导致问题。如果没有特定的安全要求要求做出其他安排,请在组的所有成员上使用相同的允许列表。有关更多详细信息,请参见第 20.6.4 节,“组复制 IP 地址权限”。

    对于主机名,只有在另一个服务器发出连接请求时才会进行名称解析。无法解析的主机名不会被视为允许列表验证的一部分,并且会向错误日志中写入警告消息。对已解析的主机名执行前向确认反向 DNS(FCrDNS)验证。

    警告

    主机名在允许列表中比 IP 地址不安全。FCrDNS 验证提供了很好的保护级别,但可能会受到某些类型攻击的影响。仅在绝对必要时在允许列表中指定主机名,并确保所有用于名称解析的组件,如 DNS 服务器,都在您的控制之下。您还可以使用 hosts 文件在本地实现名称解析,以避免使用外部组件。

  • group_replication_ip_whitelist

    命令行格式 --group-replication-ip-whitelist=value
    已弃用 8.0.22
    系统变量 group_replication_ip_whitelist
    范围 全局
    动态
    SET_VAR提示适用
    类型 字符串
    默认值 AUTOMATIC

    从 MySQL 8.0.22 开始,group_replication_ip_whitelist已被弃用,而group_replication_ip_allowlist可用来替代它。对于这两个系统变量,默认值均为AUTOMATIC

    在群组复制启动时,如果其中一个系统变量已设置为用户定义的值而另一个没有,则使用更改后的值。如果两个系统变量都已设置为用户定义的值,则使用group_replication_ip_allowlist的值。

    如果在群组复制运行时更改group_replication_ip_whitelistgroup_replication_ip_allowlist的值,这在 MySQL 8.0.24 中是可能的,那么两个变量都不会优先于另一个。

    新的系统变量与旧的系统变量的工作方式相同,只是术语发生了变化。对于group_replication_ip_allowlist给出的行为描述适用于旧系统变量和新系统变量。

  • group_replication_local_address

    命令行格式 --group-replication-local-address=value
    系统变量 group_replication_local_address
    范围 全局
    动态
    SET_VAR提示适用
    类型 字符串

    此系统变量的值可以在群组复制运行时更改,但更改只在停止并重新启动群组成员的情况下生效。

    group_replication_local_address 设置了成员为其他成员提供连接的网络地址,格式为host:port。这个地址必须被组内所有成员访问,因为它被组通信引擎用于 Group Replication(XCom,一种 Paxos 变体)的 TCP 通信。如果您正在使用 MySQL 通信堆栈在成员之间建立组通信连接(group_replication_communication_stack = MYSQL),那么该地址必须是 MySQL Server 监听的 IP 地址和端口之一,由服务器的 bind_address 系统变量指定。

    警告

    不要使用此地址查询或管理成员上的数据库。这不是 SQL 客户端连接的主机和端口。

    您在 group_replication_local_address 中指定的地址或主机名被 Group Replication 用作复制组内组成员的唯一标识符。只要主机名或 IP 地址都不同,就可以为复制组的所有成员使用相同的端口,只要端口都不同,就可以为所有成员使用相同的主机名或 IP 地址。group_replication_local_address 的推荐端口是 33061。请注意,直到发出 START GROUP_REPLICATION 语句并且 Group Communication System (GCS) 可用之前,不会验证此变量的值。

    group_replication_local_address 配置的网络地址必须被所有组成员解析。例如,如果每个服务器实例在不同的机器上具有固定的网络地址,您可以使用机器的 IP 地址,例如 10.0.0.1。如果使用主机名,必须使用完全限定的名称,并确保通过 DNS、正确配置的 /etc/hosts 文件或其他名称解析过程解析。从 MySQL 8.0.14 开始,IPv6 地址(或解析为它们的主机名)也可以使用,以及 IPv4 地址。必须在方括号中指定 IPv6 地址,以区分端口号,例如:

    group_replication_local_address= "[2001:db8:85a3:8d3:1319:8a2e:370:7348]:33061"
    

    如果指定为服务器实例的组复制本地地址的主机名同时解析为 IPv4 和 IPv6 地址,则始终使用 IPv4 地址进行组复制连接。有关组复制支持 IPv6 网络以及使用 IPv4 成员和使用 IPv6 成员混合的复制组的更多信息,请参见第 20.5.5 节,“IPv6 和混合 IPv6 和 IPv4 组的支持”。

    如果您正在使用 XCom 通信堆栈在成员之间建立组通信连接(group_replication_communication_stack = XCOM),则在复制组中的其他服务器上必须将您为每个组成员指定的地址添加到group_replication_ip_allowlist(从 MySQL 8.0.22 开始)或group_replication_ip_whitelist(对于 MySQL 8.0.21 及更早版本)系统变量的列表中。当 XCom 通信堆栈用于组时,允许列表用于控制对组的访问。当 MySQL 通信堆栈用于组时,用户身份验证用于控制对组的访问,允许列表不起作用,如果设置则会被忽略。请注意,如果组的任何种子成员在此成员具有 IPv4 group_replication_local_address时列出具有 IPv6 地址,或反之亦然,则还必须设置并允许该成员的所需协议的替代地址(或解析为该协议地址的主机名)。有关更多信息,请参见第 20.6.4 节,“组复制 IP 地址权限”。

  • group_replication_member_expel_timeout

    命令行格式 --group-replication-member-expel-timeout=#
    引入版本 8.0.13
    系统变量 group_replication_member_expel_timeout
    范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 (≥ 8.0.21) 5
    默认值 (≤ 8.0.20) 0
    最小值 0
    最大值 (≥ 8.0.14) 3600
    最大值(≤ 8.0.13) 31536000
    单位

    此系统变量的值可以在 Group Replication 运行时更改,并立即生效。系统变量的当前值在 Group Replication 检查超时时读取。并非所有组成员都必须具有相同的设置,但建议如此以避免意外驱逐。

    group_replication_member_expel_timeout 指定了在创建怀疑后,Group Replication 组成员在将被怀疑失败的成员从组中驱逐之前等待的时间段(以秒为单位)。在创建怀疑之前的初始 5 秒检测期不计入此时间。在 MySQL 8.0.20 及之前的版本中,group_replication_member_expel_timeout 的值默认为 0,意味着没有等待时间,怀疑的成员在 5 秒检测期结束后立即有可能被驱逐。从 MySQL 8.0.21 开始,默认值为 5,意味着怀疑的成员在 5 秒检测期结束后 5 秒内有可能被驱逐。

    在组成员上更改 group_replication_member_expel_timeout 的值会立即对该组成员上现有及未来的怀疑生效。因此,您可以将其用作强制怀疑超时并驱逐怀疑成员以允许更改组配置的方法。有关更多信息,请参见 第 20.7.7.1 节,“驱逐超时”。

    增加group_replication_member_expel_timeout的值可以帮助避免在较慢或不稳定网络上发生不必要的驱逐,或在预期的瞬时网络中断或机器减速情况下。如果可疑成员在疑虑超时之前再次活跃,它会应用所有被其余组成员缓冲的消息,并进入ONLINE状态,无需操作者干预。您可以指定最多 3600 秒(1 小时)的超时值。重要的是要确保 XCom 的消息缓存足够大,以容纳在指定时间段内预期的消息量,再加上初始的 5 秒检测期,否则成员无法重新连接。您可以使用group_replication_message_cache_size系统变量调整缓存大小限制。有关更多信息,请参见第 20.7.6 节,“XCom 缓存管理”。

    如果超时时间已过,可疑成员在疑虑超时后立即有可能被驱逐。如果成员能够恢复通信并接收到一个将其驱逐的视图,并且成员已将group_replication_autorejoin_tries系统变量设置为指定自动重新加入尝试次数,则在超级只读模式下,它会继续进行指定数量的重新加入尝试。如果成员没有指定任何自动重新加入尝试,或者已耗尽指定数量的尝试次数,则会执行由系统变量group_replication_exit_state_action指定的操作。

    有关使用group_replication_member_expel_timeout设置的更多信息,请参见第 20.7.7.1 节,“驱逐超时”。在没有此系统变量的情况下,为避免不必要的驱逐而采取替代缓解策略,请参见第 20.3.2 节,“组复制限制”。

  • group_replication_member_weight

    命令行格式 --group-replication-member-weight=#
    系统变量 group_replication_member_weight
    范围 全局
    动态
    SET_VAR提示适用
    类型 整数
    默认值 50
    最小值 0
    最大值 100
    单位 百分比

    可以在 Group Replication 运行时更改此系统变量的值,并且更改会立即生效。在发生故障转移情况时,系统变量的当前值会被读取。

    group_replication_member_weight 指定了可以分配给成员的百分比权重,以影响在故障转移时成员被选为主要成员的机会,例如当现有主要成员离开单一主要组时。为成员分配数字权重以确保特定成员被选中,例如在主要成员的计划维护期间或在故障转移时确保某些硬件优先考虑。

    对于配置为以下成员的组:

    • 成员-1: group_replication_member_weight=30, server_uuid=aaaa

    • 成员-2: group_replication_member_weight=40, server_uuid=bbbb

    • 成员-3: group_replication_member_weight=40, server_uuid=cccc

    • 成员-4: group_replication_member_weight=40, server_uuid=dddd

    在选举新主要成员时,上述成员将按成员-2成员-3成员-4成员-1的顺序排序。这导致在故障转移时选择成员-2作为新的主要成员。有关更多信息,请参见 Section 20.1.3.1, “Single-Primary Mode”。

  • group_replication_message_cache_size

    命令行格式 --group-replication-message-cache-size=#
    引入版本 8.0.16
    系统变量 group_replication_message_cache_size
    范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 1073741824 (1 GB)
    最小值(64 位平台,≥ 8.0.21) 134217728 (128 MB)
    最小值(64 位平台,≤ 8.0.20) 1073741824 (1 GB)
    最小值(32 位平台,≥ 8.0.21) 134217728 (128 MB)
    最小值(32 位平台,≤ 8.0.20) 1073741824 (1 GB)
    最大值(64 位平台) 18446744073709551615 (16 EiB)
    最大值(32 位平台) 315360004294967295 (4 GB)
    单位 字节

    此系统变量应在所有组成员上具有相同的值。在 Group Replication 运行时可以更改此系统变量的值。更改在您停止并重新启动成员上的 Group Replication 后生效。在此过程中,系统变量的值允许在组成员之间有所不同,但在断开连接的情况下,成员可能无法重新连接。

    group_replication_message_cache_size 设置了在 Group Replication(XCom)的组通信引擎中用于消息缓存的最大内存量。XCom 消息缓存保存了作为共识协议的一部分在组成员之间交换的消息(及其元数据)。消息缓存除了其他功能外,还用于在成员在一段时间内无法与其他组成员通信后重新连接到组时恢复丢失的消息。

    group_replication_member_expel_timeout 系统变量确定了等待期限(最长一小时),该期限是在初始 5 秒检测期限之外允许成员返回到组中而不被驱逐的。XCom 消息缓存的大小应该根据预期的消息量设置,以便在此时间段内包含所有成员成功返回所需的所有丢失消息。直到 MySQL 8.0.20 版本,仅有 5 秒的检测期限是默认值,但从 MySQL 8.0.21 版本开始,默认值是在 5 秒检测期限之后等待 5 秒,总共为 10 秒的时间段。

    确保系统上有足够的内存供您选择的缓存大小限制使用,考虑到 MySQL 服务器的其他缓存和对象池的大小。默认设置为 1073741824 字节(1 GB)。最小设置也是 1 GB,直到 MySQL 8.0.20 版本。从 MySQL 8.0.21 开始,最小设置为 134217728 字节(128 MB),这使得可以在内存可用量受限的主机上部署,并且具有良好的网络连接性,以最小化组成员之间瞬时连接丢失的频率和持续时间。请注意,使用 group_replication_message_cache_size 设置的限制仅适用于缓存中存储的数据,缓存结构需要额外的 50 MB 内存。

    缓存大小限制可以在运行时动态增加或减少。如果减少缓存大小限制,XCom 将删除已经决定并传递的最旧条目,直到当前大小低于限制。当从消息缓存中删除可能需要用于恢复的消息,但当前无法访问的成员时,Group Replication 的组通信系统(GCS)会通过警告消息向您发出警告。有关调整消息缓存大小的更多信息,请参见 Section 20.7.6, “XCom Cache Management”。

  • group_replication_paxos_single_leader

    命令行格式 --group-replication-paxos-single-leader[={OFF|ON}]
    引入版本 8.0.27
    系统变量 group_replication_paxos_single_leader
    范围 全局
    动态
    SET_VAR提示适用
    类型 布尔值
    默认值 OFF

    注意

    此系统变量是一个群组范围的配置设置,需要完全重新启动复制组才能使更改生效。

    group_replication_paxos_single_leader从 MySQL 8.0.27 开始可用。当群组处于单主模式时,它使群组通信引擎能够与单一共识领导者一起运行。使用默认设置OFF,此行为被禁用,并且在此系统变量可用之前的版本中使用每个群组成员作为领导者的行为。当系统变量设置为ON时,群组通信引擎可以使用单一领导者来推动共识。在单一共识领导者模式下操作可以提高性能和韧性,特别是当群组的某些次要成员当前无法访问时。有关更多信息,请参见 Section 20.7.3, “Single Consensus Leader”。

    为了使群组通信引擎使用单一共识领导者,群组的通信协议版本必须是 MySQL 8.0.27 或更高版本。使用group_replication_get_communication_protocol()函数查看群组的通信协议版本。如果使用较低版本,则群组无法使用此行为。如果所有群组成员都支持,您可以使用group_replication_set_communication_protocol()函数将群组的通信协议设置为更高版本。有关更多信息,请参见 Section 20.5.1.4, “Setting a Group's Communication Protocol Version”。

    此系统变量是一个群组范围的配置设置。它必须在所有群组成员上具有相同的值,在 Group Replication 运行时无法更改,并且需要对群组进行完全重新启动(由具有group_replication_bootstrap_group=ON的服务器引导)才能使值更改生效。有关在已执行和认证事务的情况下安全引导群组的说明,请参见 Section 20.5.2, “Restarting a Group”。

    如果组为此系统变量设置了一个值,并且加入成员为该系统变量设置了不同的值,则加入成员在值匹配之前无法加入该组。如果组成员为此系统变量设置了一个值,而加入成员不支持该系统变量,则无法加入该组。

    在性能模式表replication_group_communication_information中的字段WRITE_CONSENSUS_SINGLE_LEADER_CAPABLE显示组是否支持使用单个领导者,即使在查询的成员上当前设置为OFFgroup_replication_paxos_single_leader。如果组是在设置为ONgroup_replication_paxos_single_leader并且其通信协议版本为 MySQL 8.0.27 或更高版本的情况下启动的,则该字段设置为 1。

  • group_replication_poll_spin_loops

    命令行格式 --group-replication-poll-spin-loops=#
    系统变量 group_replication_poll_spin_loops
    作用范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 0
    最小值 0
    最大值(64 位平台) 18446744073709551615
    最大值(32 位平台) 4294967295

    此系统变量的值可以在 Group Replication 运行时更改,但更改只有在您停止并重新启动组成员上的 Group Replication 后才会生效。

    group_replication_poll_spin_loops 指定组通信线程在等待通信引擎互斥锁被释放之前等待更多传入网络消息的次数。

  • group_replication_recovery_complete_at

    命令行格式 --group-replication-recovery-complete-at=value
    已弃用 8.0.34
    系统变量 group_replication_recovery_complete_at
    作用范围 全局
    动态
    SET_VAR ��示适用
    类型 枚举
    默认值 TRANSACTIONS_APPLIED
    有效值 TRANSACTIONS_CERTIFIED``TRANSACTIONS_APPLIED

    当 Group Replication 运行时,可以更改此系统变量的值,但更改只有在停止并重新启动组成员上的 Group Replication 后才会生效。

    group_replication_recovery_complete_at 指定了在从现有成员接收状态传输后处理缓存事务时应用的策略。您可以选择在成员接收并认证了加入组前错过的所有事务后将其标记为在线(TRANSACTIONS_CERTIFIED),或者只有在接收、认证和应用了这些事务后才将其标记为在线(TRANSACTIONS_APPLIED)。

    此变量在 MySQL 8.0.34 中已弃用(TRANSACTIONS_CERTIFIED 也是如此)。预计在将来的 MySQL 版本中将其移除。

  • group_replication_recovery_compression_algorithms

    命令行格式 --group-replication-recovery-compression-algorithms=value
    引入版本 8.0.18
    系统变量 group_replication_recovery_compression_algorithms
    范围 全局
    动态
    SET_VAR 提示适用
    类型 集合
    默认值 uncompressed
    有效数值 zlib``zstd``uncompressed

    当 Group Replication 运行时,可以更改此系统变量的值,但更改只有在停止并重新启动组成员上的 Group Replication 后才会生效。

    group_replication_recovery_compression_algorithms 指定了允许用于 Group Replication 分布式恢复连接的压缩算法,用于从捐赠者的二进制日志传输状态。可用的算法与 protocol_compression_algorithms 系统变量相同。有关更多信息,请参见第 6.2.8 节,“连接压缩控制”。

    如果服务器已设置为支持克隆(参见第 20.5.4.2 节,“用于分布式恢复的克隆”),并且在分布式恢复期间使用远程克隆操作,则此设置不适用。对于此状态传输方法,克隆插件的 clone_enable_compression 设置适用。

  • group_replication_recovery_get_public_key

    命令行格式 --group-replication-recovery-get-public-key[={OFF|ON}]
    系统变量 group_replication_recovery_get_public_key
    范围 全局
    动态
    SET_VAR 提示适用
    类型 布尔值
    默认值 OFF

    当 Group Replication 运行时,可以更改此系统变量的值,但更改只在您停止并重新启动组复制时才会生效。

    group_replication_recovery_get_public_key 指定是否从源请求用于 RSA 密钥对密码交换所需的公钥。如果 group_replication_recovery_public_key_path 设置为有效的公钥文件,则优先于 group_replication_recovery_get_public_key。如果您未在 group_replication_recovery 通道上使用 SSL 进行分布式恢复,并且 Group Replication 的复制用户帐户使用 caching_sha2_password 插件进行身份验证(这是 MySQL 8.0 中的默认设置),则此变量适用。有关更多详细信息,请参见 第 20.6.3.1.1 节,“使用 Caching SHA-2 认证插件的复制用户”。

  • group_replication_recovery_public_key_path

    命令行格式 --group-replication-recovery-public-key-path=file_name
    系统变量 group_replication_recovery_public_key_path
    范围 全局
    动态
    SET_VAR 提示适用
    类型 文件名
    默认值 空字符串

    当 Group Replication 运行时,可以更改此系统变量的值,但更改只在您停止并重新启动组复制时才会生效。

    group_replication_recovery_public_key_path 指定包含源端所需的用于 RSA 密钥对密码交换的公钥的副本的文件的路径名。该文件必须采用 PEM 格式。如果设置了 group_replication_recovery_public_key_path 为有效的公钥文件,则它优先于 group_replication_recovery_get_public_key。此变量适用于在分布式恢复过程中未使用 SSL 进行 group_replication_recovery 通道(因此 group_replication_recovery_use_ssl 设置为 OFF),并且用于 Group Replication 的复制用户帐户使用 caching_sha2_password 插件(这是 MySQL 8.0 中的默认设置)或 sha256_password 插件进行身份验证。(对于 sha256_password,只有在使用 OpenSSL 构建 MySQL 时,设置 group_replication_recovery_public_key_path 才适用。)有关更多详细信息,请参阅 第 20.6.3.1.1 节,“使用 Caching SHA-2 认证插件的复制用户”。

  • group_replication_recovery_reconnect_interval

    命令行格式 --group-replication-recovery-reconnect-interval=#
    系统变量 group_replication_recovery_reconnect_interval
    作用范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 60
    最小值 0
    最大值 31536000
    单位

    此系统变量的值可以在 Group Replication 运行时更改,但更改只有在停止并重新启动组成员上的 Group Replication 后才会生效。

    group_replication_recovery_reconnect_interval 指定在分布式恢复过程中当组中找不到合适的提供者时重新连接尝试之间的休眠时间,单位为秒。

  • group_replication_recovery_retry_count

    命令行格式 --group-replication-recovery-retry-count=#
    系统变量 group_replication_recovery_retry_count
    作用范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 10
    最小值 0
    最大值 31536000

    此系统变量的值可以在 Group Replication 运行时更改,但更改仅在您停止并重新启动组成员上的 Group Replication 后生效。

    group_replication_recovery_retry_count 指定加入的成员在放弃之前尝试连接可用捐赠者的次数。

  • group_replication_recovery_ssl_ca

    命令行格式 --group-replication-recovery-ssl-ca=value
    系统变量 group_replication_recovery_ssl_ca
    范围 全局
    动态
    SET_VAR 提示适用
    类型 字符串

    此系统变量的值可以在 Group Replication 运行时更改,但更改仅在您停止并重新启动组成员上的 Group Replication 后生效。

    group_replication_recovery_ssl_ca 指定包含用于分布式恢复连接的受信任 SSL 证书颁发机构列表的文件路径。有关配置分布式恢复的 SSL 信息,请参阅 Section 20.6.2, “Securing Group Communication Connections with Secure Socket Layer (SSL)”")。

    如果此服务器已设置为支持克隆(参见 Section 20.5.4.2, “Cloning for Distributed Recovery”),并且您已将 group_replication_recovery_use_ssl 设置为 ON,Group Replication 将自动配置克隆 SSL 选项 clone_ssl_ca 的设置,以匹配您对 group_replication_recovery_ssl_ca 的设置。

    当 MySQL 通信堆栈用于组时(group_replication_communication_stack = MYSQL,此设置用于组通信连接的 TLS/SSL 配置,以及分布式恢复连接。

  • group_replication_recovery_ssl_capath

    命令行格式 --group-replication-recovery-ssl-capath=value
    系统变量 group_replication_recovery_ssl_capath
    范围 全局
    动态
    SET_VAR 提示适用
    类型 字符串

    此系统变量的值可以在 Group Replication 运行时更改,但更改只有在您停止并重新启动组成员上的 Group Replication 后才会生效。

    group_replication_recovery_ssl_capath 指定包含用于分布式恢复连接的受信任 SSL 证书颁发机构证书的目录路径。有关为分布式恢复配置 SSL 的信息,请参见 第 20.6.2 节,“使用安全套接字层 (SSL) 保护组通信连接” 保护组通信连接")。

    当 MySQL 通信堆栈用于组时(group_replication_communication_stack = MYSQL),此设置用于组通信连接的 TLS/SSL 配置,以及分布式恢复连接。

  • group_replication_recovery_ssl_cert

    命令行格式 --group-replication-recovery-ssl-cert=value
    系统变量 group_replication_recovery_ssl_cert
    范围 全局
    动态
    SET_VAR 提示适用
    类型 字符串

    此系统变量的值可以在 Group Replication 运行时更改,但更改只有在您停止并重新启动组成员上的 Group Replication 后才会生效。

    group_replication_recovery_ssl_cert 指定用于建立分布式恢复安全连接的 SSL 证书文件的名称。有关为分布式恢复配置 SSL 的信息,请参见 第 20.6.2 节,“使用安全套接字层 (SSL) 保护组通信连接” 保护组通信连接")。

    如果此服务器已设置支持克隆(参见第 20.5.4.2 节,“用于分布式恢复的克隆”),并且您已将group_replication_recovery_use_ssl设置为ON,Group Replication 会自动配置克隆 SSL 选项clone_ssl_cert的设置,以匹配您对group_replication_recovery_ssl_cert的设置。

    当 MySQL 通信堆栈用于组(group_replication_communication_stack = MYSQL)时,此设置用于组通信连接的 TLS/SSL 配置,以及分布式恢复连接。

  • group_replication_recovery_ssl_cipher

    命令行格式 --group-replication-recovery-ssl-cipher=value
    系统变量 group_replication_recovery_ssl_cipher
    范围 全局
    动态
    SET_VAR提示适用
    类型 字符串

    此系统变量的值可以在 Group Replication 运行时更改,但更改只有在您停止并重新启动组复制组件后才会生效。

    group_replication_recovery_ssl_cipher指定 SSL 加密的允许密码列表。有关配置分布式恢复的 SSL 信息,请参阅第 20.6.2 节,“使用安全套接字层(SSL)保护组通信连接”。

    当 MySQL 通信堆栈用于组(group_replication_communication_stack = MYSQL)时,此设置用于组通信连接的 TLS/SSL 配置,以及分布式恢复连接。

  • group_replication_recovery_ssl_crl

    命令行格式 --group-replication-recovery-ssl-crl=value
    系统变量 group_replication_recovery_ssl_crl
    范围 全局
    动态
    SET_VAR提示适用
    类型 文件名

    此系统变量的值可以在 Group Replication 运行时更改,但更改只有在您停止并重新启动组成员上的 Group Replication 后才会生效。

    group_replication_recovery_ssl_crl 指定包含证书吊销列表文件的目录路径。参见第 20.6.2 节,“使用安全套接字层 (SSL) 保护组通信连接” 保护组通信连接"),了解有关为分布式恢复配置 SSL 的信息。

    当 MySQL 通信堆栈用于组时(group_replication_communication_stack = MYSQL),此设置用于组通信连接的 TLS/SSL 配置,以及分布式恢复连接。

  • group_replication_recovery_ssl_crlpath

    命令行格式 --group-replication-recovery-ssl-crlpath=value
    系统变量 group_replication_recovery_ssl_crlpath
    范围 全局
    动态
    SET_VAR 提示适用
    类型 目录名称

    此系统变量的值可以在 Group Replication 运行时更改,但更改只有在您停止并重新启动组成员上的 Group Replication 后才会生效。

    group_replication_recovery_ssl_crlpath 指定包含证书吊销列表文件的目录路径。参见第 20.6.2 节,“使用安全套接字层 (SSL) 保护组通信连接” 保护组通信连接"),了解有关为分布式恢复配置 SSL 的信息。

    当 MySQL 通信堆栈用于组时(group_replication_communication_stack = MYSQL),此设置用于组通信连接的 TLS/SSL 配置,以及分布式恢复连接。

  • group_replication_recovery_ssl_key

    命令行格式 --group-replication-recovery-ssl-key=value
    系统变量 group_replication_recovery_ssl_key
    范围 全局
    动态
    SET_VAR 提示适用
    类型 字符串

    此系统变量的值可以在 Group Replication 运行时更改,但更改只有在您停止并重新启动组成员上的 Group Replication 后才会生效。

    group_replication_recovery_ssl_key 指定用于建立安全连接的 SSL 密钥文件的名称。有关配置分布式恢复的 SSL 信息,请参阅 第 20.6.2 节,“使用安全套接字层 (SSL) 保护组通信连接”")。

    如果此服务器已设置为支持克隆(请参阅 第 20.5.4.2 节,“用于分布式恢复的克隆”),并且您已将 group_replication_recovery_use_ssl 设置为 ON,Group Replication 会自动配置克隆 SSL 选项 clone_ssl_key 的设置,以匹配您对 group_replication_recovery_ssl_key 的设置。

    当 MySQL 通信堆栈用于组时(group_replication_communication_stack = MYSQL),此设置用于组通信连接的 TLS/SSL 配置,以及分布式恢复连接。

  • group_replication_recovery_ssl_verify_server_cert

    命令行格式 --group-replication-recovery-ssl-verify-server-cert[={OFF|ON}]
    系统变量 group_replication_recovery_ssl_verify_server_cert
    范围 全局
    动态
    SET_VAR 提示适用
    类型 布尔值
    默认值 OFF

    此系统变量的值可以在 Group Replication 运行时更改,但更改只有在您停止并重新启动组成员上的 Group Replication 后才会生效。

    group_replication_recovery_ssl_verify_server_cert 指定分布式恢复连接是否应检查捐赠者发送的证书中服务器的通用名称值。有关配置分布式恢复的 SSL 信息,请参阅 第 20.6.2 节,“使用安全套接字层 (SSL) 保护组通信连接”")。

    当 MySQL 通信堆栈用于组时(group_replication_communication_stack = MYSQL),此设置用于组通信连接的 TLS/SSL 配置,以及分布式恢复连接。

  • group_replication_recovery_tls_ciphersuites

    命令行格式 --group-replication-recovery-tls-ciphersuites=value
    引入版本 8.0.19
    系统变量 group_replication_recovery_tls_ciphersuites
    范围 全局
    动态
    SET_VAR 提示适用
    类型 字符串
    默认值 NULL

    此系统变量的值可以在 Group Replication 运行时更改,但更改仅在您停止并重新启动组成员上的 Group Replication 后生效。

    group_replication_recovery_tls_ciphersuites 指定在使用 TLSv1.3 进行连接加密时,分布式恢复连接的允许密码套件的一个或多个以冒号分隔的列表,而且此服务器实例是分布式恢复连接中的客户端,即加入成员。如果在使用 TLSv1.3 时将此系统变量设置为 NULL(如果未设置系统变量,则为默认值),则允许默认启用的密码套件,如 第 8.3.2 节,“加密连接 TLS 协议和密码” 中所列。如果将此系统变量设置为空字符串,则不允许任何密码套件,因此不使用 TLSv1.3。此系统变量从 MySQL 8.0.19 版本开始提供。有关配置分布式恢复的 SSL 信息,请参阅 第 20.6.2 节,“使用安全套接字层 (SSL) 保护组通信连接”")。

    当 MySQL 通信堆栈用于组(group_replication_communication_stack = MYSQL)时,此设置用于组通信连接的 TLS/SSL 配置,以及分布式恢复连接。

  • group_replication_recovery_tls_version

    命令行格式 --group-replication-recovery-tls-version=value
    引入版本 8.0.19
    系统变量 group_replication_recovery_tls_version
    范围 全局
    动态
    SET_VAR 提示适用
    类型 字符串
    默认值(≥ 8.0.28) TLSv1.2,TLSv1.3
    默认值(≥ 8.0.19,≤ 8.0.27) TLSv1,TLSv1.1,TLSv1.2,TLSv1.3

    此系统变量的值可以在 Group Replication 运行时更改,但更改只在您停止并重新启动组成员上的 Group Replication 后生效。

    group_replication_recovery_tls_version 指定了一个逗号分隔的允许的一个或多个 TLS 协议列表,用于连接加密,当此服务器实例是分布式恢复连接中的客户端(即加入成员)时。每个分布式恢复连接中涉及的组成员作为客户端(加入成员)和服务器(捐赠者)协商它们都设置支持的最高协议版本。此系统变量从 MySQL 8.0.19 开始可用。

    当 MySQL 通信堆栈用于组(group_replication_communication_stack = MYSQL)时,此设置用于组通信连接的 TLS/SSL 配置,以及分布式恢复连接。

    如果未设置此系统变量,则默认使用“TLSv1,TLSv1.1,TLSv1.2,TLSv1.3”直到 MySQL 8.0.27,从 MySQL 8.0.28 开始,默认使用“TLSv1.2,TLSv1.3”。确保指定的协议版本是连续的,中间没有跳过版本号。

    重要

    • 从 MySQL 8.0.28 开始,MySQL Server 中移除了对 TLSv1 和 TLSv1.1 连接协议的支持。这些协议从 MySQL 8.0.26 开始被弃用,尽管 MySQL Server 客户端,包括充当客户端的 Group Replication 服务器实例,如果使用了弃用的 TLS 协议版本,不会向用户返回警告。有关更多信息,请参阅移除对 TLSv1 和 TLSv1.1 协议的支持。

    • 从 MySQL 8.0.16 开始,MySQL Server 支持 TLSv1.3 协议,前提是 MySQL Server 使用 OpenSSL 1.1.1 进行编译。服务器在启动时检查 OpenSSL 的版本,如果低于 1.1.1,则将从系统变量的默认值中移除 TLSv1.3。在这种情况下,直到 MySQL 8.0.27 为止,默认值为“TLSv1,TLSv1.1,TLSv1.2”,从 MySQL 8.0.28 开始为“TLSv1.2”。

    • 从 MySQL 8.0.18 开始,Group Replication 支持 TLSv1.3,并从 MySQL 8.0.19 开始支持密码套件选择。有关更多信息,请参见第 20.6.2 节,“使用安全套接字层(SSL)保护组通信连接”")。

    有关配置分布式恢复的 SSL 信息,请参见第 20.6.2 节,“使用安全套接字层(SSL)保护组通信连接”")��

  • group_replication_recovery_use_ssl

    命令行格式 --group-replication-recovery-use-ssl[={OFF|ON}]
    系统变量 group_replication_recovery_use_ssl
    范围 全局
    动态
    SET_VAR提示适用
    类型 布尔值
    默认值 OFF

    此系统变量的值可以在 Group Replication 运行时更改,但更改只有在您停止并重新启动组成员上的 Group Replication 后才会生效。

    group_replication_recovery_use_ssl指定 Group Replication 组成员之间的分布式恢复连接是否应该使用 SSL。有关配置分布式恢复的 SSL 信息,请参见第 20.6.2 节,“使用安全套接字层(SSL)保护组通信连接”")。

    如果此服务器已设置为支持克隆(请参阅第 20.5.4.2 节,“用于分布式恢复的克隆”),并且您将此选项设置为ON,则 Group Replication 将使用 SSL 进行远程克隆操作以及从捐赠者的二进制日志传输状态。如果将此选项设置为OFF,则 Group Replication 不会使用 SSL 进行远程克隆操作。

  • group_replication_recovery_zstd_compression_level

    命令行格式 --group-replication-recovery-zstd-compression-level=#
    引入版本 8.0.18
    系统变量 group_replication_recovery_zstd_compression_level
    作用范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 3
    最小值 1
    最大值 22

    在 Group Replication 运行时可以更改此系统变量的值,但更改只有在停止并重新启动组复制时才会生效。

    group_replication_recovery_zstd_compression_level 指定用于使用zstd压缩算法的 Group Replication 分布式恢复连接的压缩级别。允许的级别从 1 到 22,较大的值表示较高级别的压缩。默认的zstd压缩级别为 3。对于不使用zstd压缩的分布式恢复连接,此变量不起作用。

    更多信息,请参阅 第 6.2.8 节,“连接压缩控制”。

  • group_replication_single_primary_mode

    命令行格式 --group-replication-single-primary-mode[={OFF|ON}]
    系统变量 group_replication_single_primary_mode
    作用范围 全局
    动态
    SET_VAR 提示适用
    类型 布尔值
    默认值 ON

    注意

    此系统变量是一个组范围的配置设置,需要完全重新启动复制组才能使更改生效。

    group_replication_single_primary_mode 指示组自动选择一个服务器作为处理读/写工作负载的主服务器。这个服务器是主服务器,其他所有服务器都是从服务器。

    此系统变量是一个组范围的配置设置。它必须在所有组成员上具有相同的值,不能在组复制运行时更改,并且需要对组进行完全重新启动(由具有group_replication_bootstrap_group=ON的服务器引导)以使值更改生效。有关在已执行和认证事务的组中安全引导组的说明,请参见第 20.5.2 节,“重新启动组”。

    如果组为此系统变量设置了一个值,并且加入的成员为该系统变量设置了不同的值,则加入的成员在值匹配之前无法加入该组。如果组成员为此系统变量设置了一个值,而加入的成员不支持该系统变量,则无法加入该组。

    将此变量设置为ON会导致group_replication_auto_increment_increment的任何设置被忽略。

    在 MySQL 8.0.16 及更高版本中,您可以使用group_replication_switch_to_single_primary_mode()group_replication_switch_to_multi_primary_mode()函数在组仍在运行时更改此系统变量的值。有关更多信息,请参见第 20.5.1.2 节,“更改组模式”。

  • group_replication_ssl_mode

    命令行格式 --group-replication-ssl-mode=value
    系统变量 group_replication_ssl_mode
    范围 全局
    动态
    SET_VAR提示适用
    类型 枚举
    默认值 DISABLED
    有效值 DISABLED``REQUIRED``VERIFY_CA``VERIFY_IDENTITY

    可以在组复制运行时更改此系统变量的值,但更改只有在停止并重新启动组复制后才会生效。

    group_replication_ssl_mode设置了组复制成员之间组通信连接的安全状态。可能的值如下:

    DISABLED

    建立一个未加密的连接(默认值)。

    REQUIRED

    如果服务器支持安全连接,则建立安全连接。

    VERIFY_CA

    类似于 REQUIRED,但还根据配置的证书颁发机构(CA)证书验证服务器 TLS 证书。

    VERIFY_IDENTITY

    类似于 VERIFY_CA,但还验证服务器证书是否与尝试连接的主机匹配。

    请参阅 第 20.6.2 节,“使用安全套接字层(SSL)保护组通信连接” 以获取有关为组通信配置 SSL 的信息。

  • group_replication_start_on_boot

    命令行格式 --group-replication-start-on-boot[={OFF|ON}]
    系统变量 group_replication_start_on_boot
    作用范围 全局
    动态
    SET_VAR 提示适用
    类型 布尔值
    默认值 ON

    此系统变量的值可以在 Group Replication 运行���更改,但更改仅在您停止并重新启动组成员上的 Group Replication 后才会生效。

    group_replication_start_on_boot 指定服务器在启动时是否应自动启动 Group Replication(ON)或不启动(OFF)。当您将此选项设置为 ON 时,在使用远程克隆操作进行分布式恢复后,Group Replication 将自动重新启动。

    要在服务器启动时自动启动 Group Replication,必须使用 CHANGE MASTER TO 语句将分布式恢复的用户凭据存储在服务器上的复制元数据存储库中。如果您希望在 START GROUP_REPLICATION 语句中指定用户凭据,该语句仅将用户凭据存储在内存中,请确保 group_replication_start_on_boot 设置为 OFF

  • group_replication_tls_source

    命令行格式 --group-replication-tls-source=value
    引入版本 8.0.21
    系统变量 group_replication_tls_source
    作用范围 全局
    动态
    SET_VAR 提示适用
    类型 枚举
    默认值 mysql_main
    有效值 mysql_main``mysql_admin

    在 Group Replication 运行时可以更改此系统变量的值,但更改只有在您停止并重新启动组成员上的 Group Replication 后才会生效。

    group_replication_tls_source 指定了 Group Replication 的 TLS 材料来源。

  • group_replication_transaction_size_limit

    命令行格式 --group-replication-transaction-size-limit=#
    系统变量 group_replication_transaction_size_limit
    范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 150000000
    最小值 0
    最大值 2147483647
    单位 字节

    此系统变量在所有组成员上应具有相同的值。在 Group Replication 运行时可以更改此系统变量的值。更改立即在组成员上生效,并且从该成员上启动的下一个事务开始应用。在此过程中,系统变量的值允许在组成员之间有所不同,但某些事务可能会被拒绝。

    group_replication_transaction_size_limit 配置了复制组接受的最大事务大小(以字节为单位)。大于此大小的事务将被接收成员回滚,并且不会广播到组中。大事务可能会导致复制组在内存分配方面出现问题,这可能导致系统变慢,或者在网络带宽消耗方面出现问题,这可能导致成员被怀疑已经失败,因为它正忙于处理大事务。

    当此系统变量设置为 0 时,组接受的事务大小没有限制。从 MySQL 8.0 开始,此系统变量的默认设置为 150000000 字节(约为 143 MB)。根据组需要容忍的最大消息大小调整此系统变量的值,要记住,处理事务所需的时间与其大小成正比。group_replication_transaction_size_limit 的值应在所有组成员上相同。有关大事务的进一步缓解策略,请参见 第 20.3.2 节,“Group Replication 限制”。

  • group_replication_unreachable_majority_timeout

    命令行格式 --group-replication-unreachable-majority-timeout=#
    系统变量 group_replication_unreachable_majority_timeout
    范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 0
    最小值 0
    最大值 31536000
    单元

    此系统变量的值可以在 Group Replication 运行时更改,并立即生效。当发生需要该行为的问题时,会读取系统变量的当前值。

    group_replication_unreachable_majority_timeout 指定了成员在遭受网络分区且无法连接到多数派时等待离开组的秒数。在一个由 5 台服务器(S1,S2,S3,S4,S5)组成的组中,如果在(S1,S2)和(S3,S4,S5)之间存在断开连接,则存在网络分区。第一组(S1,S2)现在处于少数派,因为它无法联系到超过一半的组。而多数派组(S3,S4,S5)仍在运行,少数派组等待指定的时间进行网络重新连接。有关此场景的详细描述,请参见第 20.7.8 节,“处理网络分区和丢失法定人数”。

    默认情况下,group_replication_unreachable_majority_timeout 设置为 0,这意味着由于网络分区而发现自己处于少数派的成员将永远等待离开组。如果设置了超时时间,当指定时间到达时,少数派处理的所有待处理事务都将被回滚,并且少数派分区中的服务器将移至ERROR状态。如果成员的 group_replication_autorejoin_tries 系统变量设置了指定的自动重新加入尝试次数,它将在超级只读模式下进行指定次数的重新加入尝试。如果成员没有指定任何自动重新加入尝试,或者已经耗尽了指定次数的尝试次数,则会按照系统变量 group_replication_exit_state_action 指定的操作进行。

    警告

    当你有一个对称的组,例如只有两个成员(S0,S2),如果存在网络分区且没有多数派,在配置的超时时间后,所有成员都会进入ERROR状态。

    欲了解更多关于此选项的信息,请参阅 第 20.7.7.2 节,“无法达到多数超时”。

  • group_replication_view_change_uuid

    命令行格式 --group-replication-view-change-uuid=value
    引入版本 8.0.26
    系统变量 group_replication_view_change_uuid
    作用域 全局
    动态
    SET_VAR 提示适用
    类型 字符串
    默认值 AUTOMATIC

    注意

    这个系统变量是一个整个组的配置设置,需要对复制组进行完全重启才能使更改生效。

    group_replication_view_change_uuid 指定一个替代 UUID,用作组生成的视图更改事件中 GTID 标识符的 UUID 部分。替代 UUID 使这些内部生成的事务易于与从客户端接收的事务区分开。如果您的设置允许在组之间进行故障切换,并且您需要识别和丢弃特定于备份组的事务,则这可能很有用。此系统变量的默认值为 AUTOMATIC,意味着视图更改事件的 GTID 使用由 group_replication_group_name 系统变量指定的组名,就像来自客户端的事务一样。在没有此系统变量的版本中,组成员被视为具有值 AUTOMATIC

    替代 UUID 必须与由 group_replication_group_name 系统变量指定的组名不同,并且必须与任何组成员的服务器 UUID 不同。它还必须与应用于拓扑中任何复制通道上的匿名事务的 GTID 中使用的任何 UUID 不同,使用 CHANGE REPLICATION SOURCE TO 语句的 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS 选项。

    这个系统变量是一个群组范围的配置设置。它必须在所有群组成员上具有相同的数值,不能在 Group Replication 运行时更改,并且需要对群组进行完全重启(由具有 group_replication_bootstrap_group=ON 的服务器引导)以使数值更改生效。有关在已执行和认证事务的群组中安全引导群组的说明,请参见 Section 20.5.2, “Restarting a Group”。

    如果群组对这个系统变量有一个数值设置,而加入的成员对这个系统变量有一个不同的数值设置,那么加入的成员在数值匹配之前无法加入群组。如果群组成员对这个系统变量有一个数值设置,而加入的成员不支持这个系统变量,那么它无法加入群组。

20.9.2 组复制状态变量

原文:dev.mysql.com/doc/refman/8.0/en/group-replication-status-variables.html

MySQL 8.0 支持一个提供有关组复制信息的状态变量。该变量在此处描述:

  • group_replication_primary_member

    在单主模式下运行时显示主成员的 UUID。如果组在多主模式下运行,则显示空字符串。

    警告

    group_replication_primary_member状态变量已被弃用,并计划在将来的版本中删除。

    查看第 20.1.3.1.2 节,“查找主”。

20.10 常见问题

原文:dev.mysql.com/doc/refman/8.0/en/group-replication-frequently-asked-questions.html

本节提供了常见问题的答案。

一个组中 MySQL 服务器的最大数量是多少?

一个组最多可以由 9 台服务器组成。尝试向具有 9 个成员的组添加另一台服务器会导致加入请求被拒绝。这个限制是通过测试和基准测试确定的,是一个安全边界,在稳定的本地区域网络上组表现可靠。

组中的服务器是如何连接的?

组中的服务器通过打开对等 TCP 连接连接到组中的其他服务器。这些连接仅用于组内通信和服务器之间的消息传递。此地址由group_replication_local_address变量配置。

group_replication_bootstrap_group选项用于什么目的?

引导标志指示成员创建一个组并充当初始种子服务器。加入组的第二个成员需要请求引导组的成员动态更改配置,以便将其添加到组中。

成员需要在两种情况下引导组。当组最初创建时,或者当关闭并重新启动整个组时。

如何为分布式恢复过程设置凭据?

您可以将用户凭据永久设置为group_replication_recovery通道的凭据,使用CHANGE REPLICATION SOURCE TO语句(从 MySQL 8.0.23 开始)或CHANGE MASTER TO语句(MySQL 8.0.23 之前)。另外,从 MySQL 8.0.21 开始,您可以在每次启动 Group Replication 时在START GROUP_REPLICATION语句中指定它们。

使用CHANGE REPLICATION SOURCE TO | CHANGE MASTER TO设置的用户凭据以明文形式存储在服务器上的复制元数据存储库中,但在START GROUP_REPLICATION中指定的用户凭据仅保存在内存中,并且通过STOP GROUP_REPLICATION语句或服务器关闭时会被删除。因此,使用START GROUP_REPLICATION指定用户凭据有助于保护组复制服务器免受未经授权的访问。但是,此方法与通过group_replication_start_on_boot系统变量指定自动启动组复制不兼容。有关更多信息,请参见 Section 20.6.3.1, “Secure User Credentials for Distributed Recovery”。

我可以使用组复制来扩展我的写入负载吗?

不直接,但 MySQL 组复制是一种共享无内容完全复制解决方案,组中的所有服务器都复制相同数量的数据。因此,如果组中的一个成员将 N 字节写入存储作为事务提交操作的结果,那么其他成员上也大致会写入 N 字节到存储,因为事务在所有地方都被复制。

然而,由于其他成员不必像原始成员在最初执行事务时那样进行相同数量的处理,他们会更快地应用更改。事务以仅用于应用行转换的格式进行复制,而无需重新执行事务(基于行的格式)。

此外,由于更改以基于行的格式传播和应用,这意味着它们以优化和紧凑的格式接收,并且与原始成员相比,可能减少所需的 IO 操作次数。

总结一下,您可以通过将无冲突的事务分布到组中的不同成员来扩展处理能力。您可以很可能扩展出小部分 IO 操作,因为远程服务器只接收读取-修改-写入到稳定存储的必要更改。

与简单复制相比,组复制是否需要更多的网络带宽和 CPU,在相同的工作负载下?

由于服务器需要不断相互交互以进行同步,因此预计会有一些额外负载。很难量化需要多少数据。这也取决于组的大小(三台服务器对带宽需求的压力比九台服务器少)。

内存和 CPU 占用也更大,因为服务器同步部分和组消息传递需要执行更复杂的工作。

我可以在广域网上部署组复制吗?

是的,但是每个成员之间的网络连接 必须 是可靠的,并且具有适当的性能。低延迟、高带宽的网络连接是实现最佳性能的要求。

如果仅网络带宽是问题,那么可以使用 第 20.7.4 节,“消息压缩” 来降低所需的带宽。然而,如果网络丢包导致重传和更高的端到端延迟,吞吐量和延迟都会受到负面影响。

警告

当任何组成员之间的网络往返时间(RTT)为 5 秒或更长时,您可能会遇到问题,因为内置的故障检测机制可能会错误地触发。

在临时连接问题的情况下,成员是否会自动重新加入组?

这取决于连接问题的原因。如果连接问题是暂时的,并且重新连接足够快以至于故障检测器没有意识到它,那么服务器可能不会从组中移除。如果是一个“长期”的连接问题,那么故障检测器最终会怀疑存在问题,并将服务器从组中移除。

从 MySQL 8.0 开始,有两个设置可用于增加成员保持在组中或重新加入组的机会:

  • group_replication_member_expel_timeout 增加了在创建怀疑(在初始 5 秒检测期之后发生)和将成员驱逐之间的时间。您可以设置最多 1 小时的等待时间。从 MySQL 8.0.21 开始,默认设置为 5 秒的等待时间。

  • group_replication_autorejoin_tries 使成员在被驱逐或不可达的大多数超时后尝试重新加入组。成员将按照指定的次数间隔五分钟进行自动重新加入尝试。从 MySQL 8.0.21 开始,默认情况下激活此功能,并且成员进行三次自动重新加入尝试。

如果服务器被从组中驱逐,并且任何自动重新加入尝试都不成功,您需要手动重新加入它。换句话说,当服务器被明确从组中移除后,您需要手动重新加入它(或者有一个脚本自动执行)。

什么时候会将成员从组中排除?

如果成员变得沉默,其他成员将其从组配置中移除。实际上,当成员崩溃或存在网络断开时可能会发生这种情况。

在给定成员经过一定超时后检测到故障,并创建一个不包含静默成员的新配置。

当一个节点明显滞后时会发生什么?

没有一种方法可以自动定义何时从组中自动驱逐成员的策略。您需要找出为什么成员滞后并解决问题,或将该成员从组中移除。否则,如果服务器太慢以至于触发流量控制,那么整个组也会减速。流量控制可以根据您的需求进行配置。

在怀疑组内出现问题时,是否有特定成员负责触发重新配置?

不,组内没有特定成员负责触发重新配置。

任何成员都可以怀疑存在问题。所有成员需要(自动)同意某个成员已经失败。一个成员负责将其从组中驱逐,触发重新配置。负责驱逐成员的成员不是您可以控制或设置的。

我可以将 Group Replication 用于分片吗?

Group Replication 旨在提供高可用性的副本集;数据和写入在组内的每个成员上都会复制。为了扩展超出单个系统所能提供的范围,您需要围绕多个 Group Replication 集构建编排和分片框架,其中每个副本集维护和管理总数据集的给定分片或分区。这种设置通常称为“分片集群”,允许您线性扩展读取和写入,而且没有限制。

如何在使用 SELinux 时使用 Group Replication?

如果启用了 SELinux,您可以使用 sestatus -v 进行验证,然后需要启用 Group Replication 通信端口的使用。请参阅 为 Group Replication 设置 TCP 端口上下文。

如何在使用 iptables 时使用 Group Replication?

如果启用了 iptables,那么您需要为机器之间的通信打开 Group Replication 端口。要查看每台机器上当前的规则,请执行 iptables -L。假设配置的端口是 33061,在必要端口上启用通信,请执行 iptables -A INPUT -p tcp --dport 33061 -j ACCEPT

如何恢复由组成员使用的复制通道的中继日志?

Group Replication 使用的复制通道的行为方式与异步源到副本复制中使用的复制通道相同,因此依赖于中继日志。在更改relay_log变量或主机名更改时,可能会出现错误。请参阅 Section 19.2.4.1, “The Relay Log”以了解在此情况下的恢复过程。另外,在 Group Replication 中专门解决此问题的另一种方法是发出STOP GROUP_REPLICATION语句,然后发出START GROUP_REPLICATION语句重新启动实例。Group Replication 插件会再次创建group_replication_applier通道。

Group Replication 为什么使用两个绑定地址?

Group Replication 使用两个绑定地址,以便在 SQL 地址(客户端用于与成员通信的地址)和group_replication_local_address之间分割网络流量,成员内部使用该地址进行通信。例如,假设一个服务器有两个网络接口分配给网络地址203.0.113.1198.51.100.179。在这种情况下,您可以通过设置group_replication_local_address=203.0.113.1:33061来使用203.0.113.1:33061作为内部组网络地址。然后您可以使用198.51.100.179作为hostname3306作为port。客户端 SQL 应用程序将连接到198.51.100.179:3306的成员。这使您可以在不同网络上配置不同的规则。同样,内部组通信可以与用于客户端应用程序的网络连接分开,以增加安全性。

Group Replication 如何使用网络地址和主机名?

Group Replication 使用成员之间的网络连接,因此其功能直接受到主机名和端口配置的影响。例如,Group Replication 的分布式恢复过程使用服务器的主机名和端口创建到现有组成员的连接。当成员加入组时,它会接收组成员信息,使用在performance_schema.replication_group_members中列出的网络地址信息。该表中列出的成员之一被选为从组到加入成员的缺失数据的捐赠者。

这意味着使用主机名配置的任何值,例如 SQL 网络地址或组种子地址,必须是完全合格的名称,并且每个组成员都可以解析。例如,您可以通过 DNS 或正确配置的/etc/hosts文件或其他本地进程来确保这一点。如果您想在服务器上配置MEMBER_HOST值,请在将其加入组之前使用服务器上的--report-host选项指定。

重要

分配的值直接使用,不受skip_name_resolve系统变量的影响。

要在服务器上配置MEMBER_PORT,请使用report_port系统变量指定。

为什么服务器上的自增设置发生了变化?

当在服务器上启动 Group Replication 时,auto_increment_increment的值会更改为group_replication_auto_increment_increment的值,默认为 7,并且auto_increment_offset的值会更改为服务器 ID。当 Group Replication 停止时,更改会被还原。这些设置避免了在组成员上写入时选择重复的自增值,从而导致事务回滚。Group Replication 的默认自增值 7 代表可用值数量和复制组的允许最大大小(9 个成员)之间的平衡。

只有当auto_increment_incrementauto_increment_offset的值都已经被修改为默认值 1 时,更改才会生效并回滚。如果它们的值已经从默认值修改过,Group Replication 不会改变它们。从 MySQL 8.0 开始,当 Group Replication 处于单主模式时,系统变量也不会被修改,只有一个服务器进行写入。

如何找到主服务器?

如果组在单主模式下运行,找出哪个成员是主要的可能很有用。请参阅 Section 20.1.3.1.2, “Finding the Primary”

第二十一章 MySQL Shell

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-userguide.html

MySQL Shell 是用于 MySQL 服务器的高级客户端和代码编辑器。除了提供的 SQL 功能外,类似于mysql,MySQL Shell 还提供了 JavaScript 和 Python 的脚本功能,并包括用于与 MySQL 交互的 API。MySQL Shell 是一个可以单独安装的组件。

以下讨论简要描述了 MySQL Shell 的功能。有关更多信息,请参阅 MySQL Shell 手册,网址为dev.mysql.com/doc/mysql-shell/en/

MySQL Shell 包括以下用 JavaScript 和 Python 实现的 API,您可以使用这些 API 开发与 MySQL 交互的代码。

  • 当 MySQL Shell 连接到 MySQL 服务器使用 X 协议时,X DevAPI 使开发人员能够同时处理关系型和文档数据。这使您可以将 MySQL 用作文档存储,有时被称为“使用 NoSQL”。有关更多信息,请参阅第二十二章,将 MySQL 用作文档存储。有关 X DevAPI 的概念和用法的文档,请参阅《X DevAPI 用户指南》。

  • AdminAPI 使数据库管理员能够使用 InnoDB Cluster,为基于 InnoDB 的 MySQL 数据库提供了高可用性和可伸缩性的集成解决方案,而无需高级 MySQL 专业知识。AdminAPI 还包括对 InnoDB ReplicaSet 的支持,它使您能够以类似于 InnoDB Cluster 的方式管理运行异步 GTID 基于复制的一组 MySQL 实例。此外,AdminAPI 使 MySQL Router 的管理更加简单,包括与 InnoDB Cluster 和 InnoDB ReplicaSet 的集成。请参阅 MySQL AdminAPI。

MySQL Shell 有两个版本,社区版和商业版。社区版免费提供。商业版提供额外的企业功能,成本低廉。

第二十二章 使用 MySQL 作为文档存储

原文:dev.mysql.com/doc/refman/8.0/en/document-store.html

目录

22.1 MySQL 文档存储的接口

22.2 文档存储概念

22.3 JavaScript 快速入门指南:MySQL Shell 文档存储

22.3.1 MySQL Shell

22.3.2 下载并导入 world_x 数据库

22.3.3 文档和集合

22.3.4 关系表

22.3.5 表格中的文档

22.4 Python 快速入门指南:MySQL Shell 文档存储

22.4.1 MySQL Shell

22.4.2 下载并导入 world_x 数据库

22.4.3 文档和集合

22.4.4 关系表

22.4.5 表格中的文档

22.5 X 插件

22.5.1 检查 X 插件安装

22.5.2 禁用 X 插件

22.5.3 使用加密连接与 X 插件

22.5.4 使用 X 插件与缓存 SHA-2 认证插件

22.5.5 使用 X 插件进行连接压缩

22.5.6 X 插件选项和变量

22.5.7 监控 X 插件

本章介绍了一种与 MySQL 作为文档存储一起工作的替代方式,有时被称为“使用 NoSQL”。如果您打算以传统(SQL)方式使用 MySQL,那么本章可能与您无关。

传统上,诸如 MySQL 这样的关系型数据库通常要求在存储文档之前定义模式。本节描述的功能使您能够将 MySQL 用作文档存储,这是一种无模式、因此是模式灵活的文档存储系统。例如,当您创建描述产品的文档时,您无需知道和定义任何产品的所有可能属性,就可以存储和操作文档。这与在关系型数据库中工作并将产品存储在表中有所不同,因为在向数据库添加任何产品之前,必须知道和定义表的所有列。本章描述的功能使您能够选择如何配置 MySQL,仅使用文档存储模型,或将文档存储模型的灵活性与关系模型的强大功能结合起来。

要将 MySQL 用作文档存储,您需要使用以下服务器功能:

  • X 插件使 MySQL 服务器能够使用 X 协议与客户端通信,这是将 MySQL 用作文档存储的先决条件。从 MySQL 8.0 开始,X 插件在 MySQL 服务器中默认启用。有关验证 X 插件安装、配置和监视的说明,请参阅第 22.5 节,“X 插件”。

  • X 协议支持 CRUD 和 SQL 操作,通过 SASL 进行身份验证,允许流式传输(流水线处理)命令,并且在协议和消息层面是可扩展的。与 X 协议兼容的客户端包括 MySQL Shell 和 MySQL 8.0 连接器。

  • 使用 X 协议与 MySQL 服务器通信的客户端可以使用 X DevAPI 来开发应用程序。X DevAPI 提供了一个现代的编程接口,设计简单而强大,支持已建立的行业标准概念。本章介绍如何在 MySQL Shell 中作为客户端使用 X DevAPI 的 JavaScript 或 Python 实现。详细教程请参阅 X DevAPI 用户指南。

22.1 MySQL 文档存储接口

原文:dev.mysql.com/doc/refman/8.0/en/document-store-interfaces.html

要将 MySQL 作为文档存储使用,您需要使用专用组件和支持与 MySQL 服务器通信的客户端来开发基于文档的应用程序。

  • 以下 MySQL 产品支持 X 协议,并允许您在选择的语言中使用 X DevAPI 开发与作为文档存储的 MySQL 服务器通信的应用程序:

    • MySQL Shell(提供 JavaScript 和 Python 中 X DevAPI 的实现)

    • Connector/C++

    • Connector/J

    • Connector/Node.js

    • Connector/NET

    • Connector/Python

  • MySQL Shell 是一个交互式界面,支持 JavaScript、Python 或 SQL 模式的 MySQL。您可以使用 MySQL Shell 来原型应用程序,执行查询和更新数据。安装 MySQL Shell 包含下载和安装 MySQL Shell 的说明。

  • 本章中的快速入门指南(教程)将帮助您开始使用 MySQL Shell 与 MySQL 作为文档存储。

    JavaScript 的快速入门指南在这里:第 22.3 节,“JavaScript 快速入门指南:用于文档存储的 MySQL Shell”。

    Python 的快速入门指南在这里:第 22.4 节,“Python 快速入门指南:用于文档存储的 MySQL Shell”。

  • MySQL Shell 用户指南在 MySQL Shell 8.0 提供了关于配置和使用 MySQL Shell 的详细信息。

22.2 文档存储概念

原文:dev.mysql.com/doc/refman/8.0/en/document-store-concepts.html

本节解释了在使用 MySQL 作为文档存储时引入的概念。

  • JSON 文档

  • 集合

  • CRUD 操作

JSON 文档

JSON 文档是由键值对组成的数据结构,是使用 MySQL 作为文档存储的基本结构。例如,world_x 模式(本章后面安装)包含这个文档:

{
    "GNP": 4834,
    "_id": "00005de917d80000000000000023",
    "Code": "BWA",
    "Name": "Botswana",
    "IndepYear": 1966,
    "geography": {
        "Region": "Southern Africa",
        "Continent": "Africa",
        "SurfaceArea": 581730
    },
    "government": {
        "HeadOfState": "Festus G. Mogae",
        "GovernmentForm": "Republic"
    },
    "demographics": {
        "Population": 1622000,
        "LifeExpectancy": 39.29999923706055
    }
}

这份文档显示,键的值可以是简单的数据类型,比如整数或字符串,也可以包含其他文档、数组和文档列表。例如,geography 键的值由多个键值对组成。JSON 文档在 MySQL 中内部表示为二进制 JSON 对象,通过JSON MySQL 数据类型。

文档与传统关系数据库中的表格之间最重要的区别在于,文档的结构不需要提前定义,并且一个集合可以包含具有不同结构的多个文档。另一方面,关系表要求定义其结构,并且表中的所有行必须包含相同的列。

集合

集合是用于在 MySQL 数据库中存储 JSON 文档的容器。应用程序通常针对文档集合运行操作,例如查找特定文档。

CRUD 操作

可以针对集合执行的四个基本操作是创建(Create)、读取(Read)、更新(Update)和删除(Delete)(CRUD)。在 MySQL 中,这意味着:

  • 创建一个新文档(插入或添加)

  • 读取一个或多个文档(查询)

  • 更新一个或多个文档

  • 删除一个或多个文档

22.3 JavaScript 快速入门指南:用于文档存储的 MySQL Shell

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript.html

22.3.1 MySQL Shell

22.3.2 下载和导入 world_x 数据库

22.3.3 文档和集合

22.3.4 关系表

22.3.5 表中的文档

本快速入门指南提供了使用 MySQL Shell 与文档存储应用程序进行交互原型设计的指令。该指南包括以下主题:

  • MySQL 功能、MySQL Shell 和world_x示例模式的介绍。

  • 操作以管理集合和文档。

  • 操作以管理关系表。

  • 适用于表中文档的操作。

要按照这个快速入门指南,您需要安装了 X 插件的 MySQL 服务器,默认情况下在 8.0 中,并且使用 MySQL Shell 作为客户端。MySQL Shell 8.0 提供了关于 MySQL Shell 更深入的信息。文档存储使用 X DevAPI 访问,并且 MySQL Shell 在 JavaScript 和 Python 中都提供了这个 API。

相关信息

  • MySQL Shell 8.0 提供了关于 MySQL Shell 更深入的信息。

  • 有关本快速入门指南中使用的工具的更多信息,请参阅安装 MySQL Shell 和第 22.5 节,“X 插件”。

  • X DevAPI 用户指南提供了更多使用 X DevAPI 开发使用文档存储的应用程序的示例。

  • 还提供了一个 Python 快速入门指南。

22.3.1 MySQL Shell

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-shell.html

本快速入门指南假定您对 MySQL Shell 有一定的了解。以下部分是一个高级概述,请参阅 MySQL Shell 文档以获取更多信息。MySQL Shell 是到 MySQL 服务器的统一脚本接口。它支持 JavaScript 和 Python 脚本。JavaScript 是默认处理模式。

启动 MySQL Shell

安装并启动 MySQL 服务器后,将 MySQL Shell 连接到服务器实例。您需要知道要连接的 MySQL 服务器实例的地址。要将实例用作文档存储,服务器实例必须安装 X 插件,并且您应该使用 X 协议连接到服务器。例如,要连接到默认 X 协议端口 33060 上的实例 ds1.example.com,请使用网络字符串 *user*@ds1.example.com:33060

提示

如果您使用经典的 MySQL 协议连接到实例,例如使用默认的port 3306,而不是mysqlx_port,则无法使用本教程中展示的文档存储功能。例如,db 全局对象未被填充。要使用文档存储功能,请始终使用 X 协议连接。

如果 MySQL Shell 尚未运行,请打开一个终端窗口并输入:

mysqlsh *user*@ds1.example.com:33060/world_x

或者,如果 MySQL Shell 已在运行,请使用 \connect 命令输入:

\connect *user*@ds1.example.com:33060/world_x

您需要指定要将 MySQL Shell 连接到的 MySQL 服务器实例的地址。例如,在上一个示例中:

  • user 代表您的 MySQL 帐户的用户名。

  • ds1.example.com 是运行 MySQL 的服务器实例的主机名。请将其替换为您用作文档存储的 MySQL 服务器实例的主机名。

  • 本会话的默认模式为 world_x。有关设置 world_x 模式的说明,请参见 Section 22.3.2, “下载和导入 world_x 数据库”。

有关更多信息,请参见 Section 6.2.5, “使用类似 URI 字符串或键值对连接到服务器”。

一旦 MySQL Shell 打开,mysql-js> 提示表示此会话的活动语言为 JavaScript。

mysql-js>

MySQL Shell 支持以下输入行编辑:

  • 左箭头右箭头 键在当前输入行内水平移动。

  • 上箭头下箭头 键在先前输入的行集中上下移动。

  • Backspace 删除光标前的字符,输入新字符会在光标位置输入。

  • Enter发送当前输入行到服务器。

获取 MySQL Shell 帮助

在命令解释器提示符处输入mysqlsh --help以获取命令行选项列表。

mysqlsh --help

在 MySQL Shell 提示符处输入\help以获取可用命令及其描述列表。

mysql-js> \help

输入\help后跟命令名称以获取有关单个 MySQL Shell 命令的详细帮助。例如,要查看\connect命令的帮助,请输入:

mysql-js> \help \connect

退出 MySQL Shell

要退出 MySQL Shell,请输入以下命令:

mysql-js> \quit

相关信息

  • 查看交互式代码执行以了解 MySQL Shell 中交互式代码执行的工作原理。

  • 查看使用 MySQL Shell 入门以了解会话和连接选项。

22.3.2 下载并导入 world_x 数据库

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-download.html

作为快速入门指南的一部分,提供了一个示例模式,称为world_x模式。许多示例演示了使用此模式的文档存储功能。启动您的 MySQL 服务器,以便加载world_x模式,然后按照以下步骤操作:

  1. 下载world_x-db.zip

  2. 将安装归档文件提取到临时位置,例如/tmp/。解压缩归档文件会生成一个名为world_x.sql的单个文件。

  3. world_x.sql文件导入到您的服务器。您可以选择:

    • 在 SQL 模式下启动 MySQL Shell,并通过以下方式导入文件:

      mysqlsh -u root --sql --file /tmp/world_x-db/world_x.sql
      Enter password: ****
      
    • 在运行时将 MySQL Shell 设置为 SQL 模式,并通过以下方式源化模式文件:

      \sql
      Switching to SQL mode... Commands end with ;
      \source /tmp/world_x-db/world_x.sql
      

    /tmp/替换为系统中world_x.sql文件的路径。如果提示,请输入密码。只要帐户具有创建新模式的权限,非 root 帐户就可以使用。

world_x 模式

world_x示例模式包含以下 JSON 集合和关系表:

  • 集合

    • countryinfo:关于世界各国的信息。
    • country:关于世界各国的基本信息。

    • city:关于这些国家中一些城市的信息。

    • countrylanguage:每个国家使用的语言。

相关信息

  • MySQL Shell 会话解释了会话类型。

22.3.3 文档和集合

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-documents-collections.html

22.3.3.1 创建、列出和删除集合

22.3.3.2 使用集合

22.3.3.3 查找文档

22.3.3.4 修改文档

22.3.3.5 删除文档

22.3.3.6 创建和删除索引

当您将 MySQL 用作文档存储时,集合是模式内的容器,您可以创建、列出和删除。集合包含您可以添加、查找、更新和删除的 JSON 文档。

本节示例使用world_x模式中的countryinfo集合。有关设置world_x模式的说明,请参见第 22.3.2 节,“下载和导入 world_x 数据库”。

文档

在 MySQL 中,文档被表示为 JSON 对象。在内部,它们以一种高效的二进制格式存储,可以实现快速查找和更新。

  • JavaScript 的简单文档格式:

    {field1: "value", field2 : 10, "field 3": null}
    
    

一个文档数组由一组由逗号分隔并包含在[]字符中的文档组成。

  • JavaScript 的简单文档数组:

    [{"Name": "Aruba", "Code:": "ABW"}, {"Name": "Angola", "Code:": "AGO"}]
    
    

MySQL 支持 JSON 文档中的以下 JavaScript 值类型:

  • 数字(整数和浮点数)

  • 字符串

  • 布尔值(False 和 True)

  • null

  • 更多 JSON 值的数组

  • 更多 JSON 值的嵌套(或嵌入)对象

集合

集合是用于共享目的和可能共享一个或多个索引的文档的容器。每个集合都有一个唯一的名称,并存在于单个模式中。

术语模式等同于数据库,意味着一组数据库对象,而不是用于强制数据结构和约束的关系模式。模式不会对集合中的文档强制执行一致性。

在这个快速入门指南中:

  • 基本对象包括:

    对象形式 描述
    db db是分配给当前活动模式的全局变量。当您想对模式运行操作时,例如检索集合,您可以使用db变量可用的方法。
    db.getCollections() db.getCollections() 返回模式中集合的列表。使用列表获取对集合对象的引用,对其进行迭代等。
  • 由集合范围的基本操作包括:

    操作形式 描述
    db.*name*.add() add() 方法将一个或多个文档插入到指定集合中。
    db.*name*.find() find() 方法返回指定集合中的一些或所有文档。
    db.*name*.modify() modify() 方法更新指定集合中的文档。
    db.*name*.remove() remove() 方法从指定集合中删除一个或多个文档。

相关信息

  • 查看 Working with Collections 以获取一般概述。

  • CRUD EBNF Definitions 提供了完整的操作列表。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-collections-operations.html

22.3.3.1 创建、列出和删除集合

在 MySQL Shell 中,您可以创建新集合,获取模式中现有集合的列表,并从模式中删除一个已存在的集合。集合名称区分大小写,每个集合名称必须是唯一的。

确认模式

要显示分配给模式变量的值,请执行:

mysql-js> db

如果模式值不是Schema:world_x,则通过执行以下命令设置db变量:

mysql-js> \use world_x
创建一个集合

要在现有模式中创建一个新集合,使用db对象的createCollection()方法。以下示例在world_x模式中创建一个名为flags的集合。

mysql-js> db.createCollection("flags")

该方法返回一个集合对象。

<Collection:flags>
列出集合

要显示world_x模式中的所有集合,请使用db对象的getCollections()方法。由当前连接到的服务器返回的集合将显示在括号之间。

mysql-js> db.getCollections()
[
    <Collection:countryinfo>,
    <Collection:flags>
]
删除一个集合

要从模式中删除一个已存在的集合,使用db对象的dropCollection()方法。例如,要从当前模式中删除flags集合,执行:

mysql-js> db.dropCollection("flags")

dropCollection()方法也可用于在 MySQL Shell 中从模式中删除关系表。

相关信息
  • 查看集合对象以获取更多示例。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-collections-add.html

22.3.3.2 与集合一起工作

要在模式中使用集合,请使用db全局对象访问当前模式。在此示例中,我们使用之前导入的world_x模式和countryinfo集合。因此,您发出的操作格式为db.*collection_name*.operation,其中collection_name是执行操作的集合的名称。在以下示例中,操作是针对countryinfo集合执行的。

添加文档

使用add()方法将一个文档或文档列表插入到现有集合中。将以下文档插入到countryinfo集合中。由于这是多行内容,请按两次Enter键以插入文档。

mysql-js> db.countryinfo.add(
 {
    GNP: .6,
    IndepYear: 1967,
    Name: "Sealand",
    Code: "SEA",
    demographics: {
        LifeExpectancy: 79,
        Population: 27
    },
    geography: {
        Continent: "Europe",
        Region: "British Islands",
        SurfaceArea: 193
    },
    government: {
        GovernmentForm: "Monarchy",
        HeadOfState: "Michael Bates"
    }
  }
)

该方法返回操作的状态。您可以通过搜索文档来验证操作。例如:

mysql-js> db.countryinfo.find("Name = 'Sealand'")
{
    "GNP": 0.6,
    "_id": "00005e2ff4af00000000000000f4",
    "Name": "Sealand",
    "Code:": "SEA",
    "IndepYear": 1967,
    "geography": {
        "Region": "British Islands",
        "Continent": "Europe",
        "SurfaceArea": 193
    },
    "government": {
        "HeadOfState": "Michael Bates",
        "GovernmentForm": "Monarchy"
    },
    "demographics": {
        "Population": 27,
        "LifeExpectancy": 79
    }
}

请注意,除了在添加文档时指定的字段之外,还有一个字段,即_id。每个文档都需要一个名为_id的标识符字段。_id字段的值在同一集合中的所有文档中必须是唯一的。在 MySQL 8.0.11 及更高版本中,文档 ID 由服务器生成,而不是客户端生成,因此 MySQL Shell 不会自动设置_id值。如果文档不包含_id字段,MySQL 8.0.11 或更高版本的服务器会设置_id值。在较早的 8.0 版本或 5.7 版本的 MySQL 服务器中,在这种情况下不会设置_id值,因此您必须明确指定它。如果不指定,MySQL Shell 将返回错误 5115 文档缺少必需字段。有关更多信息,请参见理解文档 ID。

相关信息
  • 查看 CollectionAddFunction 以获取完整的语法定义。

  • 查看理解文档 ID。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-documents-find.html

22.3.3.3 查找文档

您可以使用find()方法查询并返回模式中集合中的文档。MySQL Shell 提供额外的方法与find()方法一起使用,以过滤和排序返回的文档。

MySQL 提供以下运算符来指定搜索条件:OR||)、AND&&)、XORISNOTBETWEENINLIKE!=<>>>=<<=&|<<>>+-*/~%

查找集合中的所有文档

要返回集合中的所有文档,请使用不指定搜索条件的find()方法。例如,以下操作返回countryinfo集合中的所有文档。

mysql-js> db.countryinfo.find()
[
     {
          "GNP": 828,
          "Code:": "ABW",
          "Name": "Aruba",
          "IndepYear": null,
          "geography": {
              "Continent": "North America",
              "Region": "Caribbean",
              "SurfaceArea": 193
          },
          "government": {
              "GovernmentForm": "Nonmetropolitan Territory of The Netherlands",
              "HeadOfState": "Beatrix"
          }
          "demographics": {
              "LifeExpectancy": 78.4000015258789,
              "Population": 103000
          },
          ...
      }
 ]
240 documents in set (0.00 sec)

该方法生成包含操作信息以及集合中所有文档的结果。

空集(无匹配文档)返回以下信息:

Empty set (0.00 sec)

过滤搜索

您可以使用find()方法包含搜索条件。形成搜索条件的表达式语法与传统 MySQL 第十四章,函数和运算符相同。您必须将所有表达式括在引号中。为简洁起见,一些示例未显示输出。

一个简单的搜索条件可能包括Name字段和我们知道在文档中的值。以下示例返回单个文档:

mysql-js> db.countryinfo.find("Name = 'Australia'")
[
    {
        "GNP": 351182,
        "Code:": "AUS",
        "Name": "Australia",
        "IndepYear": 1901,
        "geography": {
            "Continent": "Oceania",
            "Region": "Australia and New Zealand",
            "SurfaceArea": 7741220
        },
        "government": {
            "GovernmentForm": "Constitutional Monarchy, Federation",
            "HeadOfState": "Elisabeth II"
        }
        "demographics": {
            "LifeExpectancy": 79.80000305175781,
            "Population": 18886000
        },
    }
]

以下示例搜索所有人均 GNP 高于 5000 亿美元的国家。countryinfo集合以百万为单位衡量 GNP。

mysql-js> db.countryinfo.find("GNP > 500000")
...[*output removed*]
10 documents in set (0.00 sec)

下面查询中的人口字段嵌入在 demographics 对象中。要访问嵌入字段,请在 demographics 和 Population 之间使用句点来标识关系。文档和字段名称区分大小写。

mysql-js> db.countryinfo.find("GNP > 500000 and demographics.Population < 100000000")
...[*output removed*]
6 documents in set (0.00 sec)

下面表达式中的算术运算符用于查询人均 GNP 高于$30000 的国家。搜索条件可以包括算术运算符和大多数 MySQL 函数。

注意

countryinfo集合中有七个文档的人口值为零。因此,在输出末尾会出现警告消息。

mysql-js> db.countryinfo.find("GNP*1000000/demographics.Population > 30000")
...[*output removed*]
9 documents in set, 7 warnings (0.00 sec)
Warning (Code 1365): Division by 0
Warning (Code 1365): Division by 0
Warning (Code 1365): Division by 0
Warning (Code 1365): Division by 0
Warning (Code 1365): Division by 0
Warning (Code 1365): Division by 0
Warning (Code 1365): Division by 0

您可以使用bind()方法将值与搜索条件分离。例如,不要将硬编码的国家名称指定为条件,而是用以字母开头的名称后跟冒号组成的命名占位符替换。然后使用bind(*占位符*, **)方法如下:

mysql-js> db.countryinfo.find("Name = :country").bind("country", "Italy")
{
    "GNP": 1161755,
    "_id": "00005de917d8000000000000006a",
    "Code": "ITA",
    "Name": "Italy",
    "Airports": [],
    "IndepYear": 1861,
    "geography": {
        "Region": "Southern Europe",
        "Continent": "Europe",
        "SurfaceArea": 301316
    },
    "government": {
        "HeadOfState": "Carlo Azeglio Ciampi",
        "GovernmentForm": "Republic"
    },
    "demographics": {
        "Population": 57680000,
        "LifeExpectancy": 79
    }
}
1 document in set (0.01 sec)

提示

在程序内,绑定使您能够在表达式中指定占位符,在执行之前用值填充,并且可以从适当的自动转义中受益。

始终使用绑定来清理输入。避免使用字符串拼接在查询中引入值,这可能会产生无效输入,并且在某些情况下可能会导致安全问题。

您可以使用占位符和bind()方法创建保存的搜索,然后可以使用不同的值调用它们。例如,为一个国家创建一个保存的搜索:

mysql-js> var myFind = db.countryinfo.find("Name = :country")
mysql-js> myFind.bind('country', 'France')
{
    "GNP": 1424285,
    "_id": "00005de917d80000000000000048",
    "Code": "FRA",
    "Name": "France",
    "IndepYear": 843,
    "geography": {
        "Region": "Western Europe",
        "Continent": "Europe",
        "SurfaceArea": 551500
    },
    "government": {
        "HeadOfState": "Jacques Chirac",
        "GovernmentForm": "Republic"
    },
    "demographics": {
        "Population": 59225700,
        "LifeExpectancy": 78.80000305175781
    }
}
1 document in set (0.0028 sec)

mysql-js> myFind.bind('country', 'Germany')
{
    "GNP": 2133367,
    "_id": "00005de917d80000000000000038",
    "Code": "DEU",
    "Name": "Germany",
    "IndepYear": 1955,
    "geography": {
        "Region": "Western Europe",
        "Continent": "Europe",
        "SurfaceArea": 357022
    },
    "government": {
        "HeadOfState": "Johannes Rau",
        "GovernmentForm": "Federal Republic"
    },
    "demographics": {
        "Population": 82164700,
        "LifeExpectancy": 77.4000015258789
    }
}

1 document in set (0.0026 sec)
项目结果

您可以返回文档的特定字段,而不是返回所有字段。以下示例返回符合搜索条件的countryinfo集合中所有文档的 GNP 和 Name 字段。

使用fields()方法传递要返回的字段列表。

mysql-js> db.countryinfo.find("GNP > 5000000").fields(["GNP", "Name"])
[
    {
        "GNP": 8510700,
        "Name": "United States"
    }
]
1 document in set (0.00 sec)

此外,您可以修改返回的文档——添加、重命名、嵌套甚至计算新字段值——使用描述要返回的文档的表达式。例如,使用以下表达式更改字段的名称以仅返回两个文档。

mysql-js> db.countryinfo.find().fields(
mysqlx.expr('{"Name": upper(Name), "GNPPerCapita": GNP*1000000/demographics.Population}')).limit(2)
{
    "Name": "ARUBA",
    "GNPPerCapita": 8038.834951456311
}
{
    "Name": "AFGHANISTAN",
    "GNPPerCapita": 263.0281690140845
}
限制、排序和跳过结果

您可以应用limit()sort()skip()方法来管理find()方法返回的文档数量和顺序。

要指定结果集中包含的文档数量,请将limit()方法附加到find()方法,并指定一个值。以下查询返回countryinfo集合中的前五个文档。

mysql-js> db.countryinfo.find().limit(5)
... [*output removed*]
5 documents in set (0.00 sec)

要为结果指定顺序,请将sort()方法附加到find()方法。将一个或多个要按其排序的字段列表传递给sort()方法,并根据需要选择降序(desc)或升序(asc)属性。升序顺序是默认的顺序类型。

例如,以下查询按独立年份字段对所有文档进行排序,然后按降序返回前八个文档。

mysql-js> db.countryinfo.find().sort(["IndepYear desc"]).limit(8)
... [*output removed*]
8 documents in set (0.00 sec)

默认情况下,limit()方法从集合中的第一个文档开始。您可以使用skip()方法更改起始文档。例如,要忽略第一个文档并返回符合条件的下一个八个文档,请将值 1 传递给skip()方法。

mysql-js> db.countryinfo.find().sort(["IndepYear desc"]).limit(8).skip(1)
... [*output removed*]
8 documents in set (0.00 sec)
相关信息
  • MySQL 参考手册提供了有关函数和运算符的详细文档。

  • 请参阅 CollectionFindFunction 获取完整的语法定义。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-documents-modify.html

22.3.3.4 修改文档

您可以使用modify()方法更新集合中的一个或多个文档。X DevAPI 提供了与modify()方法一起使用的其他方法,以:

  • 在文档内设置和取消设置字段。

  • 追加、插入和删除数组。

  • 绑定、限制和排序要修改的文档。

设置和取消设置文档字段

modify()方法通过过滤集合以仅包括要修改的文档,然后将您指定的操作应用于这些文档来工作。

在下面的示例中,modify()方法使用搜索条件标识要更改的文档,然后set()方法替换了嵌套的 demographics 对象中的两个值。

mysql-js> db.countryinfo.modify("Code = 'SEA'").set(
"demographics", {"LifeExpectancy": 78, "Population": 28})

修改文档后,请使用find()方法验证更改。

要从文档中删除内容,请使用modify()unset()方法。例如,以下查询从符合搜索条件的文档中删除了 GNP。

mysql-js> db.countryinfo.modify("Name = 'Sealand'").unset("GNP")

使用find()方法验证更改。

mysql-js> db.countryinfo.find("Name = 'Sealand'")
{
    "_id": "00005e2ff4af00000000000000f4",
    "Name": "Sealand",
    "Code:": "SEA",
    "IndepYear": 1967,
    "geography": {
        "Region": "British Islands",
        "Continent": "Europe",
        "SurfaceArea": 193
    },
    "government": {
        "HeadOfState": "Michael Bates",
        "GovernmentForm": "Monarchy"
    },
    "demographics": {
        "Population": 27,
        "LifeExpectancy": 79
    }
}
追加、插入和删除数组

要向数组字段追加元素,或在数组中插入、删除元素,请使用arrayAppend()arrayInsert()arrayDelete()方法。以下示例修改了countryinfo集合以启用对国际机场的跟踪。

第一个示例使用modify()set()方法在所有文档中创建一个新的 Airports 字段。

注意

在修改文档时要小心,如果没有指定搜索条件,会修改集合中的所有文档。

mysql-js> db.countryinfo.modify("true").set("Airports", [])

添加了 Airports 字段后,下一个示例使用arrayAppend()方法向其中一个文档添加新机场。在下面的示例中,$.Airports代表当前文档的 Airports 字段。

mysql-js> db.countryinfo.modify("Name = 'France'").arrayAppend("$.Airports", "ORY")

使用find()查看更改。

mysql-js> db.countryinfo.find("Name = 'France'")
{
    "GNP": 1424285,
    "_id": "00005de917d80000000000000048",
    "Code": "FRA",
    "Name": "France",
    "Airports": [
        "ORY"
    ],
    "IndepYear": 843,
    "geography": {
        "Region": "Western Europe",
        "Continent": "Europe",
        "SurfaceArea": 551500
    },
    "government": {
        "HeadOfState": "Jacques Chirac",
        "GovernmentForm": "Republic"
    },
    "demographics": {
        "Population": 59225700,
        "LifeExpectancy": 78.80000305175781
    }
}

要在数组中的不同位置插入元素,请使用arrayInsert()方法指定要插入的索引路径表达式。在这种情况下,索引为 0,即数组中的第一个元素。

mysql-js> db.countryinfo.modify("Name = 'France'").arrayInsert("$.Airports[0]", "CDG")

要从数组中删除元素,必须向arrayDelete()方法传递要删除的元素的索引。

mysql-js> db.countryinfo.modify("Name = 'France'").arrayDelete("$.Airports[1]")
相关信息
  • MySQL 参考手册提供了帮助您搜索和修改 JSON 值的说明。

  • 查看 CollectionModifyFunction 以获取完整的语法定义。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-documents-remove.html

22.3.3.5 删除文档

您可以使用remove()方法从模式中的集合中删除一些或所有文档。X DevAPI 提供了与remove()方法一起使用的其他方法,用于过滤和排序要删除的文档。

使用条件删除文档

以下示例向remove()方法传递了搜索条件。匹配条件的所有文档都将从countryinfo集合中删除。在此示例中,有一个文档符合条件。

mysql-js> db.countryinfo.remove("Code = 'SEA'")
删除第一个文档

要删除countryinfo集合中的第一个文档,请使用值为 1 的limit()方法。

mysql-js> db.countryinfo.remove("true").limit(1)
删除订单中的最后一个文档

以下示例按国家名称删除了countryinfo集合中的最后一个文档。

mysql-js> db.countryinfo.remove("true").sort(["Name desc"]).limit(1)
删除集合中的所有文档

您可以删除集合中的所有文档。要这样做,请使用remove("true")方法,而不指定搜索条件。

注意

在删除文档时,请谨慎操作,不指定搜索条件会删除集合中的所有文档。

或者,使用db.drop_collection('countryinfo')操作来删除countryinfo集合。

相关信息
  • 请参阅 CollectionRemoveFunction 以获取完整的语法定义。

  • 请参阅第 22.3.2 节,“下载和导入 world_x 数据库”以获取重新创建world_x模式的说明。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-indexes-create.html

22.3.3.6 创建和删除索引

索引用于快速查找具有特定字段值的文档。没有索引,MySQL 必须从第一个文档开始,然后读取整个集合以查找相关字段。集合越大,成本越高。如果集合很大且对特定字段的查询很常见,则考虑在文档内的特定字段上创建索引。

例如,以下查询在 Population 字段上使用索引性能更好:

mysql-js> db.countryinfo.find("demographics.Population < 100")
...[*output removed*]
8 documents in set (0.00 sec)

createIndex()方法创建一个可以用 JSON 文档定义的索引,该文档指定要使用的字段。本节是索引的高级概述。有关更多信息,请参见索引集合。

添加非唯一索引

要创建非唯一索引,请将索引名称和索引信息传递给createIndex()方法。禁止重复索引名称。

以下示例指定了一个名为popul的索引,针对demographics对象中的Population字段定义,索引为Integer数值。最后一个参数指示字段是否应该需要NOT NULL约束。如果值为false,则字段可以包含NULL值。索引信息是一个包含一个或多个字段详细信息的 JSON 文档。每个字段定义必须包括字段的完整文档路径,并指定字段的类型。

mysql-js> db.countryinfo.createIndex("popul", {fields:
[{field: '$.demographics.Population', type: 'INTEGER'}]})

在这里,索引是使用整数数值创建的。还有其他选项可用,包括用于 GeoJSON 数据的选项。您还可以指定索引类型,这里省略了,因为默认类型“index”是适当的。

添加唯一索引

要创建唯一索引,请将索引名称、索引定义和索引类型“unique”传递给createIndex()方法。此示例显示了在国家名称("Name")上创建的唯一索引,这是countryinfo集合中另一个常见字段进行索引。在索引字段描述中,"TEXT(40)"表示要索引的字符数,"required": True指定字段必须存在于文档中。

mysql-js> db.countryinfo.createIndex("name",
{"fields": [{"field": "$.Name", "type": "TEXT(40)", "required": true}], "unique": true})
删除索引

要删除索引,请将要删除的索引名称传递给dropIndex()方法。例如,您可以按如下方式删除“popul”索引:

mysql-js> db.countryinfo.dropIndex("popul")
相关信息
  • 有关更多信息,请参见索引集合。

  • 有关定义索引的 JSON 文档的更多信息,请参见定义索引。

  • 有关完整语法定义,请参见集合索引管理函数。

22.3.4 关系表

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-relational-tables.html

22.3.4.1 向表中插入记录

22.3.4.2 选择表

22.3.4.3 更新表

22.3.4.4 删除表

您还可以使用 X DevAPI 来处理关系表。在 MySQL 中,每个关系表都与特定的存储引擎相关联。本节中的示例使用 world_x 模式中的 InnoDB 表。

确认模式

要显示分配给 db 全局变量的模式,请发出 db

mysql-js> db
<Schema:world_x>

如果返回值不是Schema:world_x,则将db变量设置如下:

mysql-js> \use world_x
Schema `world_x` accessible through db.

显示所有表

要显示 world_x 模式中的所有关系表,请在 db 对象上使用 getTables() 方法。

mysql-js> db.getTables()
{
    "city": <Table:city>,
    "country": <Table:country>,
    "countrylanguage": <Table:countrylanguage>
}

基本表操作

按表范围的基本操作包括:

操作形式 描述
db.*name*.insert() insert() 方法向指定表中插入一个或多个记录。
db.*name*.select() select() 方法返回指定表中的一些或所有记录。
db.*name*.update() update() 方法更新指定表中的记录。
db.*name*.delete() delete() 方法从指定表中删除一个或多个记录。

相关信息

  • 有关处理关系表的更多信息,请参阅 处理关系表。

  • CRUD EBNF 定义 提供了操作的完整列表。

  • 请参阅 第 22.3.2 节“下载并导入 world_x 数据库” 以获取设置 world_x 模式示例的说明。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-table-insert.html

22.3.4.1 插入记录到表中

你可以使用insert()方法与values()方法将记录插入到现有的关系表中。insert()方法接受单个列或表中的所有列。使用一个或多个values()方法指定要插入的值。

插入完整记录

要插入完整记录,将表中的所有列传递给insert()方法。然后对values()方法传递表中每列的一个值。例如,要向world_x模式中的 city 表添加新记录,请插入以下记录并按两次Enter

mysql-js> db.city.insert("ID", "Name", "CountryCode", "District", "Info").values(
None, "Olympia", "USA", "Washington", '{"Population": 5000}')

city 表有五列:ID、Name、CountryCode、District 和 Info。每个值必须与它所代表的列的数据类型匹配。

插入部分记录

以下示例将值插入到 city 表的 ID、Name 和 CountryCode 列中。

mysql-js> db.city.insert("ID", "Name", "CountryCode").values(
None, "Little Falls", "USA").values(None, "Happy Valley", "USA")

当你使用insert()方法指定列时,值的数量必须与列的数量相匹配。在前面的示例中,你必须提供三个值以匹配指定的三列。

相关信息
  • 查看 TableInsertFunction 以获取完整的语法定义。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-table-select.html

22.3.4.2 选择表

您可以使用select()方法从数据库中的表中查询并返回记录。X DevAPI 提供了额外的方法与select()方法一起使用,以过滤和排序返回的记录。

MySQL 提供以下运算符来指定搜索条件:OR||)、AND&&)、XORISNOTBETWEENINLIKE!=<>>>=<<=&|<<>>+-*/~%

选择所有记录

要发出返回现有表中所有记录的查询,请使用不指定搜索条件的select()方法。以下示例从world_x数据库中的 city 表中选择所有记录。

注意

限制在交互式语句中使用空的select()方法。始终在应用程序代码中使用显式列名选择。

mysql-js> db.city.select()
+------+------------+-------------+------------+-------------------------+
| ID   | Name       | CountryCode | District   | Info                    |
+------+------------+-------------+------------+-------------------------+
|    1 | Kabul      | AFG         | Kabol      |{"Population": 1780000}  |
|    2 | Qandahar   | AFG         | Qandahar   |{"Population": 237500}   |
|    3 | Herat      | AFG         | Herat      |{"Population": 186800}   |
...    ...          ...           ...          ...
| 4079 | Rafah      | PSE         | Rafah      |{"Population": 92020}    |
+------+------- ----+-------------+------------+-------------------------+
4082 rows in set (0.01 sec)

空集(没有匹配记录)返回以下信息:

Empty set (0.00 sec)

过滤搜索

要发出返回一组表列的查询,请使用select()方法并在方括号之间指定要返回的列。此查询返回 city 表中的 Name 和 CountryCode 列。

mysql-js> db.city.select(["Name", "CountryCode"])
+-------------------+-------------+
| Name              | CountryCode |
+-------------------+-------------+
| Kabul             | AFG         |
| Qandahar          | AFG         |
| Herat             | AFG         |
| Mazar-e-Sharif    | AFG         |
| Amsterdam         | NLD         |
...                 ...
| Rafah             | PSE         |
| Olympia           | USA         |
| Little Falls      | USA         |
| Happy Valley      | USA         |
+-------------------+-------------+
4082 rows in set (0.00 sec)

要发出返回符合特定搜索条件的行的查询,请使用where()方法包含这些条件。例如,以下示例返回以字母 Z 开头的城市的名称和国家代码。

mysql-js> db.city.select(["Name", "CountryCode"]).where("Name like 'Z%'")
+-------------------+-------------+
| Name              | CountryCode |
+-------------------+-------------+
| Zaanstad          | NLD         |
| Zoetermeer        | NLD         |
| Zwolle            | NLD         |
| Zenica            | BIH         |
| Zagazig           | EGY         |
| Zaragoza          | ESP         |
| Zamboanga         | PHL         |
| Zahedan           | IRN         |
| Zanjan            | IRN         |
| Zabol             | IRN         |
| Zama              | JPN         |
| Zhezqazghan       | KAZ         |
| Zhengzhou         | CHN         |
...                 ...
| Zeleznogorsk      | RUS         |
+-------------------+-------------+
59 rows in set (0.00 sec)

您可以使用bind()方法将值与搜索条件分开。例如,不要使用"Name = 'Z%' "作为条件,而是用以字母开头的名称后跟冒号的命名占位符替换。然后在bind()方法中包含占位符和值,如下所示:

mysql-js> db.city.select(["Name", "CountryCode"]).
              where("Name like :name").bind("name", "Z%")

提示

在程序内,绑定使您能够在表达式中指定占位符,在执行之前用值填充,并且可以从适当的自动转义中受益。

始终使用绑定来清理输入。避免使用字符串连接在查询中引入值,这可能会产生无效输入,并且在某些情况下可能会导致安全问题。

项目结果

要使用AND运算符发出查询,请在where()方法中的搜索条件之间添加该运算符。

mysql-js> db.city.select(["Name", "CountryCode"]).where(
"Name like 'Z%' and CountryCode = 'CHN'")
+----------------+-------------+
| Name           | CountryCode |
+----------------+-------------+
| Zhengzhou      | CHN         |
| Zibo           | CHN         |
| Zhangjiakou    | CHN         |
| Zhuzhou        | CHN         |
| Zhangjiang     | CHN         |
| Zigong         | CHN         |
| Zaozhuang      | CHN         |
...              ...
| Zhangjiagang   | CHN         |
+----------------+-------------+
22 rows in set (0.01 sec)

要指定多个条件运算符,可以将搜索条件括在括号中以更改运算符优先级。以下示例演示了ANDOR运算符的放置位置。

mysql-js> db.city.select(["Name", "CountryCode"]).
where("Name like 'Z%' and (CountryCode = 'CHN' or CountryCode = 'RUS')")
+-------------------+-------------+
| Name              | CountryCode |
+-------------------+-------------+
| Zhengzhou         | CHN         |
| Zibo              | CHN         |
| Zhangjiakou       | CHN         |
| Zhuzhou           | CHN         |
...                 ...
| Zeleznogorsk      | RUS         |
+-------------------+-------------+
29 rows in set (0.01 sec)
限制、排序和偏移结果

您可以应用limit()orderBy()offSet()方法来管理select()方法返回的记录数量和顺序。

要指定结果集中包含的记录数,请将limit()方法附加到select()方法并指定一个值。例如,以下查询返回国家表中的前五条记录。

mysql-js> db.country.select(["Code", "Name"]).limit(5)
+------+-------------+
| Code | Name        |
+------+-------------+
| ABW  | Aruba       |
| AFG  | Afghanistan |
| AGO  | Angola      |
| AIA  | Anguilla    |
| ALB  | Albania     |
+------+-------------+
5 rows in set (0.00 sec)

要为结果指定顺序,请将orderBy()方法附加到select()方法。将一个或多个要排序的列的列表传递给orderBy()方法,并根据需要选择降序(desc)或升序(asc)属性。升序是默认的排序类型。

例如,以下查询按照 Name 列对所有记录进行排序,然后以降序方式返回前三条记录。

mysql-js> db.country.select(["Code", "Name"]).orderBy(["Name desc"]).limit(3)
+------+------------+
| Code | Name       |
+------+------------+
| ZWE  | Zimbabwe   |
| ZMB  | Zambia     |
| YUG  | Yugoslavia |
+------+------------+
3 rows in set (0.00 sec)

默认情况下,limit()方法从表中的第一条记录开始。您可以使用offset()方法来更改起始记录。例如,要忽略第一条记录并返回符合条件的接下来三条记录,请将值 1 传递给offset()方法。

mysql-js> db.country.select(["Code", "Name"]).orderBy(["Name desc"]).limit(3).offset(1)
+------+------------+
| Code | Name       |
+------+------------+
| ZMB  | Zambia     |
| YUG  | Yugoslavia |
| YEM  | Yemen      |
+------+------------+
3 rows in set (0.00 sec)
相关信息
  • MySQL 参考手册提供了有关函数和运算符的详细文档。

  • 查看 TableSelectFunction 以获取完整的语法定义。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-table-update.html

22.3.4.3 更新表

你可以使用update()方法来修改表中的一个或多个记录。update()方法通过过滤查询来仅包括需要更新的记录,然后对这些记录应用你指定的操作。

要在城市表中替换城市名称,将新的城市名称传递给set()方法。然后,将要定位和替换的城市名称传递给where()方法。以下示例将城市 Peking 替换为 Beijing。

mysql-js> db.city.update().set("Name", "Beijing").where("Name = 'Peking'")

使用select()方法来验证更改。

mysql-js> db.city.select(["ID", "Name", "CountryCode", "District", "Info"]).where("Name = 'Beijing'")
+------+-----------+-------------+----------+-----------------------------+
| ID   | Name      | CountryCode | District | Info                        |
+------+-----------+-------------+----------+-----------------------------+
| 1891 | Beijing   | CHN         | Peking   | {"Population": 7472000}     |
+------+-----------+-------------+----------+-----------------------------+
1 row in set (0.00 sec)
相关信息
  • 查看 TableUpdateFunction 获取完整的语法定义。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-table-delete.html

22.3.4.4 删除表

您可以使用 delete() 方法从数据库中的表中删除一些或所有记录。X DevAPI 提供了额外的方法与 delete() 方法一起使用,以过滤和排序要删除的记录。

使用条件删除记录

以下示例向 delete() 方法传递搜索条件。与条件匹配的所有记录都将从 city 表中删除。在此示例中,有一条记录符合条件。

mysql-js> db.city.delete().where("Name = 'Olympia'")
删除第一条记录

要删除 city 表中的第一条记录,请使用值为 1 的 limit() 方法。

mysql-js> db.city.delete().limit(1)
删除表中的所有记录

您可以删除表中的所有记录。要这样做,请使用不指定搜索条件的 delete() 方法。

注意

在不指定搜索条件的情况下删除记录时要小心;这样做会删除表中的所有记录。

删除表

dropCollection() 方法也可用于 MySQL Shell 中从数据库中删除关系表。例如,要从 world_x 数据库中删除 citytest 表,执行以下命令:

mysql-js> session.dropCollection("world_x", "citytest")
相关信息
  • 参见 TableDeleteFunction 以获取完整的语法定义。

  • 参见 第 22.3.2 节,“下载和导入 world_x 数据库”,了解重新创建 world_x 数据库的说明。

22.3.5 表中的文档

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-documents-in-tables.html

在 MySQL 中,表可以包含传统的关系数据、JSON 值或两者兼有。您可以通过将文档存储在具有本机JSON数据类型的列中,将传统数据与 JSON 文档结合起来。

本节示例使用world_x模式中的 city 表。

city 表描述

city 表有五列(或字段)。

+---------------+------------+-------+-------+---------+------------------+
| Field         | Type       | Null  | Key   | Default | Extra            |
+---------------+------------+-------+-------+---------+------------------+
| ID            | int(11)    | NO    | PRI   | null    | auto_increment   |
| Name          | char(35)   | NO    |       |         |                  |
| CountryCode   | char(3)    | NO    |       |         |                  |
| District      | char(20)   | NO    |       |         |                  |
| Info          | json       | YES   |       | null    |                  |
+---------------+------------+-------+-------+---------+------------------+

插入一条记录

要将文档插入到表的列中,请按正确顺序向values()方法传递一个格式良好的 JSON 文档。在下面的示例中,一个文档作为最终值传递到 Info 列中以进行插入。

mysql-js> db.city.insert().values(
None, "San Francisco", "USA", "California", '{"Population":830000}')

选择一条记录

您可以发出带有评估表达式中文档值的搜索条件的查询。

mysql-js> db.city.select(["ID", "Name", "CountryCode", "District", "Info"]).where(
"CountryCode = :country and Info->'$.Population' > 1000000").bind(
'country', 'USA')
+------+----------------+-------------+----------------+-----------------------------+
| ID   | Name           | CountryCode | District       | Info                        |
+------+----------------+-------------+----------------+-----------------------------+
| 3793 | New York       | USA         | New York       | {"Population": 8008278}     |
| 3794 | Los Angeles    | USA         | California     | {"Population": 3694820}     |
| 3795 | Chicago        | USA         | Illinois       | {"Population": 2896016}     |
| 3796 | Houston        | USA         | Texas          | {"Population": 1953631}     |
| 3797 | Philadelphia   | USA         | Pennsylvania   | {"Population": 1517550}     |
| 3798 | Phoenix        | USA         | Arizona        | {"Population": 1321045}     |
| 3799 | San Diego      | USA         | California     | {"Population": 1223400}     |
| 3800 | Dallas         | USA         | Texas          | {"Population": 1188580}     |
| 3801 | San Antonio    | USA         | Texas          | {"Population": 1144646}     |
+------+----------------+-------------+----------------+-----------------------------+
9 rows in set (0.01 sec)

相关信息

  • 有关更多信息,请参阅与关系表和文档一起工作。

  • 有关数据类型的详细描述,请参阅第 13.5 节,“JSON 数据类型”。

22.4 Python 快速入门指南:MySQL Shell 用于文档存储

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python.html

22.4.1 MySQL Shell

22.4.2 下载和导入 world_x 数据库

22.4.3 文档和集合

22.4.4 关系表

22.4.5 表中的文档

本快速入门指南提供了使用 MySQL Shell 与文档存储应用程序进行交互原型设计的说明。该指南包括以下主题:

  • MySQL 功能、MySQL Shell 和 world_x 示例模式的简介。

  • 管理集合和文档的操作。

  • 管理关系表的操作。

  • 适用于表中文档的操作。

要按照这个快速入门指南,您需要安装了 X 插件的 MySQL 服务器,默认情况下在 8.0 版本中,以及用作客户端的 MySQL Shell。MySQL Shell 包括 X DevAPI,它在 JavaScript 和 Python 中都有实现,使您能够使用 X 协议连接到 MySQL 服务器实例,并将服务器用作文档存储。

相关信息

  • MySQL Shell 8.0 提供了有关 MySQL Shell 的更深入信息。

  • 有关本快速入门指南中使用的工具的更多信息,请参阅安装 MySQL Shell 和第 22.5 节,“X 插件”。

  • 有关 MySQL Shell 支持的语言的更多信息,请参阅支持的语言。

  • X DevAPI 用户指南提供了更多使用 X DevAPI 开发使用 MySQL 作为文档存储的应用程序的示例。

  • 还提供了一个 JavaScript 快速入门指南。

22.4.1 MySQL Shell

译文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-shell.html

本快速入门指南假定您对 MySQL Shell 有一定的熟悉度。以下部分是一个高级概述,请参阅 MySQL Shell 文档以获取更多信息。MySQL Shell 是到 MySQL 服务器的统一脚本接口。它支持 JavaScript 和 Python 脚本。JavaScript 是默认处理模式。

启动 MySQL Shell

安装并启动 MySQL 服务器后,将 MySQL Shell 连接到服务器实例。您需要知道要连接的 MySQL 服务器实例的地址。为了能够将实例用作文档存储,服务器实例必须安装 X 插件,并且您应该使用 X 协议连接到服务器。例如,要连接到默认 X 协议端口 33060 上的实例 ds1.example.com,请使用网络字符串 *user*@ds1.example.com:33060

提示

如果您使用经典的 MySQL 协议连接到实例,例如使用默认的port 3306 而不是mysqlx_port,则无法使用本教程中显示的文档存储功能。例如,db全局对象未填充。要使用文档存储,始终使用 X 协议连接。

如果 MySQL Shell 尚未运行,请打开终端窗口并输入:

mysqlsh *user*@ds1.example.com:33060/world_x

或者,如果 MySQL Shell 已经在运行,请使用\connect命令:

\connect *user*@ds1.example.com:33060/world_x

您需要指定要连接到的 MySQL 服务器实例的地址。例如,在上一个示例中:

  • user代表您的 MySQL 帐户的用户名。

  • ds1.example.com是运行 MySQL 的服务器实例的主机名。请将其替换为您正在使用作为文档存储的 MySQL 服务器实例的主机名。

  • 本会话的默认模式为world_x。有关设置world_x模式的说明,请参见第 22.4.2 节,“下载和导入 world_x 数据库”。

有关更多信息,请参见第 6.2.5 节,“使用类似 URI 字符串或键值对连接到服务器”。

当 MySQL Shell 打开时,mysql-js>提示表示此会话的活动语言为 JavaScript。要将 MySQL Shell 切换到 Python 模式,请使用\py命令。

mysql-js> \py
Switching to Python mode...
mysql-py>

MySQL Shell 支持输入行编辑如下:

  • 左箭头右箭头键在当前输入行内水平移动。

  • 上箭头下箭头键在先前输入的行集中上下移动。

  • Backspace删除光标前的字符,并输入新字符以在光标位置输入它们。

  • Enter将当前输入行发送到服务器。

获取 MySQL Shell 帮助

在命令解释器提示符处键入mysqlsh --help以获取命令行选项列表。

mysqlsh --help

在 MySQL Shell 提示符处键入\help以获取可用命令及其描述的列表。

mysql-py> \help

在命令后键入\help,可获取有关单个 MySQL Shell 命令的详细帮助。例如,要查看\connect命令的帮助,请执行以下操作:

mysql-py> \help \connect

退出 MySQL Shell

要退出 MySQL Shell,请执行以下命令:

mysql-py> \quit

相关信息

  • 查看交互式代码执行以了解 MySQL Shell 中交互式代码执行的工作原理。

  • 查看使用 MySQL Shell 入门以了解会话和连接选项。

22.4.2 下载并导入 world_x 数据库

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-download.html

作为快速入门指南的一部分,提供了一个示例模式,称为world_x模式。许多示例演示了使用此模式的文档存储功能。启动您的 MySQL 服务器以加载world_x模式,然后按照以下步骤操作:

  1. 下载world_x-db.zip

  2. 将安装归档文件提取到临时位置,如/tmp/。解压缩归档文件会生成一个名为world_x.sql的单个文件。

  3. world_x.sql文件导入到您的服务器。您可以选择:

    • 在 SQL 模式下启动 MySQL Shell,并通过以下方式导入文件:

      mysqlsh -u root --sql --file /tmp/world_x-db/world_x.sql
      Enter password: ****
      
    • 在运行时将 MySQL Shell 设置为 SQL 模式,并通过以下方式源化模式文件:

      \sql
      Switching to SQL mode... Commands end with ;
      \source /tmp/world_x-db/world_x.sql
      

    /tmp/替换为您系统上world_x.sql文件的路径。如果提示,请输入密码。只要账户有权限创建新模式,非 root 账户也可以使用。

world_x 模式

world_x示例模式包含以下 JSON 集合和关系表:

  • 集合

    • countryinfo:世界各国的信息。
    • country:世界各国的最少信息。

    • city:这些国家中一些城市的信息。

    • countrylanguage:每个国家使用的语言。

相关信息

  • MySQL Shell 会话解释了会话类型。

22.4.3 文档和集合

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-documents-collections.html

22.4.3.1 创建、列出和删除集合

22.4.3.2 使用集合

22.4.3.3 查找文档

22.4.3.4 修改文档

22.4.3.5 删除文档

22.4.3.6 创建和删除索引

当您将 MySQL 用作文档存储时,集合是您可以创建、列出和删除的模式内的容器。集合包含您可以添加、查找、更新和删除的 JSON 文档。

本节示例使用world_x模式中的countryinfo集合。有关设置world_x模式的说明,请参见第 22.4.2 节,“下载和导入 world_x 数据库”。

文档

在 MySQL 中,文档被表示为 JSON 对象。在内部,它们以一种高效的二进制格式存储,可以实现快速查找和更新。

  • Python 的简单文档格式:

    {"field1": "value", "field2" : 10, "field 3": null}
    
    

一组文档由一组由逗号分隔并包含在[]字符中的文档组成。

  • Python 的简单文档数组:

    [{"Name": "Aruba", "Code:": "ABW"}, {"Name": "Angola", "Code:": "AGO"}]
    
    

MySQL 支持 JSON 文档中以下 Python 值类型:

  • 数字(整数和浮点数)

  • 字符串

  • 布尔值(False 和 True)

  • 更多 JSON 值的数组

  • 更多 JSON 值的嵌套(或嵌入)对象

集合

集合是共享目的并可能共享一个或多个索引的文档的容器。每个集合都有一个唯一的名称,并存在于单个模式中。

术语模式等同于数据库,意味着一组数据库对象,而不是用于强制数据结构和约束的关系模式。模式不会对集合中的文档强制一致性。

在这个快速入门指南中:

  • 基本对象包括:

    对象形式 描述
    db db 是分配给当前活动模式的全局变量。当您想对模式运行操作时,例如检索集合,您可以使用db变量可用的方法。
    db.get_collections() db.get_collections() 返回模式中集合的列表。使用列表获取对集合对象的引用,对其进行迭代等。
  • 由集合范围内的基本操作包括:

    操作形式 描述
    db.*name*.add() add() 方法将一个或多个文档插入到指定集合中。
    db.*name*.find() find() 方法返回指定集合中的一些或所有文档。
    db.*name*.modify() modify() 方法更新指定集合中的文档。
    db.*name*.remove() remove() 方法从指定集合中删除一个或多个文档。

相关信息

  • 查看操作集合以获取一般概述。

  • CRUD EBNF 定义 提供了操作的完整列表。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-collections-operations.html

22.4.3.1 创建、列出和删除集合

在 MySQL Shell 中,您可以创建新集合,在模式中获取现有集合的列表,并从模式中删除现有集合。集合名称区分大小写,每个集合名称必须是唯一的。

确认模式

要显示分配给模式变量的值,请执行:

mysql-py> db

如果模式值不是Schema:world_x,则通过执行以下命令设置db变量:

mysql-py> \use world_x
创建一个集合

要在现有模式中创建新集合,请使用db对象的createCollection()方法。以下示例在world_x模式中创建一个名为flags的集合。

mysql-py> db.create_collection("flags")

该方法返回一个集合对象。

<Collection:flags>
列出集合

要显示world_x模式中的所有集合,请使用db对象的get_collections()方法。当前连接到的服务器返回的集合将显示在括号之间。

mysql-py> db.get_collections()
[
    <Collection:countryinfo>,
    <Collection:flags>
]
删除一个集合

要从模式中删除现有集合,请使用db对象的drop_collection()方法。例如,要从当前模式中删除flags集合,请执行:

mysql-py> db.drop_collection("flags")

drop_collection()方法也可用于在 MySQL Shell 中从模式中删除关系表。

相关信息
  • 查看集合对象以获取更多示例。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-documents-add.html

22.4.3.2 处理集合

要处理模式中的集合,请使用db全局对象访问当前模式。在此示例中,我们使用之前导入的world_x模式和countryinfo集合。因此,您发出的操作的格式是db.*collection_name*.operation,其中collection_name是执行操作的集合的名称。在以下示例中,操作是针对countryinfo集合执行的。

添加文档

使用add()方法将一个文档或文档列表插入到现有集合中。将以下文档插入到countryinfo集合中。由于这是多行内容,请按两次Enter键以插入文档。

mysql-py> db.countryinfo.add(
 {
    "GNP": .6,
    "IndepYear": 1967,
    "Name": "Sealand",
    "Code:": "SEA",
    "demographics": {
        "LifeExpectancy": 79,
        "Population": 27
    },
    "geography": {
        "Continent": "Europe",
        "Region": "British Islands",
        "SurfaceArea": 193
    },
    "government": {
        "GovernmentForm": "Monarchy",
        "HeadOfState": "Michael Bates"
    }
  }
)

该方法返回操作的状态。您可以通过搜索文档来验证操作。例如:

mysql-py> db.countryinfo.find("Name = 'Sealand'")
{
    "GNP": 0.6,
    "_id": "00005e2ff4af00000000000000f4",
    "Name": "Sealand",
    "Code:": "SEA",
    "IndepYear": 1967,
    "geography": {
        "Region": "British Islands",
        "Continent": "Europe",
        "SurfaceArea": 193
    },
    "government": {
        "HeadOfState": "Michael Bates",
        "GovernmentForm": "Monarchy"
    },
    "demographics": {
        "Population": 27,
        "LifeExpectancy": 79
    }
}

请注意,除了在添加文档时指定的字段之外,还有一个字段,即_id。每个文档都需要一个名为_id的标识符字段。_id字段的值在同一集合中的所有文档中必须是唯一的。在 MySQL 8.0.11 及更高版本中,文档 ID 是由服务器生成的,而不是客户端,因此 MySQL Shell 不会自动设置_id值。如果文档不包含_id字段,MySQL 8.0.11 或更高版本的服务器会设置_id值。在较早的 8.0 版本或 5.7 版本的 MySQL 服务器中,在这种情况下不会设置_id值,因此您必须明确指定。如果不指定,MySQL Shell 将返回错误 5115 文档缺少必需字段。更多信息请参见理解文档 ID。

相关信息
  • 请查看 CollectionAddFunction 以获取完整的语法定义。

  • 请查看理解文档 ID。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-documents-find.html

22.4.3.3 查找文档

您可以使用find()方法查询并返回模式中集合中的文档。MySQL Shell 提供额外的方法与find()方法一起使用,以过滤和排序返回的文档。

MySQL 提供以下运算符来指定搜索条件:OR||),AND&&),XORISNOTBETWEENINLIKE!=<>>>=<<=&|<<>>+-*/~%

查找集合中的所有文档

要返回集合中的所有文档,请使用未指定搜索条件的find()方法。例如,以下操作返回countryinfo集合中的所有文档。

mysql-py> db.countryinfo.find()
[
     {
          "GNP": 828,
          "Code:": "ABW",
          "Name": "Aruba",
          "IndepYear": null,
          "geography": {
              "Continent": "North America",
              "Region": "Caribbean",
              "SurfaceArea": 193
          },
          "government": {
              "GovernmentForm": "Nonmetropolitan Territory of The Netherlands",
              "HeadOfState": "Beatrix"
          }
          "demographics": {
              "LifeExpectancy": 78.4000015258789,
              "Population": 103000
          },
          ...
      }
 ]
240 documents in set (0.00 sec)

该方法生成包含操作信息以及集合中所有文档的结果。

空集(没有匹配的文档)返回以下信息:

Empty set (0.00 sec)

过滤搜索

您可以在find()方法中包含搜索条件。形成搜索条件的表达式语法与传统 MySQL 第十四章,函数和运算符相同。您必须将所有表达式括在引号中。为简洁起见,一些示例未显示输出。

一个简单的搜索条件可能包括Name字段和我们知道在文档中的值。以下示例返回一个文档:

mysql-py> db.countryinfo.find("Name = 'Australia'")
[
    {
        "GNP": 351182,
        "Code:": "AUS",
        "Name": "Australia",
        "IndepYear": 1901,
        "geography": {
            "Continent": "Oceania",
            "Region": "Australia and New Zealand",
            "SurfaceArea": 7741220
        },
        "government": {
            "GovernmentForm": "Constitutional Monarchy, Federation",
            "HeadOfState": "Elisabeth II"
        }
        "demographics": {
            "LifeExpectancy": 79.80000305175781,
            "Population": 18886000
        },
    }
]

以下示例搜索所有 GNP 高于 5000 亿美元的国家。countryinfo集合以百万为单位衡量 GNP。

mysql-py> db.countryinfo.find("GNP > 500000")
...[*output removed*]
10 documents in set (0.00 sec)

以下查询中的人口字段嵌入在人口统计对象中。要访问嵌入字段,请在人口统计和人口之间使用句点以确定关系。文档和字段名称区分大小写。

mysql-py> db.countryinfo.find("GNP > 500000 and demographics.Population < 100000000")
...[*output removed*]
6 documents in set (0.00 sec)

以下表达式中的算术运算符用于查询 GNP 人均超过 30000 美元的国家。搜索条件可以包括算术运算符和大多数 MySQL 函数。

注意

countryinfo集合中有七个人口值为零的文档。因此,在输出末尾会出现警告消息。

mysql-py> db.countryinfo.find("GNP*1000000/demographics.Population > 30000")
...[*output removed*]
9 documents in set, 7 warnings (0.00 sec)
Warning (Code 1365): Division by 0
Warning (Code 1365): Division by 0
Warning (Code 1365): Division by 0
Warning (Code 1365): Division by 0
Warning (Code 1365): Division by 0
Warning (Code 1365): Division by 0
Warning (Code 1365): Division by 0

您可以使用bind()方法将值与搜索条件分离。例如,不要将硬编码的国家名称作为条件,而是用由冒号和以字母开头的名称组成的命名占位符替换。然后使用bind(*占位符*, **)方法如下:

mysql-py> db.countryinfo.find("Name = :country").bind("country", "Italy")
{
    "GNP": 1161755,
    "_id": "00005de917d8000000000000006a",
    "Code": "ITA",
    "Name": "Italy",
    "Airports": [],
    "IndepYear": 1861,
    "geography": {
        "Region": "Southern Europe",
        "Continent": "Europe",
        "SurfaceArea": 301316
    },
    "government": {
        "HeadOfState": "Carlo Azeglio Ciampi",
        "GovernmentForm": "Republic"
    },
    "demographics": {
        "Population": 57680000,
        "LifeExpectancy": 79
    }
}
1 document in set (0.01 sec)

提示

在程序中,绑定使您能够在表达式中指定占位符,在执行之前用值填充,并且可以从适当的自动转义中受益。

始终使用绑定来清理输入。避免使用字符串连接在查询中引入值,这可能会产生无效输入,并且在某些情况下可能会导致安全问题。

您可以使用占位符和bind()方法创建保存的搜索,然后可以使用不同的值调用它们。例如,为一个国家创建一个保存的搜索:

mysql-py> myFind = db.countryinfo.find("Name = :country")
mysql-py> myFind.bind('country', 'France')
{
    "GNP": 1424285,
    "_id": "00005de917d80000000000000048",
    "Code": "FRA",
    "Name": "France",
    "IndepYear": 843,
    "geography": {
        "Region": "Western Europe",
        "Continent": "Europe",
        "SurfaceArea": 551500
    },
    "government": {
        "HeadOfState": "Jacques Chirac",
        "GovernmentForm": "Republic"
    },
    "demographics": {
        "Population": 59225700,
        "LifeExpectancy": 78.80000305175781
    }
}
1 document in set (0.0028 sec)

mysql-py> myFind.bind('country', 'Germany')
{
    "GNP": 2133367,
    "_id": "00005de917d80000000000000038",
    "Code": "DEU",
    "Name": "Germany",
    "IndepYear": 1955,
    "geography": {
        "Region": "Western Europe",
        "Continent": "Europe",
        "SurfaceArea": 357022
    },
    "government": {
        "HeadOfState": "Johannes Rau",
        "GovernmentForm": "Federal Republic"
    },
    "demographics": {
        "Population": 82164700,
        "LifeExpectancy": 77.4000015258789
    }
}

1 document in set (0.0026 sec)
项目结果

您可以返回文档的特定字段,而不是返回所有字段。以下示例返回countryinfo集合中所有文档的 GNP 和 Name 字段,符合搜索条件。

使用fields()方法传递要返回的字段列表。

mysql-py> db.countryinfo.find("GNP > 5000000").fields(["GNP", "Name"])
[
    {
        "GNP": 8510700,
        "Name": "United States"
    }
]
1 document in set (0.00 sec)

此外,您可以修改返回的文档——添加、重命名、嵌套甚至计算新的字段值,使用描述要返回的文档的表达式。例如,使用以下表达式修改字段名称以仅返回两个文档。

mysql-py> db.countryinfo.find().fields(
mysqlx.expr('{"Name": upper(Name), "GNPPerCapita": GNP*1000000/demographics.Population}')).limit(2)
{
    "Name": "ARUBA",
    "GNPPerCapita": 8038.834951456311
}
{
    "Name": "AFGHANISTAN",
    "GNPPerCapita": 263.0281690140845
}
限制、排序和跳过结果

您可以应用limit()sort()skip()方法来管理find()方法返回的文档数量和顺序。

要指定结果集中包含的文档数量,请将limit()方法附加到find()方法的值。以下查询返回countryinfo集合中的前五个文档。

mysql-py> db.countryinfo.find().limit(5)
... [*output removed*]
5 documents in set (0.00 sec)

要为结果指定顺序,请将sort()方法附加到find()方法。将一个或多个要排序的字段列表传递给sort()方法,并根据需要选择降序(desc)或升序(asc)属性。升序是默认的排序类型。

例如,以下查询按照 IndepYear 字段对所有文档进行排序,然后以降序返回前八个文档。

mysql-py> db.countryinfo.find().sort(["IndepYear desc"]).limit(8)
... [*output removed*]
8 documents in set (0.00 sec)

默认情况下,limit()方法从集合中的第一个文档开始。您可以使用skip()方法来更改起始文档。例如,要忽略第一个文档并返回符合条件的接下来的八个文档,请将值 1 传递给skip()方法。

mysql-py> db.countryinfo.find().sort(["IndepYear desc"]).limit(8).skip(1)
... [*output removed*]
8 documents in set (0.00 sec)
相关信息
  • MySQL 参考手册提供了有关函数和运算符的详细文档。

  • 请查看 CollectionFindFunction 以获取完整的语法定义。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-documents-modify.html

22.4.3.4 修改文档

您可以使用modify()方法来更新集合中的一个或多个文档。X DevAPI 提供了与modify()方法一起使用的附加方法,以:

  • 设置和取消文档中的字段。

  • 追加、插入和删除数组

  • 绑定、限制和排序要修改的文档。

设置和取消文档字段

modify()方法通过过滤集合以仅包括要修改的文档,然后对这些文档应用您指定的操作来工作。

在以下示例中,modify()方法使用搜索条件标识要更改的文档,然后set()方法替换嵌套的 demographics 对象中的两个值。

mysql-py> db.countryinfo.modify("Code = 'SEA'").set(
"demographics", {"LifeExpectancy": 78, "Population": 28})

修改文档后,请使用find()方法验证更改。

要从文档中删除内容,请使用modify()unset()方法。例如,以下查询从符合搜索条件的文档中删除 GNP。

mysql-py> db.countryinfo.modify("Name = 'Sealand'").unset("GNP")

使用find()方法验证更改。

mysql-py> db.countryinfo.find("Name = 'Sealand'")
{
    "_id": "00005e2ff4af00000000000000f4",
    "Name": "Sealand",
    "Code:": "SEA",
    "IndepYear": 1967,
    "geography": {
        "Region": "British Islands",
        "Continent": "Europe",
        "SurfaceArea": 193
    },
    "government": {
        "HeadOfState": "Michael Bates",
        "GovernmentForm": "Monarchy"
    },
    "demographics": {
        "Population": 27,
        "LifeExpectancy": 79
    }
}
追加、插入和删除数组

要向数组字段追加元素,或者插入、删除数组中的元素,请使用array_append()array_insert()array_delete()方法。以下示例修改countryinfo集合以启用对国际机场的跟踪。

第一个示例使用modify()set()方法在所有文档中创建一个新的 Airports 字段。

注意

在修改文档时没有指定搜索条件时要小心;这样会修改集合中的所有文档。

mysql-py> db.countryinfo.modify("true").set("Airports", [])

添加了 Airports 字段后,下一个示例使用array_append()方法向其中一个文档添加一个新机场。在以下示例中,$.Airports代表当前文档的 Airports 字段。

mysql-py> db.countryinfo.modify("Name = 'France'").array_append("$.Airports", "ORY")

使用find()查看更改。

mysql-py> db.countryinfo.find("Name = 'France'")
{
    "GNP": 1424285,
    "_id": "00005de917d80000000000000048",
    "Code": "FRA",
    "Name": "France",
    "Airports": [
        "ORY"
    ],
    "IndepYear": 843,
    "geography": {
        "Region": "Western Europe",
        "Continent": "Europe",
        "SurfaceArea": 551500
    },
    "government": {
        "HeadOfState": "Jacques Chirac",
        "GovernmentForm": "Republic"
    },
    "demographics": {
        "Population": 59225700,
        "LifeExpectancy": 78.80000305175781
    }
}

要在数组中的不同位置插入元素,请使用array_insert()方法来指定要在路径表达式中插入的索引。在这种情况下,索引为 0,或者数组中的第一个元素。

mysql-py> db.countryinfo.modify("Name = 'France'").array_insert("$.Airports[0]", "CDG")

要从数组中删除元素,必须将要删除的元素的索引传递给array_delete()方法。

mysql-py> db.countryinfo.modify("Name = 'France'").array_delete("$.Airports[1]")
相关信息
  • MySQL 参考手册提供了帮助您搜索和修改 JSON 值的说明。

  • 请参阅 CollectionModifyFunction 获取完整的语法定义。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-documents-remove.html

22.4.3.5 删除文档

您可以使用remove()方法从模式中的集合中删除一些或所有文档。X DevAPI 提供了额外的方法与remove()方法一起使用,以过滤和排序要删除的文档。

使用条件删除文档

以下示例向remove()方法传递了搜索条件。与条件匹配的所有文档都将从countryinfo集合中删除。在此示例中,有一个文档符合条件。

mysql-py> db.countryinfo.remove("Code = 'SEA'")
删除第一个文档

要删除countryinfo集合中的第一个文档,请使用值为 1 的limit()方法。

mysql-py> db.countryinfo.remove("true").limit(1)
删除订单中的最后一个文档

以下示例通过国家名称删除countryinfo集合中的最后一个文档。

mysql-py> db.countryinfo.remove("true").sort(["Name desc"]).limit(1)
删除集合中的所有文档

您可以删除集合中的所有文档。要这样做,请使用不指定搜索条件的remove("true")方法。

注意

在不指定搜索条件的情况下删除文档时要小心。此操作会从集合中删除所有文档。

或者,使用db.drop_collection('countryinfo')操作删除countryinfo集合。

相关信息
  • 请参阅 CollectionRemoveFunction 获取完整的语法定义。

  • 请参阅 Section 22.4.2,“下载和导入 world_x 数据库”,了解重新创建world_x模式的说明。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-documents-index.html

22.4.3.6 创建和删除索引

索引用于快速查找具有特定字段值的文档。没有索引,MySQL 必须从第一个文档开始,然后逐个读取整个集合以查找相关字段。集合越大,成本就越高。如果集合很大且对特定字段的查询很常见,则考虑在文档内的特定字段上创建索引。

例如,以下查询在 Population 字段上使用索引性能更好:

mysql-py> db.countryinfo.find("demographics.Population < 100")
...[*output removed*]
8 documents in set (0.00 sec)

create_index()方法创建一个索引,您可以使用指定要使用的字段的 JSON 文档进行定义。本节是索引的高级概述。有关更多信息,请参阅索引集合。

添加一个非唯一索引

要创建非唯一索引,请将索引名称和索引信息传递给create_index()方法。禁止重复索引名称。

以下示例指定了一个名为popul的索引,针对demographics对象中的Population字段进行定义,作为Integer数值进行索引。最后一个参数指示字段是否应该需要NOT NULL约束。如果值为false,则该字段可以包含NULL值。索引信息是一个包含一个或多个字段详细信息的 JSON 文档,用于包含在索引中。每个字段定义必须包括字段的完整文档路径,并指定字段的类型。

mysql-py> db.countryinfo.createIndex("popul", {fields:
[{field: '$.demographics.Population', type: 'INTEGER'}]})

在这里,索引使用整数数值创建。还有其他选项可用,包括用于 GeoJSON 数据的选项。您还可以指定索引类型,这里省略了,因为默认类型“index”是合适的。

添加一个唯一索引

要创建唯一索引,请将索引名称、索引定义和索引类型“unique”传递给create_index()方法。此示例显示了在国家名称("Name")上创建的唯一索引,这是countryinfo集合中另一个常见字段进行索引。在索引字段描述中,"TEXT(40)"表示要索引的字符数,"required": True指定该字段必须存在于文档中。

mysql-py> db.countryinfo.create_index("name",
{"fields": [{"field": "$.Name", "type": "TEXT(40)", "required": True}], "unique": True})
删除索引

要删除索引,请将要删除的索引名称传递给drop_index()方法。例如,您可以按如下方式删除“popul”索引:

mysql-py> db.countryinfo.drop_index("popul")
相关信息
  • 有关更多信息,请参阅索引集合。

  • 有关定义索引的更多信息,请参阅定义索引中定义索引的 JSON 文档。

  • 请参阅集合索引管理函数以获取完整的语法定义。

22.4.4 关系表

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-relational-tables.html

22.4.4.1 向表中插入记录

22.4.4.2 选择表

22.4.4.3 更新表

22.4.4.4 删除表

您也可以使用 X DevAPI 来处理关系表。在 MySQL 中,每个关系表都与特定的存储引擎相关联。本节中的示例使用InnoDB表在world_x模式中。

确认模式

要显示分配给db全局变量的模式,请发出db

mysql-py> db
<Schema:world_x>

如果返回的值不是Schema:world_x,请将db变量设置如下:

mysql-py> \use world_x
Schema `world_x` accessible through db.

显示所有表

要显示world_x模式中的所有关系表,请在db对象上使用get_tables()方法。

mysql-py> db.get_tables()
[
    <Table:city>,
    <Table:country>,
    <Table:countrylanguage>
]

基本表操作

由表限定的基本操作包括:

操作形式 描述
db.*name*.insert() insert() 方法将一个或多个记录插入到指定的表中。
db.*name*.select() select() 方法返回指定表中的一些或所有记录。
db.*name*.update() update() 方法更新指定表中的记录。
db.*name*.delete() delete() 方法从指定的表中删除一个或多个记录。

相关信息

  • 有关更多信息,请参阅处理关系表。

  • CRUD EBNF 定义 提供了操作的完整列表。

  • 请参阅第 22.4.2 节,“下载和导入 world_x 数据库”,了解设置world_x模式示例的说明。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-table-insert.html

22.4.4.1 向表中插入记录

您可以使用insert()方法与values()方法将记录插入到现有的关系表中。insert()方法接受单个列或表中的所有列。使用一个或多个values()方法来指定要插入的值。

插入完整记录

要插入完整记录,将表中的所有列传递给insert()方法。然后,对于每个列,将一个值传递给values()方法。例如,要向world_x数据库中的 city 表添加新记录,请插入以下记录并按两次Enter

mysql-py> db.city.insert("ID", "Name", "CountryCode", "District", "Info").values(
None, "Olympia", "USA", "Washington", '{"Population": 5000}')

city 表有五列:ID、Name、CountryCode、District 和 Info。每个值必须与其代表的列的数据类型匹配。

插入部分记录

以下示例将值插入到 city 表的 ID、Name 和 CountryCode 列中。

mysql-py> db.city.insert("ID", "Name", "CountryCode").values(
None, "Little Falls", "USA").values(None, "Happy Valley", "USA")

当您使用insert()方法指定列时,值的数量必须与列的数量匹配。在前面的示例中,您必须提供三个值以匹配指定的三列。

相关信息
  • 请参阅 TableInsertFunction 以获取完整的语法定义。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-table-select.html

22.4.4.2 选择表

您可以使用select()方法从数据库中的表中查询并返回记录。X DevAPI 提供了与select()方法一起使用的附加方法,以过滤和排序返回的记录。

MySQL 提供以下运算符来指定搜索条件:OR||)、AND&&)、XORISNOTBETWEENINLIKE!=<>>>=<<=&|<<>>+-*/~%

选择所有记录

要发出返回现有表中的所有记录的查询,请使用未指定搜索条件的select()方法。以下示例从world_x数据库中的 city 表中选择所有记录。

注意

限制空的select()方法的使用仅限于交互式语句。始终在应用程序代码中使用显式列名选择。

mysql-py> db.city.select()
+------+------------+-------------+------------+-------------------------+
| ID   | Name       | CountryCode | District   | Info                    |
+------+------------+-------------+------------+-------------------------+
|    1 | Kabul      | AFG         | Kabol      |{"Population": 1780000}  |
|    2 | Qandahar   | AFG         | Qandahar   |{"Population": 237500}   |
|    3 | Herat      | AFG         | Herat      |{"Population": 186800}   |
...    ...          ...           ...          ...
| 4079 | Rafah      | PSE         | Rafah      |{"Population": 92020}    |
+------+------- ----+-------------+------------+-------------------------+
4082 rows in set (0.01 sec)

空集(没有匹配记录)返回以下信息:

Empty set (0.00 sec)

过滤搜索

要发出返回一组表列的查询,请使用select()方法,并在方括号之间指定要返回的列。此查询从 city 表返回 Name 和 CountryCode 列。

mysql-py> db.city.select(["Name", "CountryCode"])
+-------------------+-------------+
| Name              | CountryCode |
+-------------------+-------------+
| Kabul             | AFG         |
| Qandahar          | AFG         |
| Herat             | AFG         |
| Mazar-e-Sharif    | AFG         |
| Amsterdam         | NLD         |
...                 ...
| Rafah             | PSE         |
| Olympia           | USA         |
| Little Falls      | USA         |
| Happy Valley      | USA         |
+-------------------+-------------+
4082 rows in set (0.00 sec)

要发出返回符合特定搜索条件的行的查询,请使用where()方法包含这些条件。例如,以下示例返回以字母 Z 开头的城市的名称和国家代码。

mysql-py> db.city.select(["Name", "CountryCode"]).where("Name like 'Z%'")
+-------------------+-------------+
| Name              | CountryCode |
+-------------------+-------------+
| Zaanstad          | NLD         |
| Zoetermeer        | NLD         |
| Zwolle            | NLD         |
| Zenica            | BIH         |
| Zagazig           | EGY         |
| Zaragoza          | ESP         |
| Zamboanga         | PHL         |
| Zahedan           | IRN         |
| Zanjan            | IRN         |
| Zabol             | IRN         |
| Zama              | JPN         |
| Zhezqazghan       | KAZ         |
| Zhengzhou         | CHN         |
...                 ...
| Zeleznogorsk      | RUS         |
+-------------------+-------------+
59 rows in set (0.00 sec)

您可以使用bind()方法将值与搜索条件分开。例如,不要使用"Name = 'Z%' "作为条件,而是替换为以字母开头的名称为前缀的命名占位符,例如name。然后将占位符和值包含在bind()方法中,如下所示:

mysql-py> db.city.select(["Name", "CountryCode"]).where(
"Name like :name").bind("name", "Z%")

提示

在程序内部,绑定使您可以在表达式中指定占位符,在执行之前用值填充,并可以根据需要受益于自动转义。

始终使用绑定来清理输入。避免使用字符串连接引入查询中的值,这可能会产生无效输入,并且在某些情况下可能会导致安全问题。

项目结果

要使用AND运算符发出查询,请在where()方法中的搜索条件之间添加运算符。

mysql-py> db.city.select(["Name", "CountryCode"]).where(
"Name like 'Z%' and CountryCode = 'CHN'")
+----------------+-------------+
| Name           | CountryCode |
+----------------+-------------+
| Zhengzhou      | CHN         |
| Zibo           | CHN         |
| Zhangjiakou    | CHN         |
| Zhuzhou        | CHN         |
| Zhangjiang     | CHN         |
| Zigong         | CHN         |
| Zaozhuang      | CHN         |
...              ...
| Zhangjiagang   | CHN         |
+----------------+-------------+
22 rows in set (0.01 sec)

要指定多个条件运算符,可以将搜索条件括在括号中以更改运算符优先级。以下示例演示了ANDOR运算符的放置位置。

mysql-py> db.city.select(["Name", "CountryCode"]).where(
"Name like 'Z%' and (CountryCode = 'CHN' or CountryCode = 'RUS')")
+-------------------+-------------+
| Name              | CountryCode |
+-------------------+-------------+
| Zhengzhou         | CHN         |
| Zibo              | CHN         |
| Zhangjiakou       | CHN         |
| Zhuzhou           | CHN         |
...                 ...
| Zeleznogorsk      | RUS         |
+-------------------+-------------+
29 rows in set (0.01 sec)
限制、排序和偏移结果

您可以应用limit()order_by()offset()方法来管理select()方法返回的记录数量和顺序。

要指定结果集中包含的记录数,请将一个值附加到select()方法的limit()方法。例如,以下查询返回 country 表中的前五条记录。

mysql-py> db.country.select(["Code", "Name"]).limit(5)
+------+-------------+
| Code | Name        |
+------+-------------+
| ABW  | Aruba       |
| AFG  | Afghanistan |
| AGO  | Angola      |
| AIA  | Anguilla    |
| ALB  | Albania     |
+------+-------------+
5 rows in set (0.00 sec)

要指定结果的顺序,请将order_by()方法附加到select()方法。将一个或多个要排序的列的列表传递给order_by()方法,并根据需要选择降序(desc)或升序(asc)属性。升序是默认的排序类型。

例如,以下查询按 Name 列对所有记录进行排序,然后以降序返回前三条记录。

mysql-py> db.country.select(["Code", "Name"]).order_by(["Name desc"]).limit(3)
+------+------------+
| Code | Name       |
+------+------------+
| ZWE  | Zimbabwe   |
| ZMB  | Zambia     |
| YUG  | Yugoslavia |
+------+------------+
3 rows in set (0.00 sec)

默认情况下,limit()方法从表中的第一条记录开始。您可以使用offset()方法来更改起始记录。例如,要忽略第一条记录并返回符合条件的接下来三条记录,请将一个值传递给offset()方法。

mysql-py> db.country.select(["Code", "Name"]).order_by(["Name desc"]).limit(3).offset(1)
+------+------------+
| Code | Name       |
+------+------------+
| ZMB  | Zambia     |
| YUG  | Yugoslavia |
| YEM  | Yemen      |
+------+------------+
3 rows in set (0.00 sec)
相关信息
  • MySQL 参考手册提供了有关函数和运算符的详细文档。

  • 请参阅 TableSelectFunction 以获取完整的语法定义。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-table-update.html

22.4.4.3 更新表格

您可以使用update()方法修改表中的一个或多个记录。update()方法通过过滤查询以仅包括要更新的记录,然后对这些记录应用您指定的操作来工作。

要在城市表中替换城市名称,请将新城市名称传递给set()方法。然后,将要定位和替换的城市名称传递给where()方法。以下示例将城市 Peking 替换为 Beijing。

mysql-py> db.city.update().set("Name", "Beijing").where("Name = 'Peking'")

使用select()方法验证更改。

mysql-py> db.city.select(["ID", "Name", "CountryCode", "District", "Info"]).where("Name = 'Beijing'")
+------+-----------+-------------+----------+-----------------------------+
| ID   | Name      | CountryCode | District | Info                        |
+------+-----------+-------------+----------+-----------------------------+
| 1891 | Beijing   | CHN         | Peking   | {"Population": 7472000}     |
+------+-----------+-------------+----------+-----------------------------+
1 row in set (0.00 sec)
相关信息
  • 查看 TableUpdateFunction 以获取完整的语法定义。

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-table-delete.html

22.4.4.4 删除表

你可以使用delete()方法从数据库中的表中删除一些或所有记录。X DevAPI 提供了额外的方法与delete()方法一起使用,以过滤和排序要删除的记录。

使用条件删除记录

以下示例将搜索条件传递给delete()方法。所有匹配条件的记录都将从city表中删除。在这个示例中,有一条记录符合条件。

mysql-py> db.city.delete().where("Name = 'Olympia'")
删除第一条记录

要删除城市表中的第一条记录,使用值为 1 的limit()方法。

mysql-py> db.city.delete().limit(1)
删除表中的所有记录

你可以删除表中的所有记录。要这样做,使用delete()方法而不指定搜索条件。

注意

当你删除记录而不指定搜索条件时要小心;这样会删除表中的所有记录。

删除表

drop_collection()方法也可用于在 MySQL Shell 中从数据库中删除关系表。例如,要从world_x数据库中删除citytest表,执行:

mysql-py> db.drop_collection("citytest")
相关信息
  • 查看 TableDeleteFunction 获取完整的语法定义。

  • 查看第 22.4.2 节,“下载和导入 world_x 数据库”以获取重新创建world_x数据库的说明。

22.4.5 表中的文档

原文:dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-python-documents-in-tables.html

在 MySQL 中,表可以包含传统关系数据、JSON 值或两者兼有。您可以通过将文档存储在具有本机JSON数据类型的列中,将传统数据与 JSON 文档结合起来。

本节示例使用world_x模式中的城市表。

城市表描述

城市表有五列(或字段)。

+---------------+------------+-------+-------+---------+------------------+
| Field         | Type       | Null  | Key   | Default | Extra            |
+---------------+------------+-------+-------+---------+------------------+
| ID            | int(11)    | NO    | PRI   | null    | auto_increment   |
| Name          | char(35)   | NO    |       |         |                  |
| CountryCode   | char(3)    | NO    |       |         |                  |
| District      | char(20)   | NO    |       |         |                  |
| Info          | json       | YES   |       | null    |                  |
+---------------+------------+-------+-------+---------+------------------+

插入一条记录

要将文档插入表的列中,请按正确顺序将格式良好的 JSON 文档传递给values()方法。在下面的示例中,一个文档作为最终值传递,将插入到 Info 列中。

mysql-py> db.city.insert().values(
None, "San Francisco", "USA", "California", '{"Population":830000}')

选择一条记录

您可以发出带有评估表达式中文档值的搜索条件的查询。

mysql-py> db.city.select(["ID", "Name", "CountryCode", "District", "Info"]).where(
"CountryCode = :country and Info->'$.Population' > 1000000").bind(
'country', 'USA')
+------+----------------+-------------+----------------+-----------------------------+
| ID   | Name           | CountryCode | District       | Info                        |
+------+----------------+-------------+----------------+-----------------------------+
| 3793 | New York       | USA         | New York       | {"Population": 8008278}     |
| 3794 | Los Angeles    | USA         | California     | {"Population": 3694820}     |
| 3795 | Chicago        | USA         | Illinois       | {"Population": 2896016}     |
| 3796 | Houston        | USA         | Texas          | {"Population": 1953631}     |
| 3797 | Philadelphia   | USA         | Pennsylvania   | {"Population": 1517550}     |
| 3798 | Phoenix        | USA         | Arizona        | {"Population": 1321045}     |
| 3799 | San Diego      | USA         | California     | {"Population": 1223400}     |
| 3800 | Dallas         | USA         | Texas          | {"Population": 1188580}     |
| 3801 | San Antonio    | USA         | Texas          | {"Population": 1144646}     |
+------+----------------+-------------+----------------+-----------------------------+
9 rows in set (0.01 sec)

相关信息

  • 有关更多信息,请参阅与关系表和文档一起工作。

  • 详细描述数据类型,请参阅第 13.5 节,“JSON 数据类型”。

22.5 X 插件

原文:dev.mysql.com/doc/refman/8.0/en/x-plugin.html

22.5.1 检查 X 插件安装

22.5.2 禁用 X 插件

22.5.3 使用 X 插件进行加密连接

22.5.4 使用 X 插件与缓存 SHA-2 认证插件

22.5.5 使用 X 插件进行连接压缩

22.5.6 X 插件选项和变量

22.5.7 监控 X 插件

本节介绍如何使用、配置和监控 X 插件。

22.5.1 检查 X 插件安装情况

原文:dev.mysql.com/doc/refman/8.0/en/x-plugin-checking-installation.html

MySQL 8 默认启用了 X 插件,因此安装或升级到 MySQL 8 将使插件可用。您可以使用 SHOW plugins 语句查看插件列表来验证 X 插件是否已安装在 MySQL 服务器的实例上。

使用 MySQL Shell 来验证 X 插件是否已安装,请执行:

$> mysqlsh -u *user* --sqlc -P 3306 -e "SHOW plugins"

使用 MySQL Client 来验证 X 插件是否已安装,请执行:

$> mysql -u *user* -p -e "SHOW plugins"

如果 X 插件已安装,则示例结果如下所示:

+----------------------------+----------+--------------------+---------+---------+
| Name                       | Status   | Type               | Library | License |
+----------------------------+----------+--------------------+---------+---------+

...

| mysqlx                     | ACTIVE   | DAEMON             | NULL    | GPL     |

...

+----------------------------+----------+--------------------+---------+---------+

22.5.2 禁用 X 插件

原文:dev.mysql.com/doc/refman/8.0/en/x-plugin-disabling.html

X 插件可以在启动时通过在 MySQL 配置文件中设置mysqlx=0,或者在启动 MySQL 服务器时传入--mysqlx=0--skip-mysqlx来禁用。

或者,可以使用-DWITH_MYSQLX=OFF CMake 选项来编译不包含 X 插件的 MySQL 服务器。

22.5.3 使用 X 插件进行加密连接

原文:dev.mysql.com/doc/refman/8.0/en/x-plugin-encrypted-connections.html

本节解释了如何配置 X 插件以使用加密连接。有关更多背景信息,请参阅 Section 8.3, “Using Encrypted Connections”。

要启用对加密连接的支持进行配置,X 插件具有mysqlx_ssl_*xxx*系统变量,这些变量的值可以与用于 MySQL 服务器的ssl_*xxx*系统变量不同。例如,X 插件可以具有与 MySQL 服务器不同的 SSL 密钥、证书和证书颁发机构文件。这些变量在 Section 22.5.6.2, “X Plugin Options and System Variables”中有描述。同样,X 插件具有其自己的Mysqlx_ssl_*xxx*状态变量,对应于 MySQL 服务器加密连接的Ssl_*xxx*状态变量。请参阅 Section 22.5.6.3, “X Plugin Status Variables”。

在初始化时,X 插件确定其用于加密连接的 TLS 上下文如下:

  • 如果所有mysqlx_ssl_*xxx*系统变量都具有其默认值,则 X 插件使用与 MySQL 服务器主连接接口相同的 TLS 上下文,该接口由ssl_*xxx*系统变量的值确定。

  • 如果任何mysqlx_ssl_*xxx*变量具有非默认值,则 X 插件使用由其自身系统变量的值定义的 TLS 上下文。(如果任何mysqlx_ssl_*xxx*系统变量设置为与其默认值不同的值,则是这种情况。)

这意味着,在启用 X 插件的服务器上,您可以选择通过仅设置ssl_*xxx*变量来共享 MySQL 协议和 X 协议连接的相同加密配置,或者通过分别配置ssl_*xxx*mysqlx_ssl_*xxx*变量来为 MySQL 协议和 X 协议连接设置不同的加密配置。

要使 MySQL 协议和 X 协议连接使用相同的加密配置,请在my.cnf中仅设置ssl_*xxx*系统变量:

[mysqld]
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem

要为 MySQL 协议和 X 协议连接分别配置加密,请在my.cnf中设置ssl_*xxx*mysqlx_ssl_*xxx*系统变量:

[mysqld]
ssl_ca=ca1.pem
ssl_cert=server-cert1.pem
ssl_key=server-key1.pem

mysqlx_ssl_ca=ca2.pem
mysqlx_ssl_cert=server-cert2.pem
mysqlx_ssl_key=server-key2.pem

有关配置连接加密支持的一般信息,请参阅 Section 8.3.1, “Configuring MySQL to Use Encrypted Connections”。该讨论是针对 MySQL 服务器编写的,但参数名称对于 X 插件是类似的。(X 插件的mysqlx_ssl_*xxx*系统变量名称对应于 MySQL 服务器的ssl_*xxx*系统变量名称。)

tls_version 系统变量确定了 MySQL 协议连接所允许的 TLS 版本,也适用于 X 协议连接。因此,这两种连接类型所允许的 TLS 版本是相同的。

每个连接的加密是可选的,但可以通过在创建用户的 CREATE USER 语句中包含适当的 REQUIRE 子句来要求特定用户在 X 协议和 MySQL 协议连接中使用加密。有关详细信息,请参见 Section 15.7.1.3, “CREATE USER Statement”。或者,要求所有用户在 X 协议和 MySQL 协议连接中使用加密,可以启用 require_secure_transport 系统变量。有关更多信息,请参见 将加密连接配置为强制性。

22.5.4 使用 X 插件与缓存 SHA-2 认证插件

原文:dev.mysql.com/doc/refman/8.0/en/x-plugin-sha2-cache-plugin.html

X 插件支持使用caching_sha2_password认证插件创建的 MySQL 用户账户。有关此插件的更多信息,请参阅 8.4.1.2 节,“缓存 SHA-2 可插拔认证”。您可以使用 X 插件对这些账户进行身份验证,使用非 SSL 连接进行SHA256_MEMORY认证和使用 SSL 连接进行PLAIN认证。

虽然caching_sha2_password认证插件拥有一个认证缓存,但这个缓存不与 X 插件共享,因此 X 插件使用自己的认证缓存进行SHA256_MEMORY认证。X 插件认证缓存存储用户账户密码的哈希值,并且无法通过 SQL 访问。如果用户账户被修改或移除,相关条目将从缓存中移除。X 插件认证缓存由默认启用的mysqlx_cache_cleaner插件维护,没有相关的系统变量或状态变量。

在您可以使用非 SSL X 协议连接对使用caching_sha2_password认证插件的账户进行身份验证之前,该账户必须至少通过 SSL 进行一次 X 协议连接的认证,以向 X 插件认证缓存提供密码。一旦这个初始的 SSL 认证成功,就可以使用非 SSL X 协议连接。

可以通过使用选项--mysqlx_cache_cleaner=0启动 MySQL 服务器来禁用mysqlx_cache_cleaner插件。如果这样做,X 插件认证缓存将被禁用,因此在使用SHA256_MEMORY认证进行身份验证时,必须始终使用 SSL 进行 X 协议连接。

22.5.5 X 插件的连接压缩

原文:dev.mysql.com/doc/refman/8.0/en/x-plugin-connection-compression.html

从 MySQL 8.0.19 开始,X 插件支持在 X 协议连接上发送消息时进行压缩。如果服务器和客户端就一个相互支持的压缩算法达成一致,连接可以进行压缩。启用压缩会减少通过网络发送的字节数,但会增加服务器和客户端进行压缩和解压缩操作的额外 CPU 成本。因此,压缩的好处主要在网络带宽较低、网络传输时间主导压缩和解压缩操作成本、结果集较大时才会发生。

注意

不同的 MySQL 客户端以不同方式实现对连接压缩的支持;请查阅您的客户端文档以获取详细信息。例如,对于经典 MySQL 协议连接,请参阅 6.2.8 节,“连接压缩控制”。

  • 配置 X 插件的连接压缩

  • X 插件的压缩连接特性

  • 监控 X 插件连接压缩

配置 X 插件的连接压缩

默认情况下,X 插件支持 zstd、LZ4 和 Deflate 压缩算法。使用 Deflate 算法进行压缩时,使用 zlib 软件库,因此 X 协议连接的 deflate_stream 压缩算法设置等效于经典 MySQL 协议连接的 zlib 设置。

在服务器端,您可以通过将 mysqlx_compression_algorithms 系统变量设置为仅包含允许的压缩算法来禁止任何压缩算法。算法名称 zstd_streamlz4_messagedeflate_stream 可以以任何组合指定,顺序和大小写不重要。如果系统变量值为空字符串,则不允许任何压缩算法,连接将不被压缩。

以下表格比较了不同压缩算法的特性,并显示了它们的分配优先级。默认情况下,服务器选择服务器和客户端共同允许的最高优先级算法;客户端可以按后文所述更改优先级。在指定时,客户端可以使用算法的简短别名。

表 22.1 X 协议压缩算法特性

算法 别名 压缩比 吞吐量 CPU 成本 默认优先级
zsth_stream zstd 第一
lz4_message lz4 最低 第二
deflate_stream deflate 最高 第三

X 协议允许的压缩算法集(无论是用户指定的还是默认的)与 MySQL 服务器允许经典 MySQL 协议连接的压缩算法集是独立的,后者由protocol_compression_algorithms服务器系统变量指定。如果您没有指定mysqlx_compression_algorithms系统变量,X 插件不会回退到使用经典 MySQL 协议连接的压缩设置。相反,默认情况下,它允许表 22.1,“X 协议压缩算法特性”中显示的所有算法。这与 TLS 上下文的情况不同,如果未设置 X 插件系统变量,则使用 MySQL 服务器设置,如第 22.5.3 节,“使用 X 插件进行加密连接”中所述。有关经典 MySQL 协议连接的压缩信息,请参阅第 6.2.8 节,“连接压缩控制”。

在客户端端,X 协议连接请求可以为压缩控制指定几个参数:

  • 压缩模式。

  • 压缩级别(从 MySQL 8.0.20 开始)。

  • 按优先顺序列出的允许的压缩算法列表(从 MySQL 8.0.22 开始)。

注意

一些客户端或连接器可能不支持特定的压缩控制功能。例如,仅 MySQL Shell 支持为 X 协议连接指定压缩级别,而其他 MySQL 客户端或连接器不支持。有关支持的功能及如何使用它们的详细信息,请参阅特定产品的文档。

连接模式具有以下允许的值:

  • disabled:连接未经压缩。

  • preferred:服务器和客户端协商以找到双方都允许的压缩算法。如果没有可用的公共算法,则连接未经压缩。如果未明确指定,则这是默认模式。

  • required:压缩算法协商与preferred模式相同,但如果没有可用的公共算法,则连接请求将以错误终止。

除了为每个连接协商压缩算法外,服务器和客户端还可以就适用于约定算法的数字范围内的压缩级别达成一致。随着算法的压缩级别的增加,数据压缩比例增加,从而减少了发送消息到客户端所需的网络带宽和传输时间。然而,数据压缩所需的工作量也增加,占用了服务器上的时间、CPU 和内存资源。压缩工作量的增加与压缩比例的增加之间没有线性关系。

在 MySQL 8.0.19 中,X Plugin 始终使用每种算法的库默认压缩级别(zstd 为 3,LZ4 为 0,Deflate 为 6),客户端无法协商此设置。从 MySQL 8.0.20 开始,客户端可以在与服务器进行 X 协议连接的能力协商期间请求特定的压缩级别。

MySQL 8.0.20 中 X Plugin 使用的默认压缩级别是通过性能测试选择的,是在压缩时间和网络传输时间之间的良好折衷。这些默认值不一定与每种算法的库默认值相同。如果客户端没有为算法请求压缩级别,则会应用这些默认压缩级别。默认压缩级别最初设置为 zstd 的 3,LZ4 的 2,以及 Deflate 的 3。您可以使用mysqlx_zstd_default_compression_levelmysqlx_lz4_default_compression_level,和mysqlx_deflate_default_compression_level系统变量来调整这些设置。

为防止服务器上的资源消耗过多,X Plugin 为每种算法设置了服务器允许的最大压缩级别。如果客户端请求的压缩级别超过此设置,服务器将使用其允许的最大压缩级别(客户端请求的压缩级别仅由 MySQL Shell 支持)。最大压缩级别最初设置为 zstd 的 11,LZ4 的 8,以及 Deflate 的 5。您可以使用mysqlx_zstd_max_client_compression_levelmysqlx_lz4_max_client_compression_level,和mysqlx_deflate_max_client_compression_level系统变量来调整这些设置。

如果服务器和客户端共同允许多个算法,则在协商期间选择算法的默认优先顺序如表 22.1,“X 协议压缩算法特性”中所示。从 MySQL 8.0.22 开始,对于支持指定压缩算法的客户端,连接请求可以包含客户端允许的算法列表,使用算法名称或其别名指定。列表中这些算法的顺序被服务器视为优先顺序。在这种情况下使用的算法是客户端列表中第一个在服务器端也允许的算法。然而,压缩算法选项取决于压缩模式:

  • 如果压缩模式为disabled,则忽略压缩算法选项。

  • 如果压缩模式为preferred,但客户端端和服务器端上没有允许的算法,则连接未经压缩。

  • 如果压缩模式为required,但客户端端和服务器端上没有允许的算法,则会发生错误。

要监视消息压缩的效果,请使用 X Plugin 监视连接压缩中描述的 X Plugin 状态变量。您可以使用这些状态变量来计算使用当前设置的消息压缩的好处,并使用该信息来调整您的设置。

X Plugin 的压缩连接特性

X 协议连接压缩具有以下行为和边界:

  • 算法名称中的_stream_message后缀指的是两种不同的操作模式:在流模式中,单个连接中的所有 X 协议消息被压缩成连续的流,并且必须以相同的方式解压缩——按照它们被压缩的顺序进行,而且不能跳过任何消息。在消息模式中,每个消息都被单独和独立地压缩,不需要按照它们被压缩的顺序进行解压缩。此外,消息模式不要求所有压缩的消息都必须被解压缩。

  • 不适用于在身份验证成功之前发送的任何消息的压缩。

  • 压缩不适用于诸如Mysqlx.OkMysqlx.ErrorMysqlx.Sql.StmtExecuteOk等控制流消息。

  • 如果服务器和客户端在能力协商期间就共同允许的压缩算法达成一致,那么所有其他 X 协议消息都可以进行压缩。如果客户端在该阶段不请求压缩,则客户端和服务器都不会对消息应用压缩。

  • 当通过 X 协议连接发送的消息被压缩时,mysqlx_max_allowed_packet系统变量指定的限制仍然适用。消息负载解压缩后的网络数据包必须小于此限制。如果超过限制,X 插件将返回解压缩错误并关闭连接。

  • 客户端的压缩级别请求仅由 MySQL Shell 支持,以下是相关要点:

    • 客户端必须将压缩级别指定为整数。如果提供了其他类型的值,则连接将以错误关闭。

    • 如果客户端指定算法但未指定压缩级别,则服务器将使用该算法的默认压缩级别。

    • 如果客户端请求的算法压缩级别超过服务器允许的最大级别,则服务器使用最大允许级别。

    • 如果客户端请求的算法压缩级别低于服务器允许的最小级别,则服务器使用最小允许级别。

监控 X 插件的连接压缩效果

您可以使用 X 插件状态变量监视消息压缩的效果。当使用消息压缩时,会话Mysqlx_compression_algorithm状态变量显示当前 X 协议连接中使用的压缩算法,Mysqlx_compression_level显示所选的压缩级别。这些会话状态变量从 MySQL 8.0.20 开始可用。

从 MySQL 8.0.19 开始,X 插件状态变量可用于计算所选的压缩算法的效率(数据压缩比),以及使用消息压缩的整体效果。在以下计算中使用状态变量的会话值,以查看已知压缩算法的特定会话的消息压缩带来的好处。或者使用状态变量的全局值,检查使用 X 协议连接的服务器的整体消息压缩效益,包括为这些会话使用的所有压缩算法,以及未使用消息压缩的所有会话。然后,可以通过调整允许的压缩算法、最大压缩级别和默认压缩级别来调整消息压缩,如为 X 插件配置连接压缩中所述。

当消息压缩被使用时,Mysqlx_bytes_sent 状态变量显示从服务器发送的总字节数,包括压缩后测量的压缩消息有效载荷、未压缩的压缩消息中未压缩的项目(如 X 协议头)以及任何未压缩的消息。Mysqlx_bytes_sent_compressed_payload 状态变量显示作为压缩消息有效载荷发送的总字节数,压缩后测量,而 Mysqlx_bytes_sent_uncompressed_frame 状态变量显示相同消息有效载荷的总字节数,但在压缩之前测量。因此,压缩算法的效率可以通过以下表达式计算:

mysqlx_bytes_sent_uncompressed_frame / mysqlx_bytes_sent_compressed_payload

服务器发送的 X 协议消息的压缩效果可以通过以下表达式计算:

(mysqlx_bytes_sent - mysqlx_bytes_sent_compressed_payload + mysqlx_bytes_sent_uncompressed_frame) / mysqlx_bytes_sent

对于服务器从客户端接收的消息,Mysqlx_bytes_received_compressed_payload 状态变量显示作为压缩消息有效载荷接收的总字节数,解压缩前测量,而 Mysqlx_bytes_received_uncompressed_frame 状态变量显示相同消息有效载荷的总字节数,但在解压缩后测量。Mysqlx_bytes_received 状态变量包括解压缩前测量的压缩消息有效载荷、压缩消息中的任何未压缩项目以及任何未压缩消息。

22.5.6 X 插件选项和变量

原文:dev.mysql.com/doc/refman/8.0/en/x-plugin-options-variables.html

22.5.6.1 X 插件选项和变量参考

22.5.6.2 X 插件选项和系统变量

22.5.6.3 X 插件状态变量

本节描述了配置 X 插件的命令选项和系统变量,以及用于监控目的的状态变量。如果在启动时指定的配置值不正确,X 插件可能无法正确初始化,服务器也无法加载它。在这种情况下,服务器还可能因为无法识别其他 X 插件设置而产生错误消息。

原文:dev.mysql.com/doc/refman/8.0/en/x-plugin-option-variable-reference.html

22.5.6.1 X 插件选项和变量参考

该表提供了 X 插件提供的命令选项、系统变量和状态变量的概述。

表 22.2 X 插件选项和变量参考

名称 命令行 选项文件 系统变量 状态变量 变量范围 动态
mysqlx
Mysqlx_aborted_clients 全局
Mysqlx_address 全局
mysqlx_bind_address 全局
Mysqlx_bytes_received 两者
Mysqlx_bytes_received_compressed_payload 两者
Mysqlx_bytes_received_uncompressed_frame 两者
Mysqlx_bytes_sent 两者
Mysqlx_bytes_sent_compressed_payload 两者
Mysqlx_bytes_sent_uncompressed_frame 两者
Mysqlx_compression_algorithm 会话
mysqlx_compression_algorithms ��� 全局
Mysqlx_compression_level 会话
mysqlx_connect_timeout 全局
Mysqlx_connection_accept_errors 两者
Mysqlx_connection_errors 两者
Mysqlx_connections_accepted 全局
Mysqlx_connections_closed 全局
Mysqlx_connections_rejected 全局
Mysqlx_crud_create_view 两者
Mysqlx_crud_delete 两者
Mysqlx_crud_drop_view 两者
Mysqlx_crud_find 两者
Mysqlx_crud_insert 两者
Mysqlx_crud_modify_view 两者
Mysqlx_crud_update 两者
mysqlx_deflate_default_compression_level 全局
mysqlx_deflate_max_client_compression_level 全局
mysqlx_document_id_unique_prefix 全局
mysqlx_enable_hello_notice 全局
Mysqlx_errors_sent 两者
Mysqlx_errors_unknown_message_type 两者
Mysqlx_expect_close 两者
Mysqlx_expect_open 两者
mysqlx_idle_worker_thread_timeout 全局
Mysqlx_init_error 两者
mysqlx_interactive_timeout 全局
mysqlx_lz4_default_compression_level 全局
mysqlx_lz4_max_client_compression_level 全局
mysqlx_max_allowed_packet 全局
mysqlx_max_connections 全局
Mysqlx_messages_sent 两者
mysqlx_min_worker_threads 全局
Mysqlx_notice_global_sent 两者
Mysqlx_notice_other_sent 两者
Mysqlx_notice_warning_sent 两者
Mysqlx_notified_by_group_replication 两者
Mysqlx_port 全局
mysqlx_port 全局
mysqlx_port_open_timeout 全局
mysqlx_read_timeout 会话
Mysqlx_rows_sent 两者
Mysqlx_sessions 全局
Mysqlx_sessions_accepted 全局
Mysqlx_sessions_closed 全局
Mysqlx_sessions_fatal_error 全局
Mysqlx_sessions_killed 全局
Mysqlx_sessions_rejected 全局
Mysqlx_socket 全局
mysqlx_socket 全局
Mysqlx_ssl_accept_renegotiates 全局
Mysqlx_ssl_accepts 全局
Mysqlx_ssl_active 两者
mysqlx_ssl_ca 全局
mysqlx_ssl_capath 全局
mysqlx_ssl_cert 全局
Mysqlx_ssl_cipher 两者
mysqlx_ssl_cipher 全局
Mysqlx_ssl_cipher_list 两者
mysqlx_ssl_crl 全局
mysqlx_ssl_crlpath 全局
Mysqlx_ssl_ctx_verify_depth 两者
Mysqlx_ssl_ctx_verify_mode 两者
Mysqlx_ssl_finished_accepts 全局
mysqlx_ssl_key 全局
Mysqlx_ssl_server_not_after 全局
Mysqlx_ssl_server_not_before 全局
Mysqlx_ssl_verify_depth 全局
Mysqlx_ssl_verify_mode 全局
Mysqlx_ssl_version 两者
Mysqlx_stmt_create_collection 两者
Mysqlx_stmt_create_collection_index 两者
Mysqlx_stmt_disable_notices 两者
Mysqlx_stmt_drop_collection 两者
Mysqlx_stmt_drop_collection_index 两者
Mysqlx_stmt_enable_notices 两者
Mysqlx_stmt_ensure_collection 两者
Mysqlx_stmt_execute_mysqlx 两者
Mysqlx_stmt_execute_sql 两者
Mysqlx_stmt_execute_xplugin 两者
Mysqlx_stmt_get_collection_options 两者
Mysqlx_stmt_kill_client 两者
Mysqlx_stmt_list_clients 两者
Mysqlx_stmt_list_notices 两者
Mysqlx_stmt_list_objects 两者
Mysqlx_stmt_modify_collection_options 两者
Mysqlx_stmt_ping 两者
mysqlx_wait_timeout 会话
Mysqlx_worker_threads 全局
Mysqlx_worker_threads_active 全局
mysqlx_write_timeout 会话
mysqlx_zstd_default_compression_level 全局
mysqlx_zstd_max_client_compression_level 全局
名称 命令行 选项文件 系统变量 状态变量 变量范围 动态

原文:dev.mysql.com/doc/refman/8.0/en/x-plugin-options-system-variables.html

22.5.6.2 X Plugin 选项和系统变量

使用此选项来控制 X Plugin 的激活:

  • --mysqlx[=value]

    命令行格式 --mysqlx[=value]
    类型 枚举
    默认值 ON
    有效值 ON``OFF``FORCE``FORCE_PLUS_PERMANENT

    此选项控制服务器在启动时如何加载 X Plugin。在 MySQL 8.0 中,默认情况下启用 X Plugin,但此选项可用于控制其激活状态。

    选项值应该是插件加载选项中可用的一个,如第 7.6.1 节,“安装和卸载插件”中所述。

如果启用了 X Plugin,它会公开几个系统变量,允许控制其操作:

  • mysqlx_bind_address

    命令行格式 --mysqlx-bind-address=addr
    系统变量 mysqlx_bind_address
    范围 全局
    动态
    SET_VAR 提示适用
    类型 字符串
    默认值 *

    X Plugin 监听 TCP/IP 连接的网络地址。此变量不是动态的,只能在启动时配置。这是bind_address系统变量的 X Plugin 等效变量;有关更多信息,请参阅该变量描述。

    默认情况下,X Plugin 接受所有服务器主机 IPv4 接口上的 TCP/IP 连接,并且如果服务器主机支持 IPv6,则接受所有 IPv6 接口上的连接。如果指定了mysqlx_bind_address,其值必须满足这些要求:

    • 在 MySQL 8.0.21 之前,mysqlx_bind_address接受单个地址值,该值可以指定单个非通配符 IP 地址(IPv4 或 IPv6)、主机名或允许监听多个网络接口的通配符地址格式之一(*0.0.0.0::)。

    • 在 MySQL 8.0.21 中,mysqlx_bind_address接受单个值或逗号分隔值列表。当变量命名多个值列表时,每个值必须指定单个非通配符 IP 地址(IPv4 或 IPv6)或主机名。通配符地址格式(*0.0.0.0::)不允许在值列表中使用。

    • 截至 MySQL 8.0.22,该值可能包括网络命名空间说明符。

    IP 地址可以指定为 IPv4 或 IPv6 地址。对于任何作为主机名的值,X Plugin 将名称解析为 IP 地址并绑定到该地址。如果主机名解析为多个 IP 地址,则 X Plugin 将使用第一个 IPv4 地址(如果有)或否则使用第一个 IPv6 地址。

    X Plugin 对不同类型的地址处理如下:

    • 如果地址是*,X Plugin 将在所有服务器主机 IPv4 接口上接受 TCP/IP 连接,并且,如果服务器主机支持 IPv6,则在所有 IPv6 接口上接受连接。使用此地址允许 X Plugin 进行 IPv4 和 IPv6 连接。这是默认值。如果变量指定了多个值的列表,则不允许此值。

    • 如果地址是0.0.0.0,X Plugin 将在所有服务器主机 IPv4 接口上接受 TCP/IP 连接。如果变量指定了多个值的列表,则不允许此值。

    • 如果地址是::,X Plugin 将在所有服务器主机 IPv4 和 IPv6 接口上接受 TCP/IP 连接。如果变量指定了多个值的列表,则不允许此值。

    • 如果地址是 IPv4 映射地址,则 X Plugin 接受该地址的 TCP/IP 连接,无论是 IPv4 还是 IPv6 格式。例如,如果 X Plugin 绑定到::ffff:127.0.0.1,则诸如 MySQL Shell 之类的客户端可以使用--host=127.0.0.1--host=::ffff:127.0.0.1进行连接。

    • 如果地址是“常规”IPv4 或 IPv6 地址(例如127.0.0.1::1),X Plugin 仅接受针对该 IPv4 或 IPv6 地址的 TCP/IP 连接。

    这些规则适用于为地址指定网络命名空间:

    • 可以为 IP 地址或主机名指定网络命名空间。

    • 无法为通配符 IP 地址指定网络命名空间。

    • 对于给定的地址,网络命名空间是可选的。如果给定,必须将其指定为地址后紧跟着的/*ns*后缀。

    • 没有/*ns*后缀的地址使���主机系统全局命名空间。因此,全局命名空间是默认值。

    • 带有/*ns*后缀的地址使用命名为ns的命名空间。

    • 主机系统必须支持网络命名空间,并且每个命名空间必须事先设置好。命名不存在的命名空间会产生错误。

    • 如果变量值指定了多个地址,它可以包括全局命名空间中的地址,命名空间中的地址,或者混合使用。

    有关网络命名空间的更多信息,请参见第 7.1.14 节,“网络命名空间支持”。

    重要

    由于 X 插件不是强制性插件,因此如果指定地址或地址列表中存在错误(就像 MySQL 服务器对bind_address错误所做的那样),它不会阻止服务器启动。对于 X 插件,如果无法解析列表中的某个地址或 X 插件无法绑定到它,该地址将被跳过,将记录错误消息,并且 X 插件尝试绑定到剩余的每个地址。X 插件的Mysqlx_address状态变量仅显示成功绑定的列表中的地址。如果列表中没有任何地址导致成功绑定,或者如果单个指定的地址失败,X 插件将记录错误消息ER_XPLUGIN_FAILED_TO_PREPARE_IO_INTERFACES,指出无法使用 X 协议。mysqlx_bind_address不是动态的,因此要解决任何问题,您必须停止服务器,更正系统变量值,然后重新启动服务器。

  • mysqlx_compression_algorithms

    命令行格式 --mysqlx-compression-algorithms=value
    引入版本 8.0.19
    系统变量 mysqlx_compression_algorithms
    范围 全局
    动态
    SET_VAR 提示适用
    类型 集合
    默认值 deflate_stream, lz4_message, zstd_stream
    有效值 deflate_stream``lz4_message``zstd_stream

    允许在 X 协议连接上使用的压缩算法。默认情况下,允许使用 Deflate、LZ4 和 zstd 算法。要禁止任何算法,请将mysqlx_compression_algorithms设置为仅包含您允许的算法。算法名称deflate_streamlz4_messagezstd_stream可以以任何组合指定,顺序和大小写不重要。如果将系统变量设置为空字符串,则不允许任何压缩算法,并且仅使用未压缩的连接。使用特定于算法的系统变量来调整每个允许算法的默认和最大压缩级别。有关更多详细信息,以及有关 X 协议连接压缩与 MySQL 服务器等效设置的关系的信息,请参见第 22.5.5 节,“X 插件连接压缩”。

  • mysqlx_connect_timeout

    命令行格式 --mysqlx-connect-timeout=#
    系统变量 mysqlx_connect_timeout
    作用范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 30
    最小值 1
    最大值 1000000000
    单位

    X 插件等待新连接客户端接收第一个数据包的秒数。这是 X 插件对应的connect_timeout;有关更多信息,请参阅该变量描述。

  • mysqlx_deflate_default_compression_level

    命令行格式 --mysqlx_deflate_default_compression_level=#
    引入版本 8.0.20
    系统变量 mysqlx_deflate_default_compression_level
    作用范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 3
    最小值 1
    最大值 9

    服务器在 X 协议连接上使用的默认 Deflate 算法压缩级别。将级别指定为整数,从 1(最低压缩力度)到 9(最高力度)。如果客户端在能力协商期间未请求压缩级别,则使用此级别。如果您未指定此系统变量,服务器将使用级别 3 作为默认值。有关更多信息,请参阅第 22.5.5 节,“X 插件连接压缩”。

  • mysqlx_deflate_max_client_compression_level

    命令行格式 --mysqlx_deflate_max_client_compression_level=#
    引入版本 8.0.20
    系统变量 mysqlx_deflate_max_client_compression_level
    作用范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 5
    最小值 1
    最大值 9

    服务器允许在 X 协议连接上使用 Deflate 算法的最大压缩级别。该范围与此算法的默认压缩级别相同。如果客户端请求比此更高的压缩级别,服务器将使用您在此处设置的级别。如果您未指定此系统变量,服务器将设置最大压缩级别为 5。

  • mysqlx_document_id_unique_prefix

    命令行格式 --mysqlx-document-id-unique-prefix=#
    系统变量 mysqlx_document_id_unique_prefix
    范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 0
    最小值 0
    最大值 65535

    设置服务器在将文档添加到集合时生成的文档 ID 的前 4 个字节。通过为每个实例设置此变量的唯一值,您可以确保文档 ID 在实例之间是唯一的。参见理解文档 ID。

  • mysqlx_enable_hello_notice

    命令行格式 --mysqlx-enable-hello-notice[={OFF&#124;ON}]
    系统变量 mysqlx_enable_hello_notice
    范围 全局
    动态
    SET_VAR 提示适用
    类型 布尔
    默认值 ON

    控制发送给尝试通过 X 协议连接的经典 MySQL 协议客户端的消息。启用时,不支持 X 协议的客户端尝试连接到服务器 X 协议端口的客户端会收到一个错误,解释他们正在使用错误的协议。

  • mysqlx_idle_worker_thread_timeout

    命令行格式 --mysqlx-idle-worker-thread-timeout=#
    系统变量 mysqlx_idle_worker_thread_timeout
    范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 60
    最小值 0
    最大值 3600
    单位

    空闲工作线程终止的秒数。

  • mysqlx_interactive_timeout

    命令行格式 --mysqlx-interactive-timeout=#
    系统变量 mysqlx_interactive_timeout
    范围 全局
    动态
    SET_VAR 提���适用
    类型 整数
    默认值 28800
    最小值 1
    最大值 2147483
    单位

    交互客户端的mysqlx_wait_timeout会话变量的默认值。(等待交互客户端超时的秒数。)

  • mysqlx_lz4_default_compression_level

    命令行格式 --mysqlx_lz4_default_compression_level=#
    引入版本 8.0.20
    系统变量 mysqlx_lz4_default_compression_level
    作用域 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 2
    最小值 0
    最大值 16

    服务器在 X 协议连接上使用的 LZ4 算法的默认压缩级别。将级别指定为从 0(最低压缩力度)到 16(最高力度)的整数。如果客户端在能力协商期间未请求压缩级别,则使用此级别。如果您没有指定此系统变量,服务器将使用级别 2 作为默认值。有关更多信息,请参见 第 22.5.5 节,“X 插件连接压缩”。

  • mysqlx_lz4_max_client_compression_level

    命令行格式 --mysqlx_lz4_max_client_compression_level=#
    引入版本 8.0.20
    系统变量 mysqlx_lz4_max_client_compression_level
    作用域 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 8
    最小值 0
    最大值 16

    服务器在 X 协议连接上允许的 LZ4 算法的最大压缩级别。该范围与此算法的默认压缩级别相同。如果客户端请求比此更高的压缩级别,服务器将使用您在此处设置的级别。如果您没有指定此系统变量,服务器将设置最大压缩级别为 8。

  • mysqlx_max_allowed_packet

    命令行格式 --mysqlx-max-allowed-packet=#
    系统变量 mysqlx_max_allowed_packet
    作用域 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 67108864
    最小值 512
    最大值 1073741824
    单位 字节

    X 插件可以接收的网络数据包的最大大小。当连接使用压缩时,此限制也适用,因此在消息被解压缩后,网络数据包必须小于此大小。这是 X 插件等同于max_allowed_packet的变量;有关更多信息,请参阅该变量描述。

  • mysqlx_max_connections

    命令行格式 --mysqlx-max-connections=#
    系统变量 mysqlx_max_connections
    作用域 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 100
    最小值 1
    最大值 65535

    X 插件可以接受的最大并发客户端连接数。这是 X 插件等同于max_connections的变量;有关更多信息,请参阅该变量描述。

    对于此变量的修改,如果新值小于当前连接数,则新限制仅对新连接生效。

  • mysqlx_min_worker_threads

    命令行格式 --mysqlx-min-worker-threads=#
    系统变量 mysqlx_min_worker_threads
    作用域 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 2
    最小值 1
    最大值 100

    X 插件用于处理客户端请求的工作线程的最小数量。

  • mysqlx_port

    命令行格式 --mysqlx-port=port_num
    系统变量 mysqlx_port
    作用域 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 33060
    最小值 1
    最大值 65535

    X 插件用于监听 TCP/IP 连接的网络端口。这是 X 插件等同于port的变量;有关更多信息,请参阅该变量描述。

  • mysqlx_port_open_timeout

    命令行格式 --mysqlx-port-open-timeout=#
    系统变量 mysqlx_port_open_timeout
    作用域 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 0
    最小值 0
    最大值 120
    单位

    X 插件等待 TCP/IP 端口空闲的秒数。

  • mysqlx_read_timeout

    命令行格式 --mysqlx-read-timeout=#
    系统变量 mysqlx_read_timeout
    范围 会话
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 30
    最小值 1
    最大值 2147483
    单位

    X 插件等待阻塞读操作完成的秒数。超过此时间后,如果读操作不成功,X 插件将关闭连接并向客户端应用程序返回带有错误代码 ER_IO_READ_ERROR 的警告通知。

  • mysqlx_socket

    命令行格式 --mysqlx-socket=file_name
    系统变量 mysqlx_socket
    范围 全局
    动态
    SET_VAR 提示适用
    类型 字符串
    默认值 /tmp/mysqlx.sock

    X 插件用于连接的 Unix 套接字文件的路径。此设置仅在运行在 Unix 操作系统上的 MySQL 服务器时使用。客户端可以使用此套接字通过 X 插件连接到 MySQL 服务器。

    默认的mysqlx_socket路径和文件名基于 MySQL 服务器主套接字文件的默认路径和文件名,文件名后附加了一个 x。主套接字文件的默认路径和文件名为 /tmp/mysql.sock,因此 X 插件套接字文件的默认路径和文件名为 /tmp/mysqlx.sock

    如果您在服务器启动时使用socket系统变量指定了主套接字文件的替代路径和文件名,则这不会影响 X 插件套接字文件的默认值。在这种情况下,如果您希望将两个套接字存储在单个路径上,您还必须设置mysqlx_socket系统变量。例如,在配置文件中:

    socket=/home/sockets/mysqld/mysql.sock
    mysqlx_socket=/home/sockets/xplugin/xplugin.sock
    

    如果您在编译时使用MYSQL_UNIX_ADDR编译选项更改主套接字文件的默认路径和文件名,则会影响 X 插件套接字文件的默认值,该值是通过在MYSQL_UNIX_ADDR文件名后附加一个x形成的。如果您想在编译时为 X 插件套接字文件设置不同的默认值,请使用MYSQLX_UNIX_ADDR编译选项。

    MYSQLX_UNIX_PORT环境变量也可用于在服务器启动时设置 X 插件套接字文件的默认值(请参阅第 6.9 节,“环境变量”)。如果设置了此环境变量,则会覆盖编译的MYSQLX_UNIX_ADDR值,但会被mysqlx_socket值覆盖。

  • mysqlx_ssl_ca

    命令行格式 --mysqlx-ssl-ca=file_name
    系统变量 mysqlx_ssl_ca
    范围 全局
    动态
    SET_VAR提示适用
    类型 文件名
    默认值 NULL

    mysqlx_ssl_ca系统变量类似于ssl_ca,不同之处在于它适用于 X 插件而不是 MySQL 服务器的主连接接口。有关为 X 插件配置加密支持的信息,请参见第 22.5.3 节,“使用 X 插件进行加密连接”。

  • mysqlx_ssl_capath

    命令行格式 --mysqlx-ssl-capath=dir_name
    系统变量 mysqlx_ssl_capath
    范围 全局
    动态
    SET_VAR提示适用
    类型 目���名
    默认值 NULL

    mysqlx_ssl_capath系统变量类似于ssl_capath,不同之处在于它适用于 X 插件而不是 MySQL 服务器的主连接接口。有关为 X 插件配置加密支持的信息,请参见第 22.5.3 节,“使用 X 插件进行加密连接”。

  • mysqlx_ssl_cert

    命令行格式 --mysqlx-ssl-cert=file_name
    系统变量 mysqlx_ssl_cert
    范围 全局
    动态
    SET_VAR 提示适用
    类型 文件名
    默认值 NULL

    mysqlx_ssl_cert系统变量类似于ssl_cert,不同之处在于它适用于 X Plugin 而不是 MySQL 服务器的主连接接口。有关为 X Plugin 配置加密���持的信息,请参见第 22.5.3 节,“使用 X Plugin 进行加密连接”。

  • mysqlx_ssl_cipher

    命令行格式 --mysqlx-ssl-cipher=name
    系统变量 mysqlx_ssl_cipher
    范围 全局
    动态
    SET_VAR 提示适用
    类型 字符串
    默认值 NULL

    mysqlx_ssl_cipher系统变量类似于ssl_cipher,不同之处在于它适用于 X Plugin 而不是 MySQL 服务器的主连接接口。有关为 X Plugin 配置加密支持的信息,请参见第 22.5.3 节,“使用 X Plugin 进行加密连接”。

  • mysqlx_ssl_crl

    命令行格式 --mysqlx-ssl-crl=file_name
    系统变量 mysqlx_ssl_crl
    范围 全局
    动态
    SET_VAR 提示适用
    类型 文件名
    默认值 NULL

    mysqlx_ssl_crl系统变量类似于ssl_crl,不同之处在于它适用于 X Plugin 而不是 MySQL 服务器的主连接接口。有关为 X Plugin 配置加密支持的信息,请参见第 22.5.3 节,“使用 X Plugin 进行加密连接”。

  • mysqlx_ssl_crlpath

    命令行格式 --mysqlx-ssl-crlpath=dir_name
    系统变量 mysqlx_ssl_crlpath
    作用范围 全局
    动态
    SET_VAR 提示适用
    类型 目录名称
    默认值 NULL

    mysqlx_ssl_crlpath 系统变量类似于 ssl_crlpath,不同之处在于它适用于 X Plugin 而不是 MySQL 服务器的主连接接口。有关为 X Plugin 配置加密支持的信息,请参见 第 22.5.3 节,“使用 X Plugin 进行加密连接”。

  • mysqlx_ssl_key

    命令行格式 --mysqlx-ssl-key=file_name
    系统变量 mysqlx_ssl_key
    作用范围 全局
    动态
    SET_VAR 提示适用
    类型 文件名
    默认值 NULL

    mysqlx_ssl_key 系统变量类似于 ssl_key,不同之处在于它适用于 X Plugin 而不是 MySQL 服务器的主连接接口。有关为 X Plugin 配置加密支持的信息,请参见 第 22.5.3 节,“使用 X Plugin 进行加密连接”。

  • mysqlx_wait_timeout

    命令行格式 --mysqlx-wait-timeout=#
    系统变量 mysqlx_wait_timeout
    作用范围 会话
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 28800
    最小值 1
    最大值 2147483
    单位

    X Plugin 等待连接上的活动的秒数。超过此时间后,如果读操作不成功,X Plugin 将关闭连接。如果客户端是非交互式的,则会将会话变量的初始值从全局 mysqlx_wait_timeout 变量复制过来。对于交互式客户端,初始值从会话 mysqlx_interactive_timeout 复制过来。

  • mysqlx_write_timeout

    命令行格式 --mysqlx-write-timeout=#
    系统变量 mysqlx_write_timeout
    作用范围 会话
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 60
    最小值 1
    最大值 2147483
    单位

    X 插件等待阻塞写操作完成的秒数。超过此时间,如果写操作不成功,X 插件将关闭连接。

  • mysqlx_zstd_default_compression_level

    命令行格式 --mysqlx_zstd_default_compression_level=#
    引入版本 8.0.20
    系统变量 mysqlx_zstd_default_compression_level
    作用范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 3
    最小值 -131072
    最大值 22

    服务器在 X 协议连接上使用的 zstd 算法的默认压缩级别。对于 zstd 库版本 1.4.0,您可以设置从 1 到 22 的正值(最高压缩力度),或代表逐渐降低力度的负值。值为 0 转换为值为 1。对于较早版本的 zstd 库,您只能指定值为 3。如果客户端在能力协商期间未请求压缩级别,则使用此级别。如果您未指定此系统变量,服务器将使用级别 3 作为默认值。有关更多信息,请参见 第 22.5.5 节,“X 插件连接压缩”。

  • mysqlx_zstd_max_client_compression_level

    命令行格式 --mysqlx_zstd_max_client_compression_level=#
    引入版本 8.0.20
    系统变量 mysqlx_zstd_max_client_compression_level
    作用范围 全局
    动态
    SET_VAR 提示适用
    类型 整数
    默认值 11
    最小值 -131072
    最大值 22

    服务器允许在 X 协议连接上使用 zstd 算法的最大压缩级别。范围与此算法的默认压缩级别相同。如果客户端请求比此更高的压缩级别,服务器将使用您在此处设置的级别。如果您未指定此系统变量,服务器将设置最大压缩级别为 11。

posted @ 2024-06-23 00:41  绝不原创的飞龙  阅读(7)  评论(0编辑  收藏  举报