MySQL ONLINE DDL和PT-ONLINE-SCHEMA-CHANGE有哪些差异
|
这篇文章主要介绍“MySQL ONLINE DDL和PT-ONLINE-SCHEMA-CHANGE有哪些区别”,在日常操作中,相信很多人在MySQL ONLINE DDL和PT-ONLINE-SCHEMA-CHANGE有哪些区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL ONLINE DDL和PT-ONLINE-SCHEMA-CHANGE有哪些区别”的疑惑有所帮助!接下来,请跟着小编一起来学习吧! mysql5.6之前执行ddl语句会执行表锁,只允许查询不允许更新,执行ddl主要有两种方式copy方式和inplace方式,inplace方式又称为(fast index creation),其中copy方式全称表锁,inplace方式只支持二级索引添加和删除。5.6之后可以利用Online DDL特性完成在线表结构调整,而pt-tools提供的pt-online-schema-change可以在几乎无表锁的情况下完成在线表结构调整,这里就针对mysql做下ddl的过程研究。 mysql原生的ddl方式实现形式有三种,分别是copy table、inplace、online ddl的方式,其中5.1-5.5版本实现是通过copy table的形式,5.6-5.7增加了inplace方式和Online ddl方式。 mysql 原生ddl实现方式 copy方式 (1).新建临时表 (2).锁原表,禁止DML,允许查询 (3).将原表数据拷贝到临时表(无排序,一行一行拷贝) (4).删除原表,对临时表进行rename,升级字典锁,禁止读写 (5).完成DDL,释放锁 inplace方式 (1).新建索引的数据字典 (2).锁表,禁止DML,允许查询 (3).读取聚集索引,构造新的索引项,排序并插入新索引 (4).等待打开当前表的所有只读事务提交 (5).创建索引结束 online ddl实现 online方式实质也包含了copy和inplace方式,对于不支持online的ddl操作采用copy方式,比如修改列类型,删除主键等;对于inplace方式,mysql内部以“是否修改记录格式”为基准也分为两类,一类需要重建表(修改记录格式),比如添加、删除列、修改列默认值等;另外一类是只需要修改表的元数据,比如添加、删除索引、修改列名等。Mysql将这两类方式分别称为rebuild方式和no-rebuild方式。online ddl主要包括3个阶段,prepare阶段,ddl执行阶段,commit阶段,rebuild方式比no-rebuild方式实质多了一个ddl执行阶段,prepare阶段和commit阶段类似。下面将主要介绍ddl执行过程中三个阶段的流程。 Prepare阶段: 创建新的临时frm文件 持有EXCLUSIVE-MDL锁,禁止读写 根据alter类型,确定执行方式(copy,online-rebuild,online-norebuild) 更新数据字典的内存对象 分配row_log对象记录增量 生成新的临时ibd文件 ddl执行阶段: 降级EXCLUSIVE-MDL锁,允许读写 扫描old_table的聚集索引每一条记录rec 遍历新表的聚集索引和二级索引,逐一处理 根据rec构造对应的索引项 将构造索引项插入sort_buffer块 将sort_buffer块插入新的索引 处理ddl执行过程中产生的增量(仅rebuild类型需要) commit阶段 升级到EXCLUSIVE-MDL锁,禁止读写 重做最后row_log中最后一部分增量 更新innodb的数据字典表 提交事务(刷事务的redo日志) 修改统计信息 rename临时idb文件,frm文件 变更完成 mysql 5.7在线修改表结构案例: 语法 alter table | ALGORITHM [=] {DEFAULT|INPLACE|COPY} | ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT} | CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name] | LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE} | MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name] online ddl的原理是,mysql把在ddl时间内的所有的 插入,更新和删除操作记录到一个日志文件, 然后再把这些增量数据应用到相应的表上(等表上的事务完全释放后),这个临时日志文件的上限值由innodb_online_alter_log_max_size指定,每次扩展innodb_sort_buffer_size的大小 该参数如果太小有可能导致DDL失败 (编辑:银川站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
