[翻译]-Query and Transaction size in MySQL

这篇具有很好参考价值的文章主要介绍了[翻译]-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' ;
Pager has been set to '
grep 'Gtid\|COMMIT' ;'.
SQL > show BINLOG EVENTS in 'binlog.000064' ;
| binlog.000064 |     213  | Gtid           |         1 |         298 | SET @@SESSION.GTID_NEXT= '17f6a975-e2b4-11ec-b714-c8cb9e32df8e:7541914' |
binlog.000064 | 53904723 | Xid            |         1 |    53904754 | COMMIT /* xid=75 */                                                     |
SQL > \pager
Pager has been disabled.
SQL > select format_bytes(53904754-213);
+----------------------------+
| format_bytes(53904754-213) |
+----------------------------+
| 51.41 MiB                  |
+----------------------------+
1 row in set (0.0005 sec)

[译者注]:这里作者是在mysql shell中执行的SQL语句,如果在mysql客户端,这种写法是会报错的。

我们可以看到这个事务生成了51M大小的binlog event。

这种方法可能很复杂,尤其是当你需要解析多个二进制日志去查找所需的事务时。

幸运的是,performance_schema可以让我们的工作更轻松一点,事实上,即使我们不开启二进制日志压缩功能,我们也能解析表binary_log_transaction_compression_stats获取事务大小的信息

select format_bytes(UNCOMPRESSED_BYTES_COUNTER/TRANSACTION_COUNTER) size,
       format_bytes(COMPRESSED_BYTES_COUNTER/TRANSACTION_COUNTER) compressed,
       TRANSACTION_COUNTER 
  from performance_schema.binary_log_transaction_compression_stats;
+-----------+------------+---------------------+
| size      | compressed | TRANSACTION_COUNTER |
+-----------+------------+---------------------+
| 51.38 MiB | 51.38 MiB  |                   1 |
+-----------+------------+---------------------+

字段TRANSACTION_COUNTER的值非常重要,如果它的值大于1的话,事务大小的值为平均值。

所以,如果你想知道一个事务的准确大小时,你必须先将表清空,然后运行你的DML语句。

让我们看一下这个例子:

SQL> select format_bytes(UNCOMPRESSED_BYTES_COUNTER/TRANSACTION_COUNTER) size,
       format_bytes(COMPRESSED_BYTES_COUNTER/TRANSACTION_COUNTER) compressed,
       TRANSACTION_COUNTER 
  from performance_schema.binary_log_transaction_compression_stats;
+-----------+------------+---------------------+
| size      | compressed | TRANSACTION_COUNTER |
+-----------+------------+---------------------+
| 17.13 MiB | 17.13 MiB  |                   6 |
+-----------+------------+---------------------+
1 row in set (0.0004 sec)

SQL > truncate table performance_schema.binary_log_transaction_compression_stats;
Query OK, 0 rows affected (0.0018 sec)

SQL > update sbtest1 set k=k+4;
Query OK, 132188 rows affected (1.3213 sec)

Rows matched: 132188  Changed: 132188  Warnings: 0

SQL > select format_bytes(UNCOMPRESSED_BYTES_COUNTER/TRANSACTION_COUNTER) size,
       format_bytes(COMPRESSED_BYTES_COUNTER/TRANSACTION_COUNTER) compressed,
       TRANSACTION_COUNTER 
  from performance_schema.binary_log_transaction_compression_stats;
+-----------+------------+---------------------+
| size      | compressed | TRANSACTION_COUNTER |
+-----------+------------+---------------------+
| 51.38 MiB | 51.38 MiB  |                   1 |
+-----------+------------+---------------------+
1 row in set (0.0017 sec)

[译者注]:生产环境下,同一时刻可能产生了多个事务,所以这个在测试环境非常有效,在生产环境,也可能不尽人意。

我们还可以使用MySQL Shell Plugin[2]来列出一个二进制日志中的所有事务大小

