安全、高效的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,立即开始免费使用。
相关文章:
安全、高效的MySQL DDL解决方案
MySQL作为目前应用最广泛的开源关系型数据库,是许多网站、应用和商业产品的主要数据存储。在生产环境,线上数据库常常面临着持续的、不断变化的表结构修改(DDL),如增加、更改、删除字段和索引等等。其中一些DDL操作在M…...
100GPTS计划-AI学术AcademicRefiner
地址 https://chat.openai.com/g/g-LcMl7q6rk-academic-refiner https://poe.com/AcademicRefiner 测试 减少相似性 增加独特性 修改http://t.csdnimg.cn/jyHwo这篇文章微调 专注于人工智能、科技、金融和医学领域的学术论文改写,秉承严格的专业和学术标准。 …...
k8s 中部署Jenkins
创建namespace apiVersion: v1 kind: Namespace metadata:name: jenkins创建pv以及pvc kind: PersistentVolume apiVersion: v1 metadata:name: jenkins-pv-volumenamespace: jenkinslabels:type: localapp: jenkins spec:#storageClassName: manualcapacity:storage: 5Giacc…...
Spring Cloud和Zookeeper的集成,构建高可扩展的分布式系统
引言 构建高可扩展的分布式系统是现代应用程序开发中的重要挑战之一。在分布式系统中,负载均衡和分布式锁是两个关键问题。本文将介绍如何使用Spring Cloud和Zookeeper集成来实现高可扩展的分布式系统,并分析其负载均衡原理和分布式锁的应用。 1. 分布…...
【唐山海德教育】安全员c证怎么考
1、注册地在本市的施工单位在职“三类人员”可申请参加安全生产考核; 2、职业道德良好,身体健康,年龄不超过60周岁(法定代表人除外); 3、筑施工企业专职安全生产管理人员需有中专(含高中、中技…...
MySQL是如何保证数据不丢失的?
文章目录 前言Buffer Pool 和 DML 的关系DML操作流程加载数据页更新记录 数据持久化方案合适的时机刷盘双写机制日志先行机制日志刷盘机制Redo Log 恢复数据 总结 前言 上篇文章《InnoDB在SQL查询中的关键功能和优化策略》对InnoDB的查询操作和优化事项进行了说明。但是&#…...
CUMT--Java复习--泛型与集合
目录 一、泛型 1、概述 2、通配符 3、有界类型 二、集合 1、概述 2、迭代器接口 三、集合类 1、Collection接口 2、List接口 3、Set接口 4、Queue接口 5、Map接口 四、集合转换 五、集合工具类 一、泛型 1、概述 从JDK5.0开始,Java引入泛型类型&…...
Android 权限申请
在Android中,从Android 6.0(API级别23)开始,应用在运行时需要动态申请权限。以下是一些步骤来动态申请权限: 在应用的清单文件(AndroidManifest.xml)中声明需要的权限。例如,如果应…...
R语言【base】——invisible将控制台的输出模式调整为隐藏,只允许赋值后输出,返回对象的(临时)不可见副本
Package base version 4.3.2 invisible(x NULL) 参数【x】:一个任意的 R 对象,默认为 NULL。 如果希望函数返回的值可以赋值,但在未赋值时不打印,则可以使用该函数。 f <- function(x){if (x){return (x)} else {return (in…...
LA@线性代数学习总结@主要对象和问题@思想方法
文章目录 线性代数研究对象主要问题联系核心概念核心定理 核心操作和运算基础高级小结 性质和推导方法问题转换为线性方程组求解问题验证和推导性质定理 线性代数研究对象 线性代数的研究对象主要是行列式和矩阵(向量)矩阵这种对象可以做的操作和运算很多,特别是方阵,它们的计…...
VMware克隆虚拟机
要求:利用模板虚拟机hadoop100,克隆出hadoop101虚拟机。 1、鼠标右键点击已存在的模板虚拟机hadoop100 --> 管理 --> 克隆 2、选择克隆自虚拟机中的当前状态 3、创建完整克隆 4、修改虚拟机名称、位置 5、等待克隆完成后,则成功克隆出…...
C语言中常见的关键字
一、数据类型关键字(20个) 基本数据类型(5个) void:声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果 char:字符型类型数据,属于整型数据的一种 intÿ…...
新型智慧视频监控系统:基于TSINGSEE青犀边缘计算AI视频识别技术的应用
边缘计算AI智能识别技术在视频监控领域的应用有很多。这项技术结合了边缘计算和人工智能技术,通过在摄像头或网关设备上运行AI算法,可以在现场实时处理和分析视频数据,从而实现智能识别和分析。目前来说,边缘计算AI视频智能技术可…...
智能优化算法应用:基于梯度算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于梯度算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于梯度算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.梯度算法4.实验参数设定5.算法结果6.参考文献7.MA…...
如何使用Docker搭建青龙面板并结合内网穿透工具发布至公网可访问
文章目录 一、前期准备本教程环境为:Centos7,可以跑Docker的系统都可以使用。本教程使用Docker部署青龙,如何安装Docker详见: 二、安装青龙面板三、映射本地部署的青龙面板至公网四、使用固定公网地址访问本地部署的青龙面板 正文…...
fastjson1.2.24 反序列化漏洞(CVE-2017-18349)分析
FastJson在< 1.2.24 版本中存在反序列化漏洞,主要原因FastJson支持的两个特性: fastjson反序列化时,JSON字符串中的type字段,用来表明指定反序列化的目标恶意对象类。fastjson反序列化时,字符串时会自动调用恶意对…...
Linux中history使用(过滤,显示时间,查找)
显示历史命令 history 显示最后几条执行命令 history 5 显示history记录中命令执行时间 export HISTTIMEFORMAT"%F %T " 显示命令中有某些内容的最后几条执行命令 history | grep key | tail -n 2...
issue阶段的选择电路的实现
1-of-M的仲裁电路 为什么要实现oldest-first 功能的仲裁呢? 这是考虑到越是旧的指令,和它存在相关性的指令也就越多,因此优先执行最旧的指令,则可以唤醒更多的指令,能够有效地提高处理器执行指令的并行度,而且最旧的指…...
BearPi Std 板从入门到放弃 - 后天篇(3)(ESP8266透传点灯)
简介 电脑搭建一个TCP Server, ESP8266 串口设置好透传模式, 再由TCP Server发送指令控制灯的亮灭; 开灯指令: led_on回车 ; 关灯指令: led_off回车 主芯片: STM32L431RCT6 LED : PC13 \ 推挽输出即可 \ 高电平点亮 串口: Usart1 / LPUART E…...
【Linux】macOS下使用scp命令编写脚本上传文件至服务器
使用时需要输入服务器密码 #!/bin/bash# 检查传递给脚本的参数数量 if [ "$#" -ne 2 ]; thenecho "Usage: $0 <本地文件路径> <服务器文件夹路径>"exit 1 fi# 接收命令行参数 local_file"$1" remote_path"$2"# 定义远程服…...
难以置信:WINDOWS11真的取消了助记符
助记符是个好东西,记住了非常的方便。这几天升级到WINDOWS11之后,发现助记符被全面取消!真是难以置信! 现在WIN11越来越象MAC,MAC好用吗?当然不好用。 其实WIN11完全可以开发两套界面,各取所需。…...
使用VSC从零开始Vue.js——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务3:数据可视化
使用Visual Studio Code(VSC)进行Vue开发非常方便,下面是一些基本步骤: 一、下载和安装Vue 官网下载地址Download | Node.js Vue.js是基于Node.js的,所以首先需要安装Node.js,官网下载地址:No…...
企业直聘招聘人才求职系统招聘会小程序系统源码
技术栈: 端 原生小程序开发 后端php7.2 数据库mysql5.6 主要功能: 企业入住 ,企业直聘 个人实名认证,人才求职 发布线上招聘会 企业招聘邀请 个人简历置顶 刷新 浏览足迹浏览 附近 招聘信息查看...
大型语言模型:SBERT — Sentence-BERT
slavahead 一、介绍 Transformer 在 NLP 方面取得了进化进步,这已经不是什么秘密了。基于转换器,许多其他机器学习模型已经发展起来。其中之一是BERT,它主要由几个堆叠的变压器编码器组成。除了用于情感分析或问答等一系列不同的问题外&#…...
高效编写软件测试报告的关键技巧
引言: 软件测试报告是测试团队与开发团队之间沟通的重要工具,它记录了测试过程中的发现、问题和建议。一个清晰、准确、高效的软件测试报告可以帮助开发团队更好地理解测试结果,并及时修复问题。本文将介绍一些高效编写软件测试报告的关键技巧…...
编写CI/CD自动化部署脚本
编写CI/CD自动化部署脚本 什么是CI/CD CI/CD 是现代软件开发过程中的关键实践,它包含两个缩写: CI,或者持续集成(Continuous Integration)CD,可以指持续交付(Continuous Delivery)…...
Pandas实践_分类数据
文章目录 一、cat对象1.cat对象的属性2.类别的增加、删除和修改 二、有序分类1.序的建立2.排序和比较 三、区间类别1.利用cut和qcut进行区间构造2.一般区间的构造3.区间的属性与方法 一、cat对象 1.cat对象的属性 在pandas中提供了category类型,使用户能够处理分类…...
git的使用思维导图
源文件在github主页:study_collection/cpp学习/git at main stu-yzZ/study_collection (github.com)...
Qt 软件界面点击QCombBox控件,造成整个界面移位
Qt 软件界面点击QCombBox控件,造成整个界面移位 最近项目中,遇到了一个问题,在绘制界面的时候,使用了QCombBox控件,在点击QCombBox控件下拉中的item时,会造成整个界面移位的现象。 我重写了下面三个事件函…...
AI Native工程化:百度App AI互动技术实践
作者 | GodStart 导读 随着AI浪潮的兴起,越来越多的应用都在利用大模型重构业务形态,在设计和优化Prompt的过程中,我们发现整个Prompt测评和优化周期非常长,因此,我们提出了一种Prompt生成、评估与迭代的一体化解决方案…...
烟台建网站公司哪家好/谷歌浏览器 安卓下载2023版
我有一个Manager类,该类将数据保存在SQL表中,并从SQL表中获取结果并测试这些数据.当我运行程序时,将显示一个获取ID和密码的框架,如果它们正确,则另一个框架将但是我不知道为什么它只是测试SQL表的最后一行?我的意思是如果我用除最后一行以外的其他ID和密码设置那些…...
ftp怎么重新上传网站/重庆镇海seo整站优化价格
Spring Boot 介绍及项目搭建(核心功能、起步依赖分析,自动配置解析)。 1. Spring Boot 介绍 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配…...
网站建站网站设计/网络营销的发展现状如何
0.前言随机访问迭代器: vector、string、dequeSTL的一个革命性的方面就是它的计算复杂性保证 条款01:慎重选择容器类型 c提供的容器:标准STL序列容器:vector、string、deque、list标准STL关联容器:set、multiset、map、multimap非标准STL容器:…...
怎么做国外的网站 卖东西/线上宣传渠道和宣传方式
昨天在网上转了一下,发现SONY已经开放了PSV的SDK(SDK PlayStationSuite SDK)了,目前它还处于测试阶段,正式版的SDK将于2012年下半年发布,正式版的使用费用为99美元/年,开发者需要通过PS商店才能…...
高端网站建设 引擎技网络/自学seo能找到工作吗
print_r - 打印关于变量的易于理解的信息。 bool print_r ( mixed $expression [, bool $return ] ) Note: 参数 return 是在 PHP 4.3.0 的时候加上的 print_r() 显示关于一个变量的易于理解的信息。如果给出的是 string、integer 或 float,将打印变量值本身。如果给…...
wordpress登录密码错误也不报错/百度推广竞价是什么意思
2019年高考结束最后一门英语考试的时候,王恒杰这个懂得感恩的大男孩被我们记住了。在高考英语结束后,所有人都放下了心中的担心,轻轻松松的走出了考场。此刻王恒杰也是万千学子中的一名,但是,他之后的举动却让他在众多…...