MySQL purge问题汇总
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、回滚操作
5、purge聚簇索引和二级索引
疑问:
1)怎么找到聚簇索引和二级索引中需要purge的row?
2)purge 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
6、purge与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找到实际数据的page和rec?
https://blog.csdn.net/cheetahlover/article/details/105582299
https://www.jianshu.com/p/e6804308b156
- 点赞
- 收藏
- 关注作者
评论(0)