安全、高效的MySQL DDL解决方案

MySQL作为目前应用最广泛的开源关系型数据库,是许多网站、应用和商业产品的主要数据存储。在生产环境,线上数据库常常面临着持续的、不断变化的表结构修改(DDL),如增加、更改、删除字段和索引等等。其中一些DDL操作在MySQL中会锁表,影响线上服务,那该如何解决DDL期间导致业务不可用的问题呢?我们先来看看当前有哪些解决方案。

本文完整对比了业界常用的Online DDL 工具,并从产品体验、版本支持的完整度、云适配、易用性和性能等多个⻆度进行评估与分析,给出使用推荐:

图片

NineData 是SaaS模式,开箱即用,很好的适配了各主流云的 MySQL 实例并覆盖了所有版本。而 pt-osc 和 gh-ost 都是以命令行方式执行,需要人工介入进行命令拼装,不仅容易出错,而且还需要关心和不同版本的 MySQL 适配,易用性不高。最后,在性能方面,pt-osc 相对最好,原因是和其 Online DDL实现的方式相关。本文在后面会展开对各工具的流程进行说明,方便大家进一步认识他们的实现方式。

常用 Online DDL 工具

1.1 pt-online-schema-change

由 Percona 公司开发的一种在线修改表结构的工具,该工具执行的大致流程如下:

1. 创建一张影子表(_table_new),结构和原表保持一致。

2. 在影子表(空表)上做DDL操作。

3. 在原表上创建三个触发器(insert、update、delete),通过这些触发器把增量数据写入到影子表中。

4. 进行全量数据复制,根据主键或唯一键进行分片读取写入(INSERT LOW_PRIORITY IGNORE ... SELECT ... LOCK IN SHARE MODE),循环直到全量数据读取写入完成。

5. RENAME TABLE,影子表和源表相互转换表名(原子性,持有短暂时间的排他锁,阻塞DML)。

6. 删除被改名后的原表和触发器。

整个过程中,通过使用触发器实现增量数据的同步,在数据同步期间,不阻塞该表的DML。但由于表上创建有触发器,如果该表的更新比较频繁很可能出现锁争用问题。

1.2 gh-ost

由 GitHub 开发提供的一种在线修改表结构的工具,该工具执行的大致流程如下:

1. 创建一张影子表(_table_gho),结构和原表保持一致。

2. 在影子表(空表)上做DDL操作。

3. 创建 BinLog Streamer,模拟从库读取实例的binlog,应用增量操作到影子表中执行。

4. 进行全量数据复制,根据主键或唯一键进行分片读取写入(INSERT  IGNORE ... SELECT ... LOCK IN SHARE MODE),循环直到全量数据读取同步完毕。

5. RENAME TABLE,影子表和源表相互转换表名(原子性,持有短暂时间的排他锁,阻塞DML)。

6. 停止BinLog Streamer,并删除被改名后的原表。

整个过程中,通过读取binlog来实现增量数据的同步,在数据同步期间,不阻塞该表的DML。由于读取binlog是单线程,所以增量同步的效率不高,但开销最小。

1.3 MySQL Online DDL

在 MySQL5.5 及之前的版本,修改表结构操作(DDL)会阻塞对该表数据的读写操作, 从MySQL5.6开始,提供Online DDL的能力,支持部分的 DDL语句在执行期间不阻塞该表的读写操作,大大降低了 DDL 操作对业务带来的影响。

MySQL DDL操作分为两种:一种是采用 copy table方式(MySQL5.5及之前的版本)的DDL,期间会阻塞该表的读写操作;另一种是采用 inplace 方式(Online,MySQL5.6及之后的版本),该方式分为两类情况::一类是重建表(rebuild table),另一类是只修改表的元数据不需要重建表(no-rebuild table),具体可以查看官网中的「Online DDL Operations」章节。其中:

copy table:在 server 层生成一张临时表,复制原表数据到临时表(ibd、frm),完成后临时表替换原表。复制数据期间阻塞该表的读写操作。

