**从MySQL 8.0.20开始,您可以在MySQL服务器实例上启用二进制日志事务压缩。启用二进制日志事务压缩后,将使用zstd算法压缩事务有效负载,然后将其作为单个事件(a Transaction_payload_event)写入服务器的二进制日志文件 。压缩后的事务负载在复制流中发送到副本,其他组复制组成员或客户端(例如mysqlbinlog)时,保持压缩状态 。它们不会被接收器线程解压缩,并且仍以其压缩状态写入中继日志。因此,二进制日志事务压缩既可以节省事务的始发者,也可以节省接收者(及其备份)的存储空间,并在服务器实例之间发送事务时节省网络带宽。
当需要检查压缩的事务有效负载中的各个事件时,将其解压缩。例如,Transaction_payload_event通过应用程序线程对进行解压缩,以便将其包含的事件应用于接收者。在恢复期间,也可以通过重播事务时使用mysqlbinlog以及SHOW BINLOG EVENTSand SHOW RELAYLOG EVENTS语句来执行解压缩。
您可以使用binlog_transaction_compression 系统变量(默认值为)在MySQL服务器实例上启用二进制日志事务压缩 OFF。您也可以使用 binlog_transaction_compression_level_zstd 系统变量,用于设置用于压缩的zstd算法的级别。此值确定压缩工作量,从1(最小工作量)到22(最大工作量)。随着压缩级别的增加,压缩率也会增加,这会减少事务有效负载所需的存储空间和网络带宽。但是,数据压缩所需的工作量也增加了,占用了时间以及原始服务器上的CPU和内存资源。压缩力的增加与压缩比的增加没有线性关系。
二进制日志事务压缩中排除了以下类型的事件,因此始终将其未压缩地写入二进制日志:
- 与交易的GTID有关的事件(包括匿名GTID事件)。
- 其他类型的控制事件,例如视图更改事件和心跳事件。
- 突发事件以及包含这些事件的所有事务的整体。
- 非交易事件以及包含它们的所有交易的整体。涉及非事务性存储引擎和事务性存储引擎混合的事务不会压缩其有效负载。
- 使用基于语句的二进制日志记录的事件。二进制日志事务压缩仅适用于基于行的二进制日志记录格式。
二进制日志加密可用于包含压缩事务的二进制日志文件。**
5.4.4.5.1启用二进制日志事务压缩时的行为
具有有效负载的事务可以像其他事务一样回滚,也可以通过常规过滤选项在副本上将其过滤掉。二进制日志事务压缩可以应用于XA事务。
启用二进制日志事务压缩后, 服务器的 max_allowed_packet和 slave_max_allowed_packet限制仍然适用,并根据的压缩大小Transaction_payload_event以及事件标头使用的字节进行度量 。请注意,压缩的事务有效负载是作为单个数据包发送的,而不是像未使用二进制日志事务压缩时那样,将事务的每个事件都发送到单个数据包中。
对于多线程工作程序,每个事务(包括其GTID事件和Transaction_payload_event)都分配给工作程序线程。工作线程对事务负载进行解压缩,并逐一应用其中的各个事件。如果在内应用任何事件均发现错误Transaction_payload_event,则将整个事务报告给协调员失败。当slave_parallel_type设置DATABASE为时,在调度事务之前,将映射受事务影响的所有数据库。DATABASE与未压缩事务相比,将二进制日志事务压缩与策略配合使用可以降低并行性,未压缩事务针对每个事件进行映射和调度。
对于半同步复制(请参见第17.4.9节“半同步复制 ”),当Transaction_payload_event收到完整副本时,副本将确认事务 。
启用二进制日志校验和时(这是默认设置),复制源服务器不会在压缩的事务有效负载中为单个事件写入校验和。取而代之的是,为complete编写一个校验和 Transaction_payload_event,为所有未压缩的事件(例如与GTID相关的事件)编写单个校验和。
对于SHOW BINLOG EVENTS和 SHOW RELAYLOG EVENTS 语句,Transaction_payload_event 首先将其打印为一个单元,然后将其解压缩并打印其中的每个事件。
对于引用的事件的结束位置的操作,如START SLAVE与 UNTIL条款, MASTER_POS_WAIT()和 sql_slave_skip_counter,必须指定压缩交易有效载荷(的端部位置Transaction_payload_event)。当使用跳过事件时 sql_slave_skip_counter,压缩的事务有效负载被计为单个计数器值,因此将跳过其中的所有事件作为一个单位。
5.4.4.5.2合并压缩和未压缩的交易负载
支持二进制日志事务压缩的MySQL Server版本可以处理压缩和未压缩的事务负载的混合体。
- 与二进制日志事务压缩相关的系统变量不需要在所有“组复制”组成员上都设置为相同,也不必在复制拓扑中从源复制到副本。您可以确定二进制日志事务压缩是否适用于每个具有二进制日志的MySQL Server实例。
- 如果在服务器上启用了事务压缩然后又禁用了事务压缩,则不会将压缩应用于该服务器上发起的将来事务,但是仍可以处理和显示已压缩的事务有效负载。
- 如果通过设置的会话值为各个会话指定了事务压缩
binlog_transaction_compression,则二进制日志可以包含压缩和未压缩的事务有效负载的混合。
当复制拓扑中的源及其副本都启用了二进制日志事务压缩时,副本将接收压缩的事务有效负载并将其压缩后写入其中继日志。它解压缩事务负载以应用事务,然后在申请写入其二进制日志后再次压缩它们。任何下游副本都将接收压缩的事务有效负载。
当复制拓扑中的源启用了二进制日志事务压缩但其副本没有启用时,副本将接收压缩的事务有效负载并将其压缩后写入其中继日志。它解压缩事务负载以应用事务,然后将未压缩的事务负载写入其自己的二进制日志(如果有的话)。任何下游副本都将接收未压缩的事务有效负载。
如果复制拓扑中的源未启用二进制日志事务压缩,但其副本却启用了副本,则如果副本具有二进制日志,它将在应用负载后压缩事务负载,并将压缩的事务负载写入其二进制日志。任何下游副本都将接收压缩的事务有效负载。
当MySQL服务器实例没有二进制日志时(如果它是MySQL 8.0.20的发行版),则无论其的值如何,它都可以接收,处理和显示压缩的事务负载 binlog_transaction_compression。这样的服务器实例接收到的压缩的事务有效负载将以其压缩状态写入中继日志,因此它们间接受益于复制拓扑中其他服务器执行的压缩。
MySQL 8.0.20之前版本的副本无法从启用了二进制日志事务压缩的源复制。MySQL 8.0.20或更高版本的副本可以在不支持二进制日志事务压缩的早期版本中从源进行复制,并且可以在将从源接收的事务写入其自己的二进制日志时对它进行压缩。
5.4.4.5.3监视二进制日志事务压缩
您可以使用“性能模式”表监视二进制日志事务压缩的效果 binary_log_transaction_compression_stats。统计信息包括监视期间的数据压缩率,您还可以查看压缩对服务器上最后一个事务的影响。您可以通过截断表格来重置统计信息。二进制日志和中继日志的统计信息被拆分,因此您可以查看压缩对每种日志类型的影响。MySQL服务器实例必须具有二进制日志才能生成这些统计信息。
性能模式表 events_stages_current显示事务何时处于其事务有效负载的解压缩或压缩阶段,并显示该阶段的进度。压缩是在处理事务之前,由处理事务的工作线程执行的,前提是最终的捕获缓存中没有将事务从二进制日志事务压缩中排除的事件(例如,事件)。当需要减压时,一次对有效负载执行一次减压。
带有该 --verbose选项的 mysqlbinlog包含注释,说明压缩的事务负载的压缩大小和未压缩大小,以及所使用的压缩算法。
您可以使用以下语句的MASTER_COMPRESSION_ALGORITHMS和 MASTER_ZSTD_COMPRESSION_LEVEL选项CHANGE MASTER TO(或不推荐 使用)在协议级别为复制连接启用连接压缩 slave_compressed_protocol 系统变量)。如果在还启用了连接压缩的系统中启用了二进制日志事务压缩,则连接压缩的影响会减小,因为可能几乎没有机会进一步压缩压缩的事务有效负载。但是,连接压缩仍可以对未压缩的事件和消息头进行操作。如果需要节省存储空间和网络带宽,可以将二进制日志事务压缩与连接压缩结合使用。有关复制连接的连接压缩的更多信息,请参见 第4.2.8节“连接压缩控制”。
对于组复制,默认情况下会为超过group_replication_compression_threshold 系统变量设置的阈值的邮件启用压缩 。您还可以使用group_replication_recovery_compression_algorithm 和 group_replication_recovery_zstd_compression_level 系统变量,通过捐赠者二进制日志中的状态转移方法,为发送给分布式恢复的消息配置压缩 。如果您在配置了二进制日志事务压缩的系统中启用了二进制日志事务压缩,则组复制的消息压缩仍可以对未压缩的事件和消息标头进行操作,但是其影响减小了。有关用于组复制的消息压缩的更多信息,请参见 第18.6.3节“消息压缩”。




