问题描述
收到一枚RDS TokuDB实例crash导致HA切换的报警,上去一看错误如下:
1 | tokudb/ft-index/ft/cachetable/cachetable.cc toku_cachetable_openfd_with_filenum: Assertion `filenum.fileid != FILENUM_NONE.fileid' failed |
这个错误信息在RDS上第一次碰到,隐隐感到这是一个“可遇不可求”的bug导致,开始捉虫。
keep running, just do it!
收到一枚RDS TokuDB实例crash导致HA切换的报警,上去一看错误如下:
1 | tokudb/ft-index/ft/cachetable/cachetable.cc toku_cachetable_openfd_with_filenum: Assertion `filenum.fileid != FILENUM_NONE.fileid' failed |
这个错误信息在RDS上第一次碰到,隐隐感到这是一个“可遇不可求”的bug导致,开始捉虫。
MySQL的表包含表名,表空间、索引、列、约束等信息,这些表的元数据我们暂且称为表定义信息。 对于InnoDB来说,MySQL在server层和engine层都有表定义信息。server层的表定义记录在frm文件中,而InnoDB层的表定义信息存储在InnoDB系统表中。例如:
1 | InnoDB_SYS_DATAFILES |
我们知道MySQL的主备同步是通过binlog在备库重放进行的,IO线程把主库binlog拉过去存入relaylog,然后SQL线程重放 relaylog 中的event,然而这种模式有一个问题就是SQL线程只有一个,在主库压力大的时候,备库单个SQL线程是跑不过主库的多个用户线程的,这样备库延迟是不可避免的。为了解决这种n对1造成的备库延迟问题,5.6 引入了并行复制机制,即SQL线程在执行的时候可以并发跑。
关于其背后的设计思想,可以参考这几个worklog WL#4648,WL#5563,WL#5569,WL#5754,WL#5599,之前的月报也对并行复制原理进程了阐述,读者朋友可以回顾下。
本篇将从代码实现角度讲述并行复制是如何做的,分析基于MySQL 5.6.26。
当你对InnoDB进行修改操作时,例如删除一些行,这些行只是被标记为“已删除”,而不是真的从索引中物理删除了,因而空间也没有真的被释放回收。InnoDB的Purge线程会异步的来清理这些没用的索引键和行,但是依然没有把这些释放出来的空间还给操作系统重新使用,因而会导致页面中存在很多空洞。如果表结构中包含动态长度字段,那么这些空洞甚至可能不能被InnoDB重新用来存新的行,因为空间空间长度不足。 有些用户可能会使用 OPTIMIZE TABLE 或者 ALTER TABLE \