rebuild table :在 engine 层生成原表的临时转储文件(ibd、frm),复制原表数据,完成后临时表替换原表。复制数据期间不阻塞该表的读写操作。

no-rebuild table :在 engine 层生成原表的临时转储文件(frm),不需要复制源表数据,完成后更新表的元数据信息,期间不阻塞该表的读写操作。

copy table 方式的大致流程:

1. 对表添加一个 Meta Data Lock(共享锁,持有短暂时间的共享锁)。

2. 共享锁升级到排他锁

3. 创建临时表并修改临时表结构

4. 复制数据(阻塞该表的读写操作)

5. 数据复制完成后,重命名替换表

6. 清理数据

7. 提交和释放锁

整个过程中,通过生成临时表的方式进行数据同步,源表的DML操作会被阻塞,直到全量数据复制完成。通过该方式修改表结构会阻塞读写(DML)操作,所以需要尽量避免该方式进行DDL操作。

inplace 方式的大致流程:

1. 对表添加一个 Meta Data Lock(共享锁,短暂的时间)

2. 共享锁升级到排他锁,判断是rebuild table还是no rebuild table

    • rebuild table,在 engine 层生成原表的临时转储文件(ibd、frm)

    •  no reduild table,在 engine 层生成原表的临时转储文件(frm)

3. 排他锁降级为共享锁,进行数据复制,不阻塞读写操作(Online)

4. 共享锁升级为排它锁,应用 DDL 期间的增量数据,完成后原表删除,新表重命名为原表

5. 提交和释放锁

整个过程中,如果 DDL 是rebuild table方式:则需要同步复制源表的数据到临时的转储文件(ibd),在同步复制期间,不阻塞该表的DML操作。通过该方式修改表结构,需要保证参数innodb_online_alter_log_max_size的大小(增量期间DML的大小),并且该方式的DDL,在备库回放时间也会比较长,导致备库延迟过大。如果DDL是no-rebuild table方式:则只需要修改该表元数据信息,不需要复制源表数据,期间不阻塞该表的读写操作。

以上3种 Online DDL 方法都有各自的特点,但在执行 DDL 操作中,都需要人工判断DDL类型、表大小来选择相应的执行方法。现在,为了更安全、高效的让 DBA 和开发者进行 DDL 操作,NineData 结合了以上工具的优点,实现了自适应Online DDL的能力。

安全、高效的DDL解决方案

NineData SQL 开发专业版和企业版中的「SQL 任务」支持MySQL OnlineDDL 功能,可以在不阻塞表正常读写的情况下,对表执行结构变更。该NineData OnlineDDL执行的大致流程如下:

图片

活动截止时间

无须关心 DDL 类型,只需几步就能完成Online DDL 的配置,实现完全智能化的Online DDL操作,配置过程:

数据源

首先,添加一个MySQL数据源,并选择「环境」,如:开发

图片

规范与流程

然后,在规范与流程中,编辑刚录入数据源的「环境」:开发

图片

在「结构」中,设置表变更的Online要求:

图片

在「SQL 任务与窗口」中,可配置OnlineDDL的自适应规则:

图片

OnlineDDL自适应规则配置:

图片

配置完「规范与流程」之后,通过「SQL 开发」中的 SQL 任务 就能实现完全智能化的Online DDL操作。

实战测试

1. 创建SQL任务:

图片

2. 执行 DDL 语句:

  1. 修改表 ddl_test 的 k 字段类型,把 int 类型改成 bigint,该操作MySQL不能Online DDL

图片

  2. 给表 ddl_test 新增字段,该操作MySQL能Online DDL

图片

3. 提交 SQL

  1. NineData 很好的自适应Online DDL,无需关心 DDL 类型。对于MySQL不支持Online DDL的使用NineData OnlineDDL

图片

  2. NineData 很好的自适应Online DDL,无需关心 DDL 类型,对于MySQL支持Online DDL的使用MySQL自己的 OnlineDDL

