February 2014

[MySQL5.6] MySQL5.6.16的主要修改

春节期间Oracle relase了最新的MySQL社区版本MySQL5.6.16,总的来说,和上个版本类似,包含的基本上是一些Bugfix;下面列出一些比较有意思的bug及对应的Rev连接     Innodb   1.首先要提的是Percona的哥们提的bug#68079,在一台多核机器上,执行只读join操作,在并发线程数还没到达CPU CORE数时,就发生了性能下降,有兴趣的同学可以阅读下这个bug report,比较长,信息量还是蛮大的。Oracle针对其中一个问题(即block->mutex 等待时间较高)将所有对buf_fix_count修改成gcc buidin的原子操作,以减少block mutex的开销;代码的修改主要在Rev:5677 , Rev:5685, 对于访问比较随机的负载,这个改进可能没有明显效果; ——很快Inaam又据此提出一个新的bug:http://bugs.mysql.com/bug.php?id=71727   2.之前通过创建/删除特定Monitor表的方式,innodb会去自动输出内部信息,现在可以通过新的变量 innodb_status_output和 innodb_status_output_locks  来控制   3.bug#70087是一个值得关注的bug,根据Bug描述,如果是第一个page corruption了,可能无法从double write buffer中恢复,这是因为 在crash recovery时,是先调用的recv_init_crash_recovery->fil_load_single_table_tablespaces, 这里可能需要打开ibd文件的第一个page,在完成recv_init_crash_recovery后才会去扫描double write buffer; 为什么要先读第一个page呢? 官方给出的解释是由于double write buffer中的page包含了space id,我们还需要扫描data目录下的所有ibd,读取ibd的第一个page,以确定dbwrite buffer中的page归属。 Patch见Rev:5703  ,在函数recv_init_crash_recovery中,确保先调用buf_dblwr_init_or_load_pages , 将page先load到recv_sys->dblwr中,再调用fil_load_single_table_tablespaces读入第一个page(或者多个page,来确认该ibd的space id,并使用刚刚读取到的double write buffer来恢复page 0),如果有corruption的page,随后调用buf_dblwr_process来进行恢复。   4.几个小的性能优化点: Percona的Laurynas在bug#70417指出在函数rw_lock_x_lock_func_nowait中,只有当获取锁失败时,才需要去读取当前线程id (Rev:5655) bug#70768描述了这样一种情况:state线程持有表的stats_latch做磁盘读; 某个用户线程持有LOCK_open尝试获取stats_latch,其他线程拿不到LOCK_open被完全阻塞住, bugfix见Rev://5682 ,不过laurynas又提出了该fix引入的倒退:http://bugs.mysql.com/bug.php?id=71708 5.在创建事务时,没有初始化事务的开始时间,导致active时间错误(bug#69438, Rev:5679)     Server层   1. FORCE INDEX [FOR […]