mysql基础篇--在线ddl归纳总结

author author     2022-12-05     410

关键词:

工具在线DDL

pt-osc原理

pt-online-schema-change
pt-osc工作流程:
1、检查更改表是否有主键或唯一索引,是否有触发器
2、检查修改表的表结构,创建一个临时表,在新表上执行ALTER TABLE语句
3、在源表上创建三个触发器分别对于INSERT UPDATE DELETE操作

触发器来应用DDL执行期间对表所做的DML操作,每种DML操作均对应一个触发器
delete变为delete ignore,update和insert均转换为replace into

4、从源表拷贝数据到临时表,在拷贝过程中,对源表的更新操作会写入到新建表中

在拷表select时需要进行当前读(lock in shared mode)并与insert组成一个事务,
避免快照读导致增量的delete操作丢失

5、将临时表和源表rename(需要元数据修改锁,需要短时间锁表)
6、删除源表和触发器,完成表结构的修改。

gh-ost原理

1、 gh-ost 首先连接到主库上,根据 alter 语句创建幽灵表_tablename_gho;
2、 然后gh-ost作为一个备库连接到主库上,一边在主库上拷贝已有的数据到幽灵表,
一边从主库上拉取增量数据的 binlog,然后不断的把 binlog 应用回主库幽灵表;
3、 等待全部数据同步完成,进行cut-over,即进行幽灵表和原表切换。cut-over是最后一步,
锁住主库的源表,等待binlog应用完毕,然后替换gh-ost幽灵表为源表。gh-ost在执行中,
会在原本的binlog event里面增加hint和心跳包,用来控制整个流程的进度,检测状态等。

原生在线DDL

mysql online ddl

自 MySQL 5.6 起,MySQL 原生支持 Online DDL,即在执行 DDL 期间允许执行DML(insert、update、delete)。了解 Online DDL 先了解一下之前 DDL 的 2 种算法 copy 和 inplace。

Copy方式

1、按照原表定义创建一个新的临时表
2、对原表加写锁(禁止DML,允许select)
3、步骤1)建立的临时表执行DDL
4、将原表中的数据copy到临时表
5、释放原表的写锁
6、将原表删除,并将临时表重命名为原表
可见,采用 copy 方式期间需要锁表,禁止 DML,因此是非 Online 的。
比如:删除主键、修改列类型、修改字符集,这些操作会导致行记录格式发生变化(无法通过全量+增量实现 Online)。

Inplace方式

在原表上进行更改,不需要生成临时表,不需要进行数据copy的过程。
根据是否行记录格式,分为两类:
rebuild:需要重建表(重新组织聚簇索引)。
比如 optimize table、添加索引、添加/删除列、修改列 NULL/NOT NULL 属性等;
no-rebuild:不需要重建表,只需要修改表的元数据
比如删除索引、修改列名、修改列默认值、修改列自增值等。
对于 rebuild 方式实现 Online 是通过缓存 DDL 期间的 DML,待 DDL 完成之后,将 DML 应用到表上来实现的。例如,执行一个 alter table A engine=InnoDB; 重建表的 DDL 其大致流程如下:
1、建立一个临时文件,扫描表A主键的所有数据页;
2、用数据页中表A的记录生成B+树,存储到临时文件中;
3、生成临时文件的过程中,将所有对A的操作记录在一个日志文件(row log)中;
4、临时文件生成后,将日志文件中的操作应用到临时文件,得到一个逻辑数据上与表A相同的数据文件;
5、用临时文件替换表A的数据文件。
说明:
在 copy 数据到新表期间,在原表上是加的 MDL 读锁(允许 DML,禁止 DDL)
在应用增量期间对原表加 MDL 写锁(禁止 DML 和 DDL)
根据表A重建出来的数据是放在 tmp_file 里的,这个临时文件是 InnoDB 在内部创建出来的,
整个 DDL 过程都在 InnoDB 内部完成。
对于 server 层来说,没有把数据挪动到临时表,是一个原地操作,这就是“inplace”名称的来源。

总结

(1)pt-osc、gh-ost、原生 Online DDL copy 方式(实际上是非 Online),都是需要 copy 原表数据到一个新表,这个是非常耗时的;

(2)pt-osc 采用触发器实现应用 DDL 期间的 DML, gh-ost 通过 binlog 应用 DDL 期间的 DML,理论上触发器会有一定的负载,且 gh-ost 可以从从库上拉取binlog,对主库的影响更小;

(3)原生 Online DDL 中 Inplace 方式,对于 no-rebuild 方式,不需要重建表,只需要修改表的元数据,这个是非常快的; (比如删除索引、修改列名、修改列默认值、修改列自增值等)

(4)原生 Online DDL 中 Inplace 方式,对于 rebuild 方式,需要重建表,但是也是在 InnoDB 内部完成的,比 copy 的方式要快; (optimize table、添加索引、添加/删除列、修改列 NULL/NOT NULL 属性等)

sql基础知识归纳总结

...测试数据库再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 查看详情

mysql基础篇总结(代码片段)

目录一、SQL的语言分类二、MySQL的常用命令三、DQL语句1、基础查询1)语法2)示例2、条件查询1)语法2)筛选条件的分类3、常见函数1)单行函数2)分组函数4、分组查询1)语法2)注意5、连接查询1&... 查看详情

数据库02-基础归纳