图片

4. 执行信息

在进度页里,可以看到该Online DDL 执行的具体信息

图片

从上面的例子看到,如果执行的 DDL语句不支持MySQL的 Online ,则会使用NineData本身的 OnlineDDL;如果支持MySQL的 Online,则会优先使用MySQL本身的 Online 方法,用户无需关心 DDL的类型是否支持Online,就能保障业务的稳定性。

总结

通过本篇文章的介绍说明,可以了解到当前MySQL在执行Online DDL的几种解决方案,而 NineData 的自适应 OnlineDDL,可以在减少人工判断和操作的前提下,实现了安全、高效的在线表结构无锁变更能力,进一步保障了业务的稳定。

此外,NineData 除了支持MySQL的无锁变更外。作为开箱即用的SQL开发工具,在支持多种数据库、多个云环境的前提下,推出了永久免费的个人版和带有企业级管控、安全协作的企业版,满足企业最高的数据安全合规要求。目前,NineData 已在运营商、金融、制造业、地产、电商等多个行业完成大规模应用实践。如果您感兴趣的话,可以登录官网 https://www.ninedata.cloud/sqldev,立即开始免费使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DNS总结

一、DNS (1)简介 域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。 DNS 协议也是…

谈谈在.NET Core中使用Redis和Memcached的序列化问题

前言在使用分布式缓存的时候,都不可避免的要做这样一步操作,将数据序列化后再存储到缓存中去。序列化这一操作,或许是显式的,或许是隐式的,这个取决于使用的package是否有帮我们做这样一件事。本文会拿在.NET Core环境…

牛客练习赛52-记录

正题 比赛链接:https://ac.nowcoder.com/acm/contest/1084#question 成绩 T1:T1:T1:数数 题目大意 给出nnn,求∑i1n∑j1n(i∗j)\sum_{i1}^n \sum_{j1}^n (i*j)i1∑n​j1∑n​(i∗j) 和 ∏i1n∏j1n(i∗j)\prod_{i1}^n\prod_{j1}^n(i*j)i1∏n​j1∏n​(i∗j) 解题…

Java 并发总结——高并发与同步锁

一、高并发同步锁 (1)ThreadLocal threadLocal为每个线程维护一个本地变量。 采用空间换时间,它用于线程间的数据隔离,为每一个使用该变量的线程提供一个副本,每个线程都可以独立地改变自己的副本,而不会…

Windows Developer Day - Windows AI Platform

本次 Windows Developer Day,最值得期待的莫过于 Windows AI Platform 了,可以说是千呼万唤始出来。观看直播的开发者们,留言最多的也是 Windows AI Platform。下面结合微软提供的展示过程,文档和 Git Sample 来详细分析一下。基础…

NOI.AC-random【期望概率,统计】

正题 题目链接:http://noi.ac/contest/235/problem/227 题目大意 两个nnn长度为AAA和BBB的序列,从两个序列中各随机取一个数出来,求期望哪个序列的数大。 解题思路 总共有n∗nn*nn∗n种情况,每种情况等概率,排序用指针统计一下…

Java 并发总结——线程池

一、线程池 在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程 (1)线程池的作用 1、降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 2、提高响应速度。当任务到达时&am…

EF Core:一统SQL和NoSQL数据库

推出EF Core的初衷之一,就是开发出一种可在很少甚至不更改代码的情况下使用SQL和NoSQL数据库的模型。Microsoft正向此目标迈出第一步,发布了用于Azure Cosmos DB的实验性EF提供程序(provider)。据EF 2.1路线图介绍:Cos…

P3470 [POI2008]BBB-BBB【线段树,贪心】

正题 题目链接:https://www.luogu.org/problem/P3470 题目大意 一个−-−序列,表示111,−-−表示−1-1−1。sis_isi​表示到第iii个的前缀和,要求 qsnp且qsi≥0(i∈[1..n])qs_np且qs_i\geq 0(i\in[1..n])qsn​p且qsi​≥0(i∈[1..n]) 然后…

