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 21 MySQL
.Net Core导入千万级数据至Mysql的步骤
May 24 MySQL
MySQL中distinct和count(*)的使用方法比较
May 26 MySQL
Mysql 如何实现多张无关联表查询数据并分页
Jun 05 MySQL
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
Aug 23 MySQL
MySQL插入数据与查询数据
Mar 25 MySQL
mysql 索引的数据结构为什么要采用B+树
Apr 26 MySQL
MySql中的json_extract函数处理json字段详情
Jun 05 MySQL
MySQL详细讲解变量variables的用法
Jun 21 MySQL
MySQL实现字段分割一行转多行的示例代码
Jul 07 MySQL
MySQL 存储过程的优缺点分析
May 20 #MySQL
IDEA 链接Mysql数据库并执行查询操作的完整代码
MySQL 覆盖索引的优点
May 19 #MySQL
MySQL 视图(View)原理解析
超详细教你怎么升级Mysql的版本
详解mysql三值逻辑与NULL
MySQL时间盲注的五种延时方法实现
You might like
Protoss魔法科技
2020/03/14 星际争霸
jQuery开发者都需要知道的5个小技巧
2010/01/08 Javascript
JavaScript实现简单图片滚动附源码下载
2014/06/17 Javascript
IE中鼠标经过option触发mouseout的解决方法
2015/01/29 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
使用requestAnimationFrame实现js动画性能好
2015/08/06 Javascript
JavaScript 节流函数 Throttle 详解
2016/07/04 Javascript
AngularJs concepts详解及示例代码
2016/09/01 Javascript
JS正则替换掉小括号及内容的方法
2016/11/29 Javascript
JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
2016/11/30 Javascript
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
2017/09/06 NodeJs
微信小程序之批量上传并压缩图片的实例代码
2018/07/05 Javascript
Vue下拉框回显并默认选中随机问题
2018/09/06 Javascript
小程序云开发实现数据库异步操作同步化
2019/05/18 Javascript
javascript Canvas动态粒子连线
2020/01/01 Javascript
Node.JS如何实现JWT原理
2020/09/18 Javascript
[53:29]完美世界DOTA2联赛循环赛 DM vs Matador BO2第二场 11.04
2020/11/05 DOTA
Python中的map、reduce和filter浅析
2014/04/26 Python
python实现二叉树的遍历
2017/12/11 Python
python使用wxpy轻松实现微信防撤回的方法
2019/02/21 Python
Python 一键制作微信好友图片墙的方法
2019/05/16 Python
python分别打包出32位和64位应用程序
2020/02/18 Python
django执行数据库查询之后实现返回的结果集转json
2020/03/31 Python
html5时钟实现代码
2010/10/22 HTML / CSS
德国健康生活方式网上商店:Landkaufhaus Mayer
2019/03/12 全球购物
英国性能汽车零件和发动机配件在线:Maxpeedingrods
2019/11/05 全球购物
Chupi官网:在爱尔兰手工制作的订婚、结婚戒指和精美珠宝
2020/09/28 全球购物
师范生实习个人的自我评价
2013/09/28 职场文书
信息技术专业大学生个人的自我评价
2013/10/05 职场文书
金融学专科生自我鉴定
2014/02/21 职场文书
诚信承诺书范文
2014/03/27 职场文书
2015年挂职锻炼工作总结
2014/12/12 职场文书
2015年教师业务工作总结
2015/05/26 职场文书
导游词之京东大峡谷旅游区
2019/10/29 职场文书
css3新特性的应用示例分析
2022/03/16 HTML / CSS
详解Mysq MVCC多版本的并发控制
2022/04/29 MySQL