MySQL purge问题汇总

举报
宁谷花雨 发表于 2021/11/19 18:09:59 2021/11/19
【摘要】 1、trx_purge_choose_next_log:选择下一个要清除的撤消日志,并更新清除系统中的信息。此函数用于在不知道要清除的下一条记录时初始化清除系统,以及在清除已处理事务的整个撤消日志时更新下一条记录上的清除系统信息。 trx_purge_rseg_get_next_history_logtrx_serialisation_number_get:每个 rseg 的第一个提交的事务...

1

trx_purge_choose_next_log:选择下一个要清除的撤消日志,并更新清除系统中的信息。此函数用于在不知道要清除的下一条记录时初始化清除系统,以及在清除已处理事务的整个撤消日志时更新下一条记录上的清除系统信息。

 

trx_purge_rseg_get_next_history_log

trx_serialisation_number_get:每个 rseg 的第一个提交的事务会被加入到小根堆中

 

trx_purge_get_next_rec:弹出堆顶元素,包括 undo log header 的 page no 和 offset,分别赋值给 purge_sys->hdr_page_no 和 purge_sys->hdr_offset。逐个得到 undo log header 具有的所有 undo record(trx_purge_get_next_rec),包括 undo log header page 和 undo log normal page。分发给 purge worker 线程,删除索引中的 delete mark 记录

 

trx_purge_rseg_get_next_history_log / trx_purge_choose_next_log:对于被弹出的元素,在其对应的 history list 中寻找具有最小 trx no 的 undo log header 加入到最小堆中

 

重复 2。重复若干次以后会一次性删除 undo record(srv_purge_rseg_truncate_frequency)

2

 

WL#9387: InnoDB: Group purging of rows by table ID

 

这个问题最早是facebook的工程师Domas报的一个bug,InnoDB使用多线程来进行Undo Purge操作,但分配undo的策略不太合理,直接轮询分配.这意味着如果从一张表上删除大量数据,这N个purge线程可能产生大量的索引锁冲突(例如索引页合并及重组织)

 

WL#9387中,在parse undo log时,通过table_id进行分组存储,在分发时确保同一个table id的记录被分配给同一个线程.(参考函数 trx_purge_attach_undo_recs)

 

当然这也意味着合理的不会产生冲突的单表操作,无法利用到多线程purge了,也算是一个弊端.

 

https://www.jb51.cc/mysql/561786.html


 

3

 

[trx_purge_choose_next_log] Pop T1 from purge_queue;[trx_purge_get_next_rec] Iterator T1;[trx_purge_rseg_get_next_history_log] Get T1 next: T5;[trx_purge_choose_next_log] Push T5 into purge_queue;

 

purge_queue中记录了所有等待Purge的Rollback Segment和其History中trx_no最小的事务

疑问:purge_queue中对每个Rollback Segment只记录一个事务trx_no

  

https://baijiahao.baidu.com/s?id=1716401691456552282&wfr=spider&for=pc

   

4、回滚操作

  

 

5purge聚簇索引和二级索引

疑问:

1)怎么找到聚簇索引和二级索引中需要purgerow

2purge row怎么保证原子性,purge过程中crash后后续怎么处理?

 

 

https://www.cnblogs.com/shihao/archive/2012/04/22/2465460.html

https://blog.csdn.net/linuxheik/article/details/77719210

 

https://zhuanlan.zhihu.com/p/346500273

 

 

6purge与change buffer的配合

 

https://zhuanlan.zhihu.com/p/346500273

 

 

7、二级索引没有undo,怎么完成purge

 

https://www.cnblogs.com/shihao/archive/2012/04/22/2465460.html

 

8、trx_purge_get_next_rec中为什么要预读?

 

https://zhuanlan.zhihu.com/p/263038786

 

 

为了保证purge_sys以上4个域一定是指向下一个有效undo log,每次读取undo log时都会捎带着读取下一个undo log,并把上面这四个域更新为下一个undo log的信息,方面后续访问(trx_purge_get_next_rec)

http://mysql.taobao.org/monthly/2018/03/01/

 

100

 

疑问:

1、清理 del mark数据时,如果发生crash时,怎么判断已经清理过了?有什么完成标志位吗?

2、怎么根据undo log找到实际数据的pagerec

 

 

 

https://blog.csdn.net/cheetahlover/article/details/105582299

https://www.jianshu.com/p/e6804308b156

 

http://blog.sina.com.cn/s/blog_d3bf72ff0101nrhy.html

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。