某业务CDB实例,每天在特地时间段内( 00:07:00 - 00:08:00左右)机器对应IO监控出现写入尖刺,且主从实例都有类似现象,从机器监控可以看到,问题确实存在。
数据字典(Data Dictionary)中存储了诸多数据库的元数据信息如图1所示,包括基本Database, table, index, column, function, trigger, procedure,privilege等;以及与存储引擎相关的元数据,如InnoDB的tablespace, table_id, index_id等。MySQL-8.0在数据字典上进行了诸多优化,本文将对其进行逐一介绍。
redo_log的作用设计初衷为了提高写入性能同时解决ACID中Duration。MySQL 8.0对redo_log进行了无锁化设计,去除了redo_log性能的瓶颈,从而在数据库整体性能上有了较大提升。本文将结合已有资料和最新MySQL release代码,介绍MySQL redo log优化,主要设计模块包括redo_log、mtr和一部分buffer/flush lists。
MySQL的执行过程包括多个子阶段:语法分析、语义检查、逻辑优化、物理优化和执行。其中逻辑优化和物理优化统称为查询优化。一个查询优化器的输入是查询树,输出是查询执行计划。
最近,腾讯云某内部系统不定期出现数据库访问行更新慢,数据库用户线程大量堆积的现象。从slow log中观察,大量update执行时间超过10秒,甚至个别update执行时间超过百秒,这已经严重影响该系统的正常运行。运维同学不得不采取杀死运行session的方式解决该问题,由于访问数据库的任务是离线后台批处理任务,因此会选择业务压力小的时候运行该任务,比如半夜12点,因此,运维同学必须半夜采取紧急措施,这给线上运行造成极大的负担。
数据库管理系统中,最重要的模块包括SQL优化器、SQL执行器、事务管理器等。SQL语句处理流程为:SQL输入->语法分析->语义检查->逻辑优化->物理优化->执行。其中SQL执行器就是按照SQL优化器生成的执行计划,有机的调用存储、索引、并发等模块,实现各种计划结点算法来完成数据的读取或者修改过程。在MySQL8.0中执行器部分代码发生了较大改变,新的执行器向经典的Iterator模型更接近了一步,我们暂时叫它iterator执行器。接下来我们分析一下这个新的执行器。
innodb的物理文件包括系统表空间文件ibdata,用户表空间文件ibd,日志文件ib_logfile,临时表空间文件ibtmp,undo独立表空间等。
InnoDB支持MVCC(Multi-Version Concurrency Control), undo日志中保存了多版本的记录,undo支持事务回滚的同时,也支持数据的一致性读。undo日志保存在回滚段中,undo日志的回收由purge操作进行。
在MySQL 5.7存储引擎InnoDB崩溃恢复中,我们一定看到过MLOG_CHECKPOIN的身影。从上一个检查点(LOG CHECKPOINT)开始,进行第一次redo日志扫描(参考函数recv_group_scan_log_recs() ),就是要找到MLOG_CHECKPOINT。那么MLOG_CHECKPOINT是用来做什么的?
近期,有线上5.6版本event用户反映了两个问题: (1) 部分event莫名其妙的延迟执行 (2) 慢日志不记录event中的更新及插入语句 经过一系列的分析及验证,我们确认这两个问题是mysql原生代码的bug,并向官方report。下面就介绍一下相关代码及这两个bug的具体原因及修复方案。