悲剧啊!Mysql的上古BUG!!! – Linux_BeakHyan

导读 这是一种被使康复的古迹虫,在2003年由Percona的CEO(当初一定还没Percona吧)高处的bug#199,看一眼这只虫,敝就能主教教区古迹的沧桑。

悲剧啊!Mysql的上古BUG!!!悲剧啊!Mysql的上古BUG!!!
成绩的内容是InnoDB什么设定初值auto-incremen,每回重新开端时,前后将表上的最大自增量计算为峰值,居后地任务从这样地评价开端。这平均数假使从右叶使死亡弘量记载,重新开端后,自增量可以重用。这在好多境况下大都会引起成绩,组编但不限于:主备切换、史料换挡等风景。在不公正的19下的朝反方向作出反应中,你可以主教教区很多当代的的惹恼。

公职的耐用的更礼仪,不更改少许眼前的储藏处,经过重建。 回复日记。该补丁是因为wl边框造成的。,领会这样地补丁,让敝先看一眼对WL Mark 16停止了哪每一更改,为领会决这样地成绩,InnoDB申请表格引擎掌握的零碎表 特别白色 什么记载,处理引擎内侧的的损坏跺脚生命力成绩。普通的以为是:

  1. 当撞见线索损坏时,写每一重建 log,但不要花样翻新交流字典
  2. 引见每一InnoDB引擎特零碎,叫DD Buffer Table,线索损坏在每个checkpoin在前方被线索 位储藏处在在位的。
  3. 当坐下回复时,同时从重建 日记和dd Buffer 表读取线索 corruption bit, 合果实,内存说话中肯表和线索情人被跺脚为。

设定初值继续顺序

眼前仅两某典型的有恒器,每一用于corruption 位生命力,自增量列的生命力,相当的的类是:

Persister:
    |-- CorruptedIndexPersister
    |-- AutoIncPersister

Persister对应大局情人dict_persist_t::persisters,可以经过典型persistent_type_t来找到对应的Persister,眼前仅有PM_INDEX_CORRUPTED及PM_TABLE_AUTO_INC,但就票据关于,未来必定会有更多的扩张,Persister在启动时转学重大聚会dict_persist_init停止设定初值。

新建零碎表

新建零碎表名为SYS_TABLE_INFO_BUFFER,相当的的设法对付类为ddTableBuffe,储藏处在dict_persist->table_buffe说话中肯支持。

零碎表组编两列:表ID和blob典型的元交流(ref) DDTableBuffer::init),元交流列组编需求有恒化的持有违禁物元交流。

写回ddtable起缓冲作用的人

在几种境况下,内存修正被写回:

  1. 关前(日记关),脏布边表说话中肯持有违禁物表情人,相当的的生命力 metadata都需求回写到DDTableBuffer中(dict_persist_to_dd_table_buffer)
  2. 从内存中放逐每一表情人时(dict_table_remove_from_cache_low),如帮忙,放量回写。。
  3. 说起组编自增量列的表,在DDL过后,需求督促对立面,在以下功用中,会转学dict_table_set_and_persist_autoinc:
ha_innobase::commit_inplace_alter_table
create_table_info_t::initialize_autoinc()
// for example: alter table..auto_increment = ??
row_rename_table_for_mysql;
// rename from temporary table to normal table

回写的迅速移动也匹敌简略(dict_table_persist_to_dd_table_buffer_low):

  1. 设定初值需求经过表ob写回的元交流交流 corrupt index及autoinc值(dict_init_dynamic_metadata)
  2. 解释记载值,拔出DDTableBuffer零碎表(DDTableBuffer::replace(), 假使在记载,失望花样翻新手术
  3. 表情人的diry_使习惯于被修正为t METADATA_BUFFERED,表现起缓冲作用的人的元交流

Recovery and Startup

当坐下回复时,当解析到日记MLOG_TABLE_DYNAMIC_META时(MetadataRecover::parseMetadataLog),会停止解析并将解析成为的交流储藏处到集中中(MetadataRecover::m_tables),假使有与表一相反的展现,就停止掉换,确保它前后适合交流。

回复后,聚集到的meta交流权时储藏处到srv_dict_metadata中, 随后停止apply(srv_dict_recover_on_restart), 申请表格顺序的迅速移动也绝对简略,附加费表情人,于是花样翻新表情人(元交流回复::申请表格,像,说起autoinc列,常常选择较大的值。。

鞋楦

这样地虫早已挂了相当长的时间了,不压倒that的复数以为这样地bug是InnoDB的特点的同窗,注重这一不同很重要

本文转载自:

收费的最新Linux技术辅导课,为开源技术扬谷机更竭力较好的地任务:

发表评论

电子邮件地址不会被公开。 必填项已用*标注