[MySQL5.6] MySQL 5.6.17新特性:online optimize table (以及其他主要bugfix)

在刚刚放出来的MySQL5.6.17版本中,最引人注意的功能当属于能够在线的进行opimitze table操作,这可以帮助减小表的大小而无需阻塞并发负载,另外以下几类操作也开始支持online ddl:

上述操作将触发表的rebuild,代码的改动量非常小

修改见 【Rev:5820

这几个选项从sql_mode中移除了:ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE, and NO_ZERO_IN_DATE;而是在严格模式中默认开启(【Rev:5829】)

ALTER  IGNORE TABLE 也被弃用(目前只是打印warning,未来版本可能移除掉),根据描述,该类操作可能导致对unique key的ddl操作及外键操作以及复制问题  (搞不定一些问题就把他干掉。。。。呵呵)(修改见【Rev:5745】)

其他一些比较有意思的bugfix

Rev:5800

开始支持分区表的flush table for export,但依然不支持分区表的ALTER TABLE DISACARD/IMPORT TABLESPACE (不知道会否进一步开发)

Rev:5846

修复一个压缩表性能退化的bug(bug#71436)

调整了zip_mutex的顺序(buf_page_get_gen),当读入一个压缩页,实际上在递增计数器buf_pool->n_pend_unzip后,就可以直接释放buf_pool->zip_mutex

Rev:5753

purge协调线程和innodb monitor线程在shutdown时可能产生race condition(bug#70430)

因为purge线程退出时,还有可能进入到函数lock_print_info_summary中 , 之前的ut_error被移除掉了

另外一个和shutdown相关的bug, shutdown可能hang住(【Rev:5752】),也和purge线程的状态相关;

Rev:5758

在打开innodb_stats_persistent时,CREATE TABLE时需要向mysql.innodb_index_stats表中插入多条记录,每次插入都会commit一次,现在改成只commit一次(buf#70063)

见函数dict_stats_save_index_stat/dict_stats_save

Rev:5764

在函数lock_rec_has_to_wait_in_queue中触发断言导致crash

row_vers_impl_x_locked_low用于检查一个二级索引记录是否被一个活跃的事务插入/删除;我们知道在innodb的二级索引页中,只记录了最大修改事务id,通过回溯聚集索引记录的undo旧版本,构建聚集索引记录并判断记录中的事务id是否活跃;bug的原因是在函数row_vers_impl_x_locked_low中错误的标识一个事务在二级索引上持有隐式锁,而该二级索引记录可能已经被标记删除并且没有与之关联的聚集索引记录;修复的方法是再判断一次二级索引记录是否被delete mark了(因为永远不会去试图插入一条被delete-mark的记录),如果是的话,则返回0 (表示修改已经commit)

另外LOCK_CONV_BY_OTHER(隐式锁转换标记)在该版本中被移除掉了;

Rev:4587

由于不正确的处理外部存储页的change buffer merge,可能触发断言失败(挂在函数row_upd_clust_rec_by_insert中的断言检查):

InnoDB: Failing assertion: rec_get_deleted_flag(rec, page_is_comp(page))

函数row_upd_changes_ord_field_binary_func用于决定是row_upd_clust_rec_by_insert (delete + insert)还是调用row_upd_clust_rec(in-place更新)的方式来更新聚集索引记录,在该函数中并没有使用到字符集,只是简单的根据二进制比较修改前后的记录顺序;而在函数row_upd_clust_rec_by_insert中则考虑到了字符集(使用cmp_dtuple_rec_with_match比较), 这意味着刚刚被标记删除的记录位置,随后即被插入了新的记录,当有其他外部存储列时,可能被错误的处理;例如在拉丁字符集中,’A’和’a’是相同的,因此会被插入到同一条记录位置;而随后检查到老记录的位置并没有被delete mark,因此触发断言失败

在Rev中提供了test case,感兴趣的同学可以在5.6.17之前的版本中尝试下,立刻挂的节奏….

Rev: 5803

对于innodb表,减小auto_increment_increment没有生效(bug#65225)

Rev:5824Rev:5832

开启并行复制导致内存一直上涨不释放的问题, 原因是分发线程使用的memroot一直到stop slave才被释放,而每次读事务都可能递增该内存使用量(bug#71197)

Rev:5838

在之前的版本中,ordered_commit函数中,事务先被写到Binlog,然后通知dump线程,再进行fsync操作(sync_binlog= 1),如果这中间crash,可能导致备库比主库的binlog更多,sync_binlog=1的强持久看起来就没有意义了(bug#70669)

新的逻辑保证在sync_binlog=1时不释放LOCK_log锁,直到binlog被sync到磁盘中;

Rev:5739

当备库上表的列比主库多一个自增列时,ROW模式下复制时,并没有为该列递增值(bug#69680)

Rev:5782

禁止复制对performance scheama表的DML操作

Rev:5788

切换semisync 打开/关闭状态导致的crash (bug#66411)

问题在于事务在commitTrx函数中,会先无锁检查semisync是否打开,然后在加锁检查,如果在加锁之前semisync被disable,active_tranxs_会被清空,加锁后当前线程判定semisync打开后,又会去判断当前事务的位点是否被注册(active_tranxs_->is_tranx_end_pos),从而触发断言失败

事实上这个fix在5.6.16版本上已经是多余的了,因为在检查active_tranxs_->is_tranx_end_pos之前已经预先判断了是否打开了semisync:

    assert(!getMasterEnabled() ||
           !active_tranxs_->is_tranx_end_pos(trx_wait_binlog_name,
                                             trx_wait_binlog_pos));

Rev:5773

当有多个dump线程时,可能导致semisync的plugin lock冲突非常明显,进而引发性能下降(bug#70218)

新的逻辑里将semi dump线程的状态返回到server层,只有在开启了semisync的dump线程才去调用HOOK

Rev:5779

The optimizer could push down a condition when the index did not have the key part present in the condition.

Rev:5761

SELECT DISTINCT …GROUP BY可能返回错误的结果集(bug#70657)

Rev:5849Rev:5850

在子查询里进行ALL()+GROUP BY的聚合操作可能返回错误的结果集(bug#71244)

时间: 2024-08-04 04:29:15

[MySQL5.6] MySQL 5.6.17新特性:online optimize table (以及其他主要bugfix)的相关文章

MySQL内核月报 2015.01-TokuDB·特性分析· Optimize Table

来自一个TokuDB用户的"投诉": https://mariadb.atlassian.net/browse/MDEV-6207 现象大概是: 用户有一个MyISAM的表test_table: 转成TokuDB引擎后表大小为92M左右: 执行"OPTIMIZE TABLE test_table": 再次执行"OPTIMIZE TABLE test_table": 继续执行: 基本稳定在这个大小. 主索引从47M-->63M-->79

MySQL 5.6 GTID新特性实践_Mysql

GTID简介 什么是GTID GTID(Global Transaction ID)是对于一个已提交事务的编号,并且是一个全局唯一的编号. GTID实际上是由UUID+TID组成的.其中UUID是一个MySQL实例的唯一标识.TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增.下面是一个GTID的具体形式 3E11FA47-71CA-11E1-9E33-C80AA9429562:23 更详细的介绍可以参见:官方文档 GTID的作用 那么GTID功能的目的是什么呢?具体归纳主要有以下

知数堂《MySQL 5.7 Replication新特性》分享总结

2016.7.14,知数堂培训在线分享<MySQL 5.7 Replication新特性>获得了空前关注和好评,征得分享嘉宾同意后,PPT在此发布分享. 分享主题 <MySQL 5.7 Replication新特性> 嘉宾介绍 宋利兵,MySQL研发工程师.2009年加入MySQL全球研发团队,从事MySQL复制相关功能的开发. 主题介绍 主要分享在MySQL 5.7中,Replication(复制)相关的一些新特性,比如多源复制.增强半同步复制.并行复制等. Agenda GTI

SQL Server -&gt;&gt; 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表)

原文:SQL Server ->> 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表) 作为SQL Server 2016(CTP3.x)的另一个新特性,Temporal Table(历史表)记录了表历史上任何时间点所有的数据改动.Temporal Table其实早在ANSI SQL 2011就提出了,而SAP HANA, DB2和Oracle早已在它们的产品中加入/实现了这一特性.所以说微软其实是落后了几个竞争对手.既然在CTP3.0中加入了,相信

MySQL 5.7版本新特性连载(四)

本文是基于MySQL-5.7.7-rc版本,未来可能 还会发生更多变化. 1.SQL MODE变化 a. 默认启用 STRICT_TRANS_TABLES 模式: b. 对 ONLY_FULL_GROUP_BY 模式实现了更复杂的特性支持,并且也被默认启用: c. 其他被默认启用的sql mode还有 NO_ENGINE_SUBSTITUTION: [iMySQL建议] 对广大MySQL使用者而言,以往不是那么严格的模式还是很方便的,在5.7版本下可能会觉得略为不适,慢慢习惯吧.比如向一个20字

【MySQL】5.7新特性之六

写在前面  本系列文章基于 5.7.12 版本讲述MySQL的新特性.从安装,文件结构,SQL ,优化 ,运维层面 复制,GITD等几个方面展开介绍 5.7 的新特性和功能.同时也建议大家跟踪官方blog和官方文档,以尽快知悉其新的变化.6.1  优化(工具方面)增强  5.7 版本中如果一个会话正在执行sql,且该sql 是支持explain的,那么我们可以通过指定会话id,查看该sql的执行计划. EXPLAIN [options] FOR CONNECTION connection_id

【MySQL】5.7新特性之一

写在前面    MySQL 5.7版本于2015年10月份左右 GA,至今已经半年多了,但自己一直没有时间来follow MySQL 5.7 新的特性,作为MySQL DBA 实在汗颜,以后会花时间来研究5.7 版本的特性并针对部分优化功能做出压力测试.本系列基于5.7.12 版本来讲述MySQL的新特性,同时也建议大家跟踪官方blog和文档,以尽快知悉其新的变化. 一 安全性    MySQL 5.7 的目标是成为发布以来最安全的 MySQL 服务器,其在 SSL/TLS 和全面安全开发方面有

【MySQL】5.7新特性之四

写在前面  本系列文章基于5.7.12 版本讲述MySQL的新特性.从安装,文件结构,SQL ,优化 ,运维层面 复制,GITD等几个方面展开介绍5.7 的新特性和功能.同时也建议大家跟踪官方blog和官方文档,以尽快知悉其新的变化.前面写了一篇文章介绍 innodb 的特性,囿于相关知识点比较多 ,本文继续介绍5.7版本的innodb 新特性.4.1 innodb buffer dump 功能增强            5.7.5 新增加innodb_buffer_pool_dump_pct参

【MySQL】5.7新特性之五

一 写在前面   本系列文章基于 5.7.12 版本讲述MySQL的新特性.从安装,文件结构,SQL ,优化 ,运维层面 复制,GITD等几个方面展开介绍 5.7 的新特性和功能.同时也建议大家跟踪官方blog和官方文档,以尽快知悉其新的变化.本文将重点介绍新版本对JSON格式的支持.5.1  支持JSON   从MySQL 5.7.8 开始,MySQL支持原生的JSON格式,即有独立的json类型,用于存放 json格式的数据.JSON 格式的数据并不是以string格式存储于数据库而是以内部