欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Mysql Online DDL的使用详解

程序员文章站 2022-03-16 19:19:34
正文online ddl在mysql 5.6才开始支持的,在5.5及之前版本,使用alter table/create index等命令进行表结构修改操作均会锁表,这在生产环境上明显是不可接受的。在m...

正文

online ddl在mysql 5.6才开始支持的,在5.5及之前版本,使用alter table/create index等命令进行表结构修改操作均会锁表,这在生产环境上明显是不可接受的。

在mysql 5.7,online ddl在性能和稳定性上不断得到优化,性能有显著优势,且对业务负载影响小,停写时间可控,相对pt-osc/gh-ost来说,无需安装第三方依赖包,同时支持inplace算法的online ddl,由于无需拷表,所需磁盘空间也更小。

先来看一个常见的ddl语句:

alter table tbl_name add primary key (column), algorithm=inplace, lock=none;

其中,lock描述了ddl期间运行的并发程度,algorithm描述了ddl的实现方式

lock参数

  1. lock=none:允许并发的查询和dml操作
  2. lock=shared:允许并发的查询,但阻塞dml操作
  3. lock=default: 由系统决定,允许尽可能多的并发性(并发查询、dml或两者)。如果省略lock子句相当于指定lock=default
  4. lock=exclusive:阻塞并发查询和dml操作。

algorithm参数

  1. algorithm=copy:采用拷表方式进行表变更,与pt-osc/gh-ost类似;
  2. algorithm=inplace:仅需要进行引擎层数据改动,不涉及server层;

copy table流程

  1. 首先建立临时表,表结构为altar table更改后的结构
  2. 将原表中数据导入到临时表(server层创建临时表,会有显示的ibd文件)
  3. 删除原表
  4. 将临时表rename为原来的表名

同时这一过程中,为了保持数据的一致性,中间复制数据时(copy table)全程锁表只读,如果有写请求进来将无法提供服务,将导致连接数爆张。

in-place流程

  1. 建立一个临时文件,扫描原表主键的所有数据页
  2. 用数据页中原表记录生成b+树,存储到临时文件中(innodb_temp_data_file_path临时表空间下创建临时文件)
  3. 生成临时文件的过程中,将所有对原表的操作记在一个日志文件(rowlog)中
  4. 临时文件生成后,将日志文件中的操作应用到临时文件,得到一个辑数据上与原表相同
  5. 数据文件(日志文件记录和重放操作)
  6. 用临时文件替换原表数据文件

这一过程中,alter 语句在启动的时候获取mdl写锁,但是这个写锁在真正拷贝数据之前就退化成读锁,也就是说在最耗时的copy数据到临时文件的过程中,原表是可以进行dml操作的,仅仅会在最后的新旧表切换阶段加锁,这个rename的时间就非常快了。

允许并发dml的ddl操作

  • 创建/新增二级索引
  • 重命名二级索引
  • 删除二级索引
  • 改变索引类型(using {btree | hash})
  • 添加主键(expensive cost)
  • 删除主键并增加另一个(expensive cost)(alter table tbl_name drop primary key, add primary key (column), algorithm=inplace, lock=none;)
  • 新增列 (expensive cost)
  • 删除列 (expensive cost)
  • 重命名列
  • 列重新排序 (expensive cost)
  • 改变列默认值
  • 删除列默认值
  • 改变列自增值
  • 设置列属性null/not null (expensive cost)
  • 修改枚举或集合列的定义
  • change row_format
  • change key block size

标记为expensive cost的操作虽然允许onlineddl,但本身对服务器io,cpu都会造成较高负担,同时会导致复制阻塞,造成另一种形式的从库复制延迟,所以如果是大表,建议业务低峰期执行

不允许并发dml的ddl操作

  • 添加全文索引
  • 添加空间索引
  • 删除主键
  • 改变列数据类型
  • 添加自增列(新增列->变为自增列)
  • 变更表字符集
  • 修改数据类型长度
    • 特例:varchar字符长度从10变更到小于255 采用inplace方式不会锁表;从255变更到10会锁表;

以上就是mysql online ddl的使用详解的详细内容,更多关于mysql online ddl的使用的资料请关注其它相关文章!

相关标签: Mysql Online DDL