MySQL系列
第一章:sql_mode模式
第二章:optimize table、analyze table、alter table、gh-ost
文章目录
- MySQL系列
- 一、alter table
- 二、analyze table
- 三、optimize table
- 四、gh-ost
一、alter table
从 MySQL 5.6 版本开始,alter table t engine = InnoDB(也就是 recreate)默认流程如下所示:
- 建立一个临时文件,扫描表 A 主键的所有数据页;
- 用数据页中表 A 的记录生成 B+ 树,存储到临时文件中;
- 生成临时文件的过程中,将所有对 A 的操作记录在一个日志文件(row log)中,对应的是图中 state2 的状态;
- 临时文件生成后,将日志文件中的操作应用到临时文件,得到一个逻辑数据上与表 A 相同的数据文件,对应的就是图中 state3 的状态;用临时文件替换表 A 的数据文件。
二、analyze table
analyze table t 其实不是重建表,只是对表的索引信息做重新统计,没有修改数据,这个过程中加了 MDL 读锁
三、optimize table
optimize table t 等于 recreate+analyze
四、gh-ost
- gh-ost 首先连接到主库上,根据 alter 语句创建幽灵表,
- 然后作为一个备库连接到其中一个真正的备库或者主库上(根据具体的参数来定),一边在主库上拷贝已有的数据到幽灵表,一边从备库上拉取增量数据的 binlog,然后不断的把 binlog 应用回主库。
- 等待全部数据同步完成,进行 cut-over 幽灵表和原表切换。图中 cut-over 是最后一步,锁住主库的源表,等待 binlog 应用完毕,然后替换 gh-ost 表为源表。gh-ost 在执行中,会在原本的 binlog event 里面增加以下 hint 和心跳包,用来控制整个流程的进度,检测状态等。