字段类型在mysql中包含的数据类型很多,这里主要列出来常用的几种数字:int,decimal字符串:varchar,text日期:datetime布尔:bit约束主键primarykey非空notnull惟一unique默认default外键foreignkey数据库操作篇:1.常规设置:   主键... 查看详情

mysql中文乱码归纳总结(代码片段)

今天使用sqlalchemy往mysql数据库里插入数据的时候,发生了错误,因为字段包含中文,所以报错。在问题解决之后做一个总结。 mysql中文乱码包括几个方面。mysql服务器层面、mysql数据库层面、客户端层面、表层面。所以要解决... 查看详情

mysql呕血汇总--从基础到毕业❤收藏篇❤(代码片段)

MYSQL目录前言一、MYSQL基础1.安装2.数据库介绍2.1.什么是数据库?2.2.实体(类)和表关系2.3.常见关系型数据库3.MYSQL基础操作❤重点❤3.1.启动关闭3.2.DDL(数据定义语言,这些语句定义不同的数据段、数据库、表、列、索... 查看详情

mysql基础:dml语句总结(代码片段)

blog:https://www.cnblogs.com/Rohn/SQL语言大致分为DCL、DDL、DML三种,本文主要介绍MySQL5.7版本DML语句。目录概述关键字INSERT语句语法格式DELETE语句语法格式单表删除多表删除UPDATE语句语法格式单表更新多表更新SELECT语句语法格式概述DML(... 查看详情

大厂面试预备篇——《两万字mysql基础总结》❤️建议收藏(代码片段)

❤️一条独家专栏⭐️搞技术,进大厂,聊人生📚《大厂面试突击》——面试10多家中大厂的万字总结📚《技术专家修炼》——高薪必备,企业真实场景📚《leetcode300题》——每天一道算法题,进大厂... 查看详情

mysql高级篇如何创建数据库?一文带你吃透数据库和表的操作之ddl(代码片段)

前一篇文章是数据库系统的基础概念和MySQL的入门篇,SQL是一种操作关系型数据库的结构化查询语言。总的来说,SQL分为四大类,分别是数据定义语言DDL,数据操作语言DML,数据查询语言DQL和数据控制语言DCL。... 查看详情

linux基础优化与安全归纳总结

一名运维工程师在运维岗位上时间久了,就会发现Linux优化的重要性,同时会给运维工作带来很多的便利性。本人逐渐认识到了这一点,所以特意在工作闲暇之余,通过阅读Linux相关书籍及向同事、同行高手咨询,针对Linux系统的... 查看详情

mysql基础sql语法总结(代码片段)

mysql数据库:   SQL数据库语言可分为四部分:               1、DDL:对数据库或表的进行操作结构操作               2、DML:对表的记录进行更新(增、删、改)*          ... 查看详情

mysql基础(ddldmldql)(代码片段)

每天进步一点点数据库相关概念什么是数据库数据库的优点常见的数据库关系型数据库MySQL数据库SQL简介MySQL目录结构MySQL数据库连接SQL_DDL_操作数据库DDL_创建和查看数据库DDL_修改和删除数据库SQL_DDL_操作数据表DDL_数据库约束DDL_... 查看详情

mysql基础篇(01):经典实用查询案例,总结整理(代码片段)

本文源码:GitHub·点这里||GitEE·点这里一、连接查询图解示意图1、建表语句部门和员工关系表:CREATETABLE`tb_dept`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT‘主键ID‘,`deptName`varchar(30)DEFAULTNULLCOMMENT‘部门名称‘,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREM... 查看详情

探索篇|c语言基础归纳no.1(代码片段)

导语本篇博客中包含了大量的C语言基础知识,可能不太全面,但无论大家用于预习或复习,都会具备较为不错的参考价值。01.C语言与其他计算机语言的对比:C语言广泛的应用于底层开发,区别于应用开发(操作系统与软件间的... 查看详情

mysql基础,ddl和dml(新人入门向)

SQL作为关系型数据库管理系统的标准语言(ANSIX3.135-1986),在1987年得到国际标准组织的支持成为国际标准。不过不同数据库系统之间的SQL不能完全通用。SOL——StructuredQueryLanguage结构化查询语言DDL——DataDefinitionLanguag... 查看详情

echarts使用总结归纳

UserNAME:你为什么写这篇文章?My:最近项目中有统计报表的需求,使用了ECharts,“度娘”过程中东查西找太麻烦,自己写一篇加深印象,方便以后查阅。辅助文档------>ttps://echarts.baidu.com/option.html#title  (里面有各种... 查看详情

99%的程序员都必备掌握的mysql,问答题总结篇一(内附刷题网站)

作为新手菜鸟,在线测评是首选!推荐一个超棒的技术人才在线测评网站——智一面,不仅免费还能满足刷题/测评的需求!实时通过测评了解自身不足,加以改正。>在线测评:Java实习/初级【引言】如... 查看详情

算法之经典排序算法小归纳

前言    数据结构和算法是写代码的基础。基本功很重要,所谓根基深度决定成长高度。以前没吃好的饭,总有一天要回来吃的。这段时间项目不忙,回来吃饭,决定花一段时间捋一捋数据结构和算法的基础知识。... 查看详情

pt-online-change-ddl(在线ddl)

mysql>desconline_ddl;+---------+--------------+------+-----+-------------------+----------------+|Field |Type    |Null|Key|Default     |Extra  查看详情