如何在Mysql中使用Online DDL

本篇文章为大家展示了如何在Mysql中使用Online 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,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。