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服务添加 iptables防火墙策略的方案
Apr 29 MySQL
MySQL创建高性能索引的全步骤
May 02 MySQL
Mysql官方性能测试工具mysqlslap的使用简介
May 21 MySQL
MySQL快速插入一亿测试数据
Jun 23 MySQL
使用ORM新增数据在Mysql中的操作步骤
Jul 26 MySQL
SQL实现LeetCode(176.第二高薪水)
Aug 04 MySQL
MySQL定时备份数据库(全库备份)的实现
Sep 25 MySQL
MySQL慢查询优化解决问题
Mar 17 MySQL
MySQL 主从复制数据不一致的解决方法
Mar 18 MySQL
MySQL如何使备份得数据保持一致
May 02 MySQL
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
Sep 23 MySQL
SQL Server数据库的三种创建方法汇总
May 08 MySQL
MySQL 存储过程的优缺点分析
May 20 #MySQL
IDEA 链接Mysql数据库并执行查询操作的完整代码
MySQL 覆盖索引的优点
May 19 #MySQL
MySQL 视图(View)原理解析
超详细教你怎么升级Mysql的版本
详解mysql三值逻辑与NULL
MySQL时间盲注的五种延时方法实现
You might like
一个用php3编写的简单计数器
2006/10/09 PHP
PHP 分页原理分析,大家可以看看
2009/12/21 PHP
php数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
2011/11/02 PHP
php实现从上传文件创建缩略图的方法
2015/04/02 PHP
纯php生成随机密码
2015/10/30 PHP
飞鱼(shqlsl) javascript作品集
2006/12/16 Javascript
选择TreeView控件的树状数据节点的JS方法(jquery)
2010/02/06 Javascript
基于Jquery的标签智能验证实现代码
2010/12/27 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(四)用地图块拼成大地图
2013/01/23 Javascript
jQuery filter函数使用方法
2014/05/19 Javascript
JS如何判断json是否为空
2016/07/06 Javascript
基于jQuery实现仿微博发布框字数提示
2016/07/27 Javascript
Javascript中类式继承和原型式继承的实现方法和区别之处
2017/04/25 Javascript
jQuery滚动插件scrollable.js用法分析
2017/05/25 jQuery
详解vue-cli构建项目反向代理配置
2017/09/07 Javascript
BootStrap数据表格实例代码
2017/09/13 Javascript
AngularJS 控制器 controller的详解
2017/10/17 Javascript
vue封装可复用组件confirm,并绑定在vue原型上的示例
2019/10/31 Javascript
详解Vue后台管理系统开发日常总结(组件PageHeader)
2019/11/01 Javascript
使用原生JS实现火锅点餐小程序(面向对象思想)
2019/12/10 Javascript
vue随机验证码组件的封装实现
2020/02/19 Javascript
[45:38]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第一局
2016/03/02 DOTA
[01:01]青春无憾,一战成名——DOTA2全国高校联赛开启
2018/02/25 DOTA
Python 转换RGB颜色值的示例代码
2019/10/13 Python
python自动脚本的pyautogui入门学习
2020/04/01 Python
基于CSS3制作立体效果导航菜单
2016/01/12 HTML / CSS
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
html5 标签
2009/07/16 HTML / CSS
世界上最大的罕见唱片、CD和音乐纪念品网上商店:991.com
2018/05/03 全球购物
澳大利亚在线家具店:Luxo Living
2019/03/24 全球购物
Linux开机引导的步骤是什么
2015/10/19 面试题
尽职尽责村干部自我鉴定
2014/01/23 职场文书
给上级领导的感谢信
2015/01/22 职场文书
企业爱心捐款倡议书
2015/04/27 职场文书
火锅店的开业营销方案范本!
2019/07/05 职场文书
Python爬取奶茶店数据分析哪家最好喝以及性价比
2022/09/23 Python