mysql 使用小结(Mysql Online DDL的使用详解)
类别:数据库 浏览量:746
时间:2021-10-08 00:24:55 mysql 使用小结
Mysql Online DDL的使用详解正文
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参数
- lock=none:允许并发的查询和dml操作
- lock=shared:允许并发的查询,但阻塞dml操作
- lock=default: 由系统决定,允许尽可能多的并发性(并发查询、dml或两者)。如果省略lock子句相当于指定lock=default
- lock=exclusive:阻塞并发查询和dml操作。
algorithm参数
- algorithm=copy:采用拷表方式进行表变更,与pt-osc/gh-ost类似;
- algorithm=inplace:仅需要进行引擎层数据改动,不涉及server层;
copy table流程
- 首先建立临时表,表结构为altar table更改后的结构
- 将原表中数据导入到临时表(server层创建临时表,会有显示的ibd文件)
- 删除原表
- 将临时表rename为原来的表名
同时这一过程中,为了保持数据的一致性,中间复制数据时(copy table)全程锁表只读,如果有写请求进来将无法提供服务,将导致连接数爆张。
in-place流程
- 建立一个临时文件,扫描原表主键的所有数据页
- 用数据页中原表记录生成b+树,存储到临时文件中(innodb_temp_data_file_path临时表空间下创建临时文件)
- 生成临时文件的过程中,将所有对原表的操作记在一个日志文件(rowlog)中
- 临时文件生成后,将日志文件中的操作应用到临时文件,得到一个辑数据上与原表相同
- 数据文件(日志文件记录和重放操作)
- 用临时文件替换原表数据文件
这一过程中,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的使用的资料请关注开心学习网其它相关文章!
您可能感兴趣
- mysql8.0.12安装教程图解(MySql8.023安装过程图文详解首次安装)
- mysql变量技巧(mysql用户变量与set语句示例详解)
- mysql的使用步骤(MySQL infobright的安装步骤)
- mysql流式查询(MySQL全面瓦解之查询的正则匹配详解)
- mysql 命令与sqlserver的区别大么(MySQL系列之执行SQL 语句时发生了什么?)
- 为什么mysql主键要设置自增列(浅谈MySQL中的自增主键用完了怎么办)
- mysql索引优化技巧(MySQL如何优化索引)
- MySQL SQL Assistant智能提示
- 宝塔mysql怎么设置优化(宝塔面板mysql内存占用高如何优化)
- mysql查询性能优化详解(实例讲解MySQL 慢查询)
- windows 安装解压版 mysql5.7.28 winx64的详细教程(windows 安装解压版 mysql5.7.28 winx64的详细教程)
- mysql8.0.16安装步骤图解(mysql 8.0.22 安装配置图文教程)
- mysql中修改表的字段名(MySQL 使用SQL语句修改表名的实现)
- mysql客户端怎么运行程序(MySQL 如何连接对应的客户端进程)
- mysql exists的用法(Mysql exists用法小结)
- mybatis为什么还用mysql(关于MyBatis连接MySql8.0版本的配置问题)
- 省委书记出席的交流会,十位县委书记同场发言,代表公文材料的高水平(省委书记出席的交流会)
- 《刘老根3》热播,去世15年的她却再次被 伤害(去世15年的她却再次被)
- 十二星座爱情支配欲指数(十二星座爱情支配欲指数)
- 虐待儿童是发泄支配欲的愚蠢行为(虐待儿童是发泄支配欲的愚蠢行为)
- 你或许不知道你隐藏的支配欲望(你或许不知道你隐藏的支配欲望)
- 把宽体丰田86卖了,换成7.5代高尔夫GTI玩起姿态与性能并存的改装(把宽体丰田86卖了)
热门推荐
- dedecms如何做弹窗(dedecms列表推荐文章默认为加粗的修改方法)
- 面试时紧张该怎么办
- pythontkinter项目界面(python Tkinter版学生管理系统)
- node.js怎么使用import(Node.js断点续传的实现)
- css边框设置颜色(CSS 制作带边框背景色透明的消息框)
- Sql Server常用系统存储过程
- php如何对文本框输入小数的小数点(PHP保留两位小数的几种方法)
- js基础入门到高级教程(浅谈如何循序渐进的学好JS)
- 服务器启动nginx服务的命令(Nginx服务器添加Systemd自定义服务过程解析)
- python3的循环怎么用(对Python3 goto 语句的使用方法详解)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9