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

这篇具有很好参考价值的文章主要介绍了安全、高效的MySQL DDL解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

安全、高效的MySQL DDL解决方案,SQL 开发,云数据库技术,mysql,数据库,云计算,sql,dba,oracle,数据库开发

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执行的大致流程如下:

安全、高效的MySQL DDL解决方案,SQL 开发,云数据库技术,mysql,数据库,云计算,sql,dba,oracle,数据库开发

活动截止时间

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

数据源

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

安全、高效的MySQL DDL解决方案,SQL 开发,云数据库技术,mysql,数据库,云计算,sql,dba,oracle,数据库开发

规范与流程

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

安全、高效的MySQL DDL解决方案,SQL 开发,云数据库技术,mysql,数据库,云计算,sql,dba,oracle,数据库开发

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

安全、高效的MySQL DDL解决方案,SQL 开发,云数据库技术,mysql,数据库,云计算,sql,dba,oracle,数据库开发

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

安全、高效的MySQL DDL解决方案,SQL 开发,云数据库技术,mysql,数据库,云计算,sql,dba,oracle,数据库开发

OnlineDDL自适应规则配置:

安全、高效的MySQL DDL解决方案,SQL 开发,云数据库技术,mysql,数据库,云计算,sql,dba,oracle,数据库开发

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

实战测试

1. 创建SQL任务:

安全、高效的MySQL DDL解决方案,SQL 开发,云数据库技术,mysql,数据库,云计算,sql,dba,oracle,数据库开发

2. 执行 DDL 语句:

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

安全、高效的MySQL DDL解决方案,SQL 开发,云数据库技术,mysql,数据库,云计算,sql,dba,oracle,数据库开发

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

安全、高效的MySQL DDL解决方案,SQL 开发,云数据库技术,mysql,数据库,云计算,sql,dba,oracle,数据库开发

3. 提交 SQL

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

安全、高效的MySQL DDL解决方案,SQL 开发,云数据库技术,mysql,数据库,云计算,sql,dba,oracle,数据库开发

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

安全、高效的MySQL DDL解决方案,SQL 开发,云数据库技术,mysql,数据库,云计算,sql,dba,oracle,数据库开发

4. 执行信息

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

安全、高效的MySQL DDL解决方案,SQL 开发,云数据库技术,mysql,数据库,云计算,sql,dba,oracle,数据库开发

从上面的例子看到,如果执行的 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,立即开始免费使用。文章来源地址https://www.toymoban.com/news/detail-762539.html

到了这里,关于安全、高效的MySQL DDL解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • BNetDisk:一个安全高效、基于区块链的云存储解决方案

    项目地址:https://gitcode.com/SunRain/BNetDisk BNetDisk 是一个创新性的开源项目,它利用区块链技术构建了一个去中心化的云存储平台。这个项目旨在提供更安全、透明且高效的个人和企业数据存储服务,改变传统云存储模式。 BNetDisk 的核心理念是通过区块链的分布式特性,将用户的

    2024年04月11日
    浏览(36)
  • 阿里云 MongoDB 7.0 正式发布,带来更加强大、高效、安全的数据库解决方案

    2024年1月10日,阿里云MongoDB 7.0版本正式发布,带来了诸多创新功能和显著改进,旨在提升性能、增强数据管理能力,并为开发者提供更丰富、更灵活的工具集。无论是在大规模数据处理、实时分析还是在构建高性能应用方面,MongoDB 7.0都无疑是值得期待和信赖的选择。 ![在这

    2024年01月19日
    浏览(55)
  • 低代码助力ERP开发:实现负担得起、灵活与高效的解决方案

    企业资源规划工具或 ERP 不再为大型国际企业所保留。如今,从 SME 到大型企业,各种规模的企业都使用 ERP 软件来管理其核心流程。全球ERP 软件市场每年价值超过 250 亿美元,年增长率为 10% 到 20%。如此巨大增长的原因是什么? ERP 系统将您所有不同的工具/应用程序(包括库

    2024年02月19日
    浏览(68)
  • 探索前沿Web开发框架:uiadmin - 简单、高效的后台管理UI解决方案

    项目地址:https://gitcode.com/ijry/uiadmin Uiadmin是一个基于Vue.js和Element-UI的现代化、高度可定制的后台管理界面模板。它旨在简化开发者构建后台管理系统的工作,提供开箱即用的功能,让您可以快速地搭建出美观且功能丰富的管理界面。 基于Vue.js 作为一款由Google支持的前端框架

    2024年04月10日
    浏览(41)
  • WEB安全之XSS漏洞与SQL注入漏洞介绍及解决方案

    这篇文章把Xss跨站攻击和sql注入的相关知识整理了下,比较适合初学者观看。 对于防止sql注入发生,我在这里用简单拼接字符串的注入及参数化查询,如果大家对这个系列的内容感兴趣,可以在评论区告诉我! XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者

    2024年02月07日
    浏览(44)
  • MySQL错误sql_mode=only_full_group_by完美解决方案

    mysql是高版本,当执行group by时,select的字段不属于group by的字段的话,sql语句就会报错。 错误提示:this is incompatible with sql_mode=only_full_group_by 1.查询数据库版本: SELECT VERSION(); 2.查看sql_mode的语句: select @@GLOBAL.sql_mode; 3.临时解决方案: 去掉ONLY_FULL_GROUP_BY,重新设置值。 SET

    2023年04月09日
    浏览(33)
  • 【MySQL异常解决】MySQL执行SQL文件出现【Unknown collation ‘utf8mb4_0900_ai_ci‘】的解决方案

    从服务器MySQL中导出数据为SQL执行脚本后,在本地电脑执行导出的SQL脚本, 报错: Unknown collation ‘utf8mb4_0900_ai_ci‘ 打开SQL脚本,查看 utf8mb4_0900_ai_ci ,这是字段的字符集。 1、MySQL 版本不一样; 2、utf8mb4_0900_ai_ci 在 MySQL 8 以下是不被支持的,检查发现本地数据库为5.7,

    2024年02月16日
    浏览(33)
  • 【大数据开发运维解决方案】华为FusionInsight大数据Kibana对接安全模式Elasticsearch方案

    博主所在单位使用的大数据集群为华为FusionInsight,本篇文章主要介绍的是如何将开源Kibana对接到华为安全模式下Elasticsearch。同样,本篇文章适用其他版本Kibana对接安全模式Elasticsearch。 注意事项:所有配置项:后边必须有个空格。 Kibana提供了图形化操作界面,通过可视化界

    2023年04月08日
    浏览(34)
  • Mysql 报 java.sql.SQLException:null,message from server:“Host ‘‘ is not allowed to connect.解决方案

    这个错误i是因为mysql数据库没有放开远程访问权限引起的,以mysql8为例 首先进入Mysql 安装目录,然后输入命令: mysql -uroot -p ;具体参见下图: 再输入 use mysql; 回车执行, 接着输入, show tables; 回车执行 输入, select host from user; 回车执行,这里特别说明一下,我这个是已经放

    2024年04月28日
    浏览(34)
  • mysql 8.0 找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案

    sql_mode=only_full_group_by问题产生原因:MySQL 5.7.5及以上功能依赖检测功能。如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下),MySQL将拒绝选择列表,HAVING条件或ORDER BY列表的查询引用在GROUP BY子句中既未命名的非集合列,也不在功能上依赖于它们。 1、navcat中新建查询: select @@

    2024年01月23日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包