JS > check.showTrxSizeSort()
Transactions in binary log binlog.000064 orderer by size (limit 10):
51 mb - 17f6a975-e2b4-11ec-b714-c8cb9e32df8e:7541926
51 mb - 17f6a975-e2b4-11ec-b714-c8cb9e32df8e:7541925
51 mb - 17f6a975-e2b4-11ec-b714-c8cb9e32df8e:7541921
51 mb - 17f6a975-e2b4-11ec-b714-c8cb9e32df8e:7541916
51 mb - 17f6a975-e2b4-11ec-b714-c8cb9e32df8e:7541915
51 mb - 17f6a975-e2b4-11ec-b714-c8cb9e32df8e:7541918
51 mb - 17f6a975-e2b4-11ec-b714-c8cb9e32df8e:7541917
51 mb - 17f6a975-e2b4-11ec-b714-c8cb9e32df8e:7541914
257 bytes - 17f6a975-e2b4-11ec-b714-c8cb9e32df8e:7541924
257 bytes - 17f6a975-e2b4-11ec-b714-c8cb9e32df8e:7541923

但是我怎样才能知道事务里面的GTID信息呢? 如果MySQL服务器支持返回信息,那么MySQL可能将GTID信息返回到客户端,MySQL Shell支持这个功能。

为了开启它,我们可以使用session_track_gtids:

SQL > set session_track_gtids='OWN_GTID';
Query OK, 0 rows affected (0.0001 sec)

SQL > update sbtest1 set k=k+1;
Query OK, 132183 rows affected (5.6854 sec)

Rows matched: 132183  Changed: 132183  Warnings: 0
GTIDs: 17f6a975-e2b4-11ec-b714-c8cb9e32df8e:7541914

如你所见,MySQL Shell会返回事务的GTID信息(update使用auto_commit)

SELECT的大小

但是我们如何知道SELECT的大小呢?

为了计算、得到SELECT语句事务的大小,我们可以计算server端发送给client的字节数,如下所示:

SQL > select variable_value 
      from performance_schema.status_by_thread 
       join performance_schema.threads using(thread_id) 
      where processlist_id=CONNECTION_ID() 
        and variable_name='Bytes_sent' into @before;

SQL > select * from sbtest1;

SQL > select format_bytes(variable_value - @before) query_size 
        from performance_schema.status_by_thread 
        join performance_schema.threads using(thread_id) 
       where processlist_id=CONNECTION_ID() 
         and variable_name='Bytes_sent' ;
+------------+
| query_size |
+------------+
| 26.08 MiB  |
+------------+
1 row in set (0.0010 sec)

总结概括

如你所见, MySQL Server的peformance_schema提供了很多关于二进制日志的信息,解析这些信息,你就可以得到DML事务或DQL的大小。

[译者注]:有时候我们需要定位产生超大事务的SQL语句,文中所讲述的方法和技巧还是有局限性,这里只是翻译原文,了解获取事务大小的一些技巧与方法,不做展开介绍。

参考资料

[1]

原文出处: https://lefred.be/content/query-and-transaction-size-in-mysql/

[2]

2: https://github.com/lefred/mysqlshell-plugins/wiki/check#showtrxsizesort文章来源地址https://www.toymoban.com/news/detail-783774.html

