Mysql Online DDL的使用详解


Posted in MySQL onMay 20, 2021

正文

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 相关文章推荐
MySQL入门命令之函数-单行函数-流程控制函数
Apr 05 MySQL
MySQL触发器的使用
May 24 MySQL
MySQL如何使用使用Xtrabackup进行备份和恢复
Jun 21 MySQL
MySQL约束超详解
Sep 04 MySQL
mysql分组后合并显示一个字段的多条数据方式
Jan 22 MySQL
Mysql存储过程、触发器、事件调度器使用入门指南
Jan 22 MySQL
Mysql忘记密码解决方法
Feb 12 MySQL
Mysql外键约束的创建与删除的使用
Mar 03 MySQL
MySQL多表查询机制
Mar 17 MySQL
关于MySQL临时表为什么可以重名的问题
Mar 22 MySQL
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
Jun 14 MySQL
MySQL 存储过程的优缺点分析
May 20 #MySQL
IDEA 链接Mysql数据库并执行查询操作的完整代码
MySQL 覆盖索引的优点
May 19 #MySQL
MySQL 视图(View)原理解析
超详细教你怎么升级Mysql的版本
详解mysql三值逻辑与NULL
MySQL时间盲注的五种延时方法实现
You might like
easyui的tabs update正确用法分享
2014/03/21 PHP
thinkphp特殊标签用法概述
2014/11/24 PHP
php实现复制移动文件的方法
2015/07/29 PHP
php代码架构的八点注意事项
2016/01/25 PHP
php如何实现不借助IDE快速定位行数或者方法定义的文件和位置
2017/01/17 PHP
PHP实现的各类hash算法长度及性能测试实例
2017/08/27 PHP
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
Jquery getJSON方法详细分析
2013/12/26 Javascript
使用时间戳解决ie缓存的问题
2014/08/20 Javascript
JavaScript使用Math.Min返回两个数中较小数的方法
2015/04/06 Javascript
超赞的动手创建JavaScript框架的详细教程
2015/06/30 Javascript
js窗口关闭提示信息(兼容IE和firefox)
2015/10/23 Javascript
移动端H5开发 Turn.js实现很棒的翻书效果
2016/06/20 Javascript
使用JS代码实现点击按钮下载文件
2016/11/12 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
微信小程序 支付简单实例及注意事项
2017/01/06 Javascript
js实现带缓动动画的导航栏效果
2017/01/16 Javascript
JavaScript 跨域之POST实现方法
2018/05/07 Javascript
Node.js 使用AngularJS的方法示例
2018/05/11 Javascript
JavaScript使用递归和循环实现阶乘的实例代码
2018/08/28 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
2020/10/18 Javascript
[46:10]2014 DOTA2国际邀请赛中国区预选赛 CnB VS HGT
2014/05/21 DOTA
跟老齐学Python之再深点,更懂list
2014/09/20 Python
关于Keras模型可视化教程及关键问题的解决
2020/01/24 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
2020/02/25 Python
Python调用飞书发送消息的示例
2020/11/10 Python
马来西亚和新加坡巴士票在线预订:CatchThatBus
2018/11/17 全球购物
Book Depository欧盟:一家领先的国际图书零售商
2019/05/21 全球购物
俄罗斯药房连锁店:ASNA
2020/06/20 全球购物
关于运动会的广播稿
2014/09/22 职场文书
四风查摆剖析材料
2014/10/10 职场文书
2014年煤矿安全工作总结
2014/12/04 职场文书
物业工程部主管岗位职责
2015/04/16 职场文书
酒店员工手册范本
2015/05/14 职场文书
SpringBoot整合阿里云视频点播的过程详解
2021/12/06 Java/Android
win10忘记pin密码登录不了怎么办?win10忘记pin密码登不进去的解决方法
2022/07/07 数码科技