Java 并发总结——进程与线程

一、进程与线程 (1)线程与进程 进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。进程实体由程序段, 数据段 PCB(进程控制块)组成。 线程可以看做轻量级进程,…

.NET Core使用skiasharp文字头像生成方案(基于docker发布)

一、问题背景目前.NET Core下面针对于图像处理的库微软并没有集成,在.NET FrameWork下我们已经习惯使用System.Drawing类库做简单的图像处理,到了.NET Core下一脸懵逼的我,只能百度谷歌看看有没啥解决方案,好在网上资料也多&#…

jzoj6375-华灵「蝶妄想」【结论题】

正题 题目大意 n∗mn*mn∗m填(((或者)))。求一个方案使得最多的行和列匹配。 解题思路 我们先考虑nnn或mmm为奇数,那么显然奇数的肯定不必配,那么就只需要考虑行或列即可。 若nnn和mmm都为偶数时 我们发现在边边的行列不可能都匹配上,那就…

C# - Span 全面介绍:探索 .NET 新增的重要组成部分

假设要公开特殊化排序例程,以就地对内存数据执行操作。可能要公开需要使用数组的方法,并提供对相应 T[] 执行操作的实现。如果方法的调用方有数组,且希望对整个数组进行排序,这样做就非常合适。但如果调用方只想对部分数组进行排序…

Java 并发总结——AQS

一、AQS Java并发包(JUC)中提供了很多并发工具,ReentrangLock、Semaphore、CountDownLatch,它们的实现都用到了一个共同的基类——AbstractQueuedSynchronizer,简称AQS。 AQS是一个用来构建锁和同步器的框架&#xf…

P4427-[BJOI2018]求和【LCA】

正题 题目大意:https://www.luogu.org/problem/P4427 题目大意 一棵树,每次给一条路径,求路径上每个点的深度的kkk次方的和。 解题思路 路径上分成两条深度连续的链,所以我们可以先预处理出kkk次方的前缀和。 然后LCALCALCA就好了。 code…

C#中DateTime的缺陷与代替品DateTimeOffset

C#中的DateTime在逻辑上有个非常严重的缺陷:> var d DateTime.Now;> var d2 d.ToUniversalTime();> d d2false> d.Equals(d2);false在C#交互模式中输入以上代码,可以发现尽管一个是本地时间(d),一个是U…

Java SSL与TLS客户端证书配置

一、TLS安全概念 (1)PKI PKI是 Public Key Infrastructure的简称,意思是公钥基础设施。 公钥基础设施是提供公钥加密和数字签名服务的系统或平台,目的是为了管理密钥和证书。通过证书和秘钥来确认通讯双方是否可信任。 &#x…

P3901-数列找不同【模拟】

正题 题目链接:https://www.luogu.org/problem/P3901 题目大意 一个序列AAA&#xff0c;每次询问一个区间求这个区间的数是否各不相同。 解题思路 用lastilast_ilasti​表示前一个与iii相同数的位置。 然后Lastimax{lastj}(j<i)Last_imax\{last_j\}(j<i)Lasti​max{la…

Java RSA私钥的格式pkcs1和pkcs8、PrivateKey转换

&#xff08;&#xff09;一、私钥格式 &#xff08;1&#xff09;pkcs1 格式&#xff1a; -----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY----- &#xff08;2&#xff09;pkcs8 格式&#xff1a; -----BEGIN PRIVATE KEY----- ... -----END PRIVATE KE…

重磅消息-Service Fabric 正式开源

微软的Azure Service Fabric的官方博客在2017.3.24日发布了一篇博客 Service Fabric .NET SDK goes open source &#xff0c;介绍了社区呼声最高的Service Fabric开源的情况以及当前的情况&#xff0c;当时开源了Service Fabric的.NET SDK部分&#xff0c;社区一直在期盼着Ser…