MySQL8-中文参考-三十七-
MySQL8 中文参考(三十七)
原文:
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_mode
和group_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_name
、group_replication_single_primary_mode
、group_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 的hostname
和port
系统变量所指定。如果report_port
系统变量指定了替代端口号,则使用该端口号。性能模式表replication_group_members
在MEMBER_HOST
和MEMBER_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 配置,但必须分配给服务器。
-
端口必须使用
port
、report_port
或admin_port
系统变量为 MySQL Server 配置。 -
如果使用
admin_port
,则需要为分布式恢复的复制用户授予适当的权限。 -
IP 地址不需要添加到由
group_replication_ip_allowlist
或group_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
并不会使新成员与组兼容,并允许其加入组而没有任何防范措施防止现有成员的不兼容行为。为确保新成员的正确操作,请采取以下两项预防措施:-
在运行较低版本的服务器加入组之前,请停止该服务器上的所有写操作。
-
从运行较低版本的服务器加入组的那一点开始,在组中的其他服务器上停止所有写操作。
如果没有这些预防措施,运行较低版本的服务器很可能会遇到困难,并以错误终止。
-
-
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_mode
为ON
时,设置group_replication_auto_increment_increment
不起作用。当在服务器实例上启动组复制时,服务器系统变量
auto_increment_increment
的值将更改为此值,服务器系统变量auto_increment_offset
的值将更改为服务器 ID。当停止组复制时,这些更改将被还原。仅当auto_increment_increment
和auto_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_packet
和slave_max_allowed_packet
系统变量的最大值相同,即 1073741824 字节(1 GB)。group_replication_communication_max_message_size
的设置必须小于replica_max_allowed_packet
或slave_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_ADMIN
或SUPER
权限连接,客户端也无法进行任何更新。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_quota
和group_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 AppliesNo 类型 整数 默认值 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 AppliesNo 类型 整数 默认值 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 AppliesNo 类型 字符串 此系统变量用于强制应用新的组成员。在 Group Replication 运行时,可以更改此系统变量的值,并立即生效。您只需要在要保留在组中的一个组成员上设置系统变量的值。有关可能需要强制应用新的组成员的情况以及在使用此系统变量时要遵循的程序的详细信息,请参见第 20.7.8 节,“处理网络分区和失去法定人数”。
group_replication_force_members
指定一组对等地址,以逗号分隔的列表形式,例如host1:port1
,host2: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 的hostname
和port
系统变量所指定的)。种子成员的地址被指定为逗号分隔的列表,例如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_whitelist
或group_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 通信堆栈用于组时,用户身份验证用于控制对组的访问,允许列表不起作用,如果设置则会被忽略。请注意,如果组的任何种子成员在此成员具有 IPv4group_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
显示组是否支持使用单个领导者,即使在查询的成员上当前设置为OFF
的group_replication_paxos_single_leader
。如果组是在设置为ON
的group_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.1
和198.51.100.179
。在这种情况下,您可以通过设置group_replication_local_address=203.0.113.1:33061
来使用203.0.113.1:33061
作为内部组网络地址。然后您可以使用198.51.100.179
作为hostname
,3306
作为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_increment
和auto_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 作为文档存储
目录
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
模式,然后按照以下步骤操作:
-
将安装归档文件提取到临时位置,例如
/tmp/
。解压缩归档文件会生成一个名为world_x.sql
的单个文件。 -
将
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
(&&
)、XOR
、IS
、NOT
、BETWEEN
、IN
、LIKE
、!=
、<>
、>
、>=
、<
、<=
、&
、|
、<<
、>>
、+
、-
、*
、/
、~
和%
。
查找集合中的所有文档
要返回集合中的所有文档,请使用不指定搜索条件的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
(&&
)、XOR
、IS
、NOT
、BETWEEN
、IN
、LIKE
、!=
、<>
、>
、>=
、<
、<=
、&
、|
、<<
、>>
、+
、-
、*
、/
、~
和%
。
选择所有记录
要发出返回现有表中所有记录的查询,请使用不指定搜索条件的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)
要指定多个条件运算符,可以将搜索条件括在括号中以更改运算符优先级。以下示例演示了AND
和OR
运算符的放置位置。
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
模式,然后按照以下步骤操作:
-
将安装归档文件提取到临时位置,如
/tmp/
。解压缩归档文件会生成一个名为world_x.sql
的单个文件。 -
将
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
(&&
),XOR
,IS
,NOT
,BETWEEN
,IN
,LIKE
,!=
,<>
,>
,>=
,<
,<=
,&
,|
,<<
,>>
,+
,-
,*
,/
,~
和%
。
查找集合中的所有文档
要返回集合中的所有文档,请使用未指定搜索条件的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
(&&
)、XOR
、IS
、NOT
、BETWEEN
、IN
、LIKE
、!=
、<>
、>
、>=
、<
、<=
、&
、|
、<<
、>>
、+
、-
、*
、/
、~
和%
。
选择所有记录
要发出返回现有表中的所有记录的查询,请使用未指定搜索条件的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)
要指定多个条件运算符,可以将搜索条件括在括号中以更改运算符优先级。以下示例演示了AND
和OR
运算符的放置位置。
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 插件
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 插件
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_stream
、lz4_message
和 deflate_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_level
,mysqlx_lz4_default_compression_level
,和mysqlx_deflate_default_compression_level
系统变量来调整这些设置。
为防止服务器上的资源消耗过多,X Plugin 为每种算法设置了服务器允许的最大压缩级别。如果客户端请求的压缩级别超过此设置,服务器将使用其允许的最大压缩级别(客户端请求的压缩级别仅由 MySQL Shell 支持)。最大压缩级别最初设置为 zstd 的 11,LZ4 的 8,以及 Deflate 的 5。您可以使用mysqlx_zstd_max_client_compression_level
,mysqlx_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.Ok
、Mysqlx.Error
和Mysqlx.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]
类型 枚举 默认值 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_stream
、lz4_message
和zstd_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|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。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~