到了这里,关于[翻译]-Query and Transaction size in MySQL的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mysql遇见Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggre问题解决

    目录 起因 问题产生原因 解决方案 方式一 方式二 今天在mysql5.7.x 升级到8.0.x版本的时候 项目接口报错。最后发现是使用group by的sql语句时候发现mysql出现如下问题: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column \\\'xxx\\\' which is not functionally dependent on columns i

    2024年02月15日
    浏览(46)
  • 【论文阅读】Fast subgraph query processing and subgraph matching via static and dynamic equivalences

    子图查询处理(也称为子图搜索)和子图匹配是许多应用领域中的基本图问题。为解决这些问题制定实际的解决办法,人们已经作出了许多努力。尽管付出了这些努力,但现有的算法在处理大型图和/或许多图时显示出了有限的运行时间和可伸缩性。在本文中,我们提出了一个

    2024年02月03日
    浏览(39)
  • MySQL Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column异常处理

    使用联表查询时,group by两个字段出现了错误 意思是select字段里包含了没有被group by 条件唯一确定的字段。 MySQL版本5.7之后会检测函数依赖,默认启用的模式是ONLY_FULL_GROUP_BY,使用GROUP BY 语句违背了sql_mode=only_full_group_by。该模式的意思是只有确定唯一字段的group by才能执行。

    2024年01月24日
    浏览(50)
  • MySQL报错Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column whic

    报错信息及语句如下 字面翻译: SELECT 列表的表达式 #1 不在 GROUP BY 子句中,并且包含非聚合列“grades.order_id” 它在功能上不依赖于 GROUP BY 子句中的列; 这与 sql_mode=only_full_group_by 不兼容 使用GROUP BY 语句违背了 sql_mode=only_full_group_by。因为mysql版本5.7之后默认的模式是 ONLY_F

    2024年02月07日
    浏览(42)
  • MySQL报错 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column解决方法

    使用GROUP BY 语句违背了sql_mode=only_full_group_by,在MySQL数据库版本为5.7以上的版本,默认开启了 ONLY_FULL_GROUP_BY SQL模式,在此模式下,对于group by操作,如果在select语句中的查询列没有在group by中出现,那么这个SQL就是非法的,因为列不在group by语句中,所以设置了sql_mode=only_full_

    2024年02月04日
    浏览(43)
  • 运行错误:view size is not compatible with input tensor‘s size and stride (at least

    python运行报错: view size is not compatible with input tensor\\\'s size and stride (at least one dimension spans acros 出现这个原因主要就是因为v iew()需要 Tensor 中的元素地址是连续的,因为可能出现Tensor不连续的情况,修改为: 在.view前加 .contiguous() ,使其变为连续就ok。    

    2024年02月11日
    浏览(37)
  • 记录解决RuntimeError: Sizes of tensors must match except in dimension 1. Expected size 27 but got size

    在做目标检测服务过程中,将yolov7模型通过flask打包成预测服务API,此次训练的图像输入大小是1280,输入预测图片是如果图像大于1280则预测成功,小于1280则报RuntimeError: Sizes of tensors must match except in dimension 1. Expected size 27 but got size。 由于只有小图片预测报错,猜测是图像处理

    2024年02月11日
    浏览(42)
  • error: (-215:Assertion failed) size.width>0 && size.height>0 in function ‘cv::imshow‘

    错误:cv2.error: OpenCV(4.7.0) D:aopencv-pythonopencv-pythonopencvmoduleshighguisrcwindow.cpp:971: error: (-215:Assertion failed) size.width0 size.height0 in function \\\'cv::imshow\\\' 我在用cv2读入图片的时候,出现了以上错误,代码如下:    观察到imread函数中读取的图片文件地址在PyCharm中显示不对,由于我的

    2024年02月16日
    浏览(49)
  • 【Mysql】事物处理(TransAction Processing)

      博主简介:想进大厂的打工人 博主主页: @xyk: 所属专栏: JavaEE初阶 最近在复习mysql,复习到了mysql事物处理(TransAction),帮自己回顾一下,如果你也想了解什么是mysql的事物处理,希望这篇文章会对你有帮助!!!正文开始: 目录 文章目录 一、事物的概念 二、为什么使

    2023年04月18日
    浏览(41)
  • opencv error: (-215:Assertion failed) size.width>0 && size.height>0 in function ‘cv::imshow‘

    问题:因为读入图片的宽和高至少有一个不大于0。可以说就是没有读入图片 原因分析:路径出错或没有图片 1.路径里面有中文 ,opencv-python不支持直接读取中文路径,把 图片路径改成英文或把图片换一个路径就行。 如果需要改成中文路径的话可以参考【opencv】实现中文路径

    2024年02月02日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包