[翻译]Query and Transaction size in MySQL

本文是对这篇文章Query and Transaction size in MySQL[1]的翻译,翻译如有不当的地方,敬请谅解,请尊重原创和翻译劳动成果,转载的时候请注明出处。谢谢!

[译者注]:本人在维护MySQL InnoDB Cluster时,遇到了“[ERROR] [MY-011608] [Repl] Plugin group_replication reported: 'Error on session 4410401. Transaction of size 192892268 exceeds specified limit 150000000. To increase the limit please adjust group_replication_transaction_size_limit option.'“这个错误,在研究这个问题时,看到了这篇文章,觉得写的非常不错。废话不多说,原文翻译如下。

有时候了解事务的大小非常重要,尤其是当你计划将MySQL迁移到HA解决方案时,像MySQL InnoDB Cluster,为了保证集群的最佳性能,默认情况下事务大小有一定限制。

今天我们来看看获取事务大小的不同方法。

首先我们需要将事务分为两种类型:

  • 生成数据的事务(写入操作,例如insert,delete和update等DML操作)
  • 只读事务(查询操作、DQL)

为了实现高可用性,只有第一类事务很重要。

DML的大小

为了知道DML事务的大小,我们唯一的方法就是去解析二进制日志(或者查询binlog event)。

我们需要从binlog文件中检查binlog事件并计算它的大小,为了说明这一点,让我们尝试查找GTID事务标识为:17f6a975-e2b4-11ec-b714-c8cb9e32df8e:7541914的事务的大小

SQL > \pager grep 'Gtid\|COMMIT' ;<br>Pager has been set to 'grep 'Gtid\|COMMIT' ;'.<br>SQL > show BINLOG EVENTS in 'binlog.000064' ;<br>| binlog.000064 |     213  | Gtid           |         1 |         298 | SET @@SESSION.GTID_NEXT= '17f6a975-e2b4-11ec-b714-c8cb9e32df8e:7541914' |<br>| binlog.000064 | 53904723 | Xid            |         1 |    53904754 | COMMIT /* xid=75 */                                                     |<br>SQL > \pager<br>Pager has been disabled.<br>SQL > select format_bytes(53904754-213);<br>+----------------------------+<br>| format_bytes(53904754-213) |<br>+----------------------------+<br>| 51.41 MiB                  |<br>+----------------------------+<br>1 row in set (0.0005 sec)<br>