Mysql Online DDL

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: Mysql Online DDL

  注意:尤其是在大数据量表的DDL操作时,需要特别注意

1.前言:

  1.我们在数据库运维的时候往往要对一张表进行做DDL操作时候,时常会导致库上大量的线程中出现”waitting for metedata lock“状态,导致大量的并发问题,其中包括对数据库不能做DML操作(在DDL操作时)。

  2.因此,mysql5.6中的onlie ddl特性解决了ddl锁表的问题,保证了在进行表变更的时候,不会堵塞业务上的读写。

2.Online DDL 划分:

  1.锁与并发度划分:先说一下与DML语句的并发度方面来说明一下DDL语句的分类,其主要分为下面几类,可以在ddl语句中通过LOCK关键字来指定DDL期间加锁程度。其可选择的值如下:

含义
None 允许并发查询和DML
Shared 允许并发查询,阻止DML操作,适用于数据仓库等可以允许数据写入延迟的场景
Default 由数据库决定选择最大并发的模式,指定该类型与不指定LOCK关键字含义相同
Exclusive 阻塞查询和DML

 

     默认的情况下,MySQL在执行DDL操作期间尽可能少的使用锁,以提高并发。当然也可以通过LOCK子句,来指定更加严格的锁。但是,如果LOCK子句指定的锁定级别低于特定DDL操作所允许的限制级别,则语句将失败,并出现错误。


   2.是否拷贝数据划分:通过ALGORITHM关键字进行指定,值有如下几种:

copy 采用拷表方式进行表变更,该过程中不允许并发DML
inplace 该模式避免进行表的拷贝,而是在让引擎层就地重新生成表,也就是仅需要进行引擎层数据改动,不涉及Server层。在操作的准备和执行阶段,表上的排他元数据锁可能会被短暂地占用。通常,支持并发DML,且不需要像COPY一样占用大量的磁盘I/O和CPU,减少了数据库负载。同时减少了buffer pool的使用,避免 buffer pool 中原有的查询缓存被大量删除而导致的性能问题.
instant 该操作仅仅修改元数据。在准备和执行期间,表上没有独占的元数据锁,并且表数据不受影响,因此操作是即时的。允许并发DML。目前仅支持在表最后增加新列;
default 系统决定,选择最优的算法执行DDL

 

  如果没有指定ALGORITHM子句,系统决定,选择最优的算法执行DDL。 用户可以选用上述算法来执行,但本身收到DDL类型限制,如果指定的算法无法执行DDL,则ALTER操作会报错

 

3.Online DDL执行流程:

根据官网上的文档说法,Online DDL的执行流程主要分为三个阶段:

  1.initialization阶段:

  在初始化阶段,服务器会根据存储引擎能力、语句中指定的操作以及用户指定的 ALGORITHM 和 LOCK 选项来确定操作期间允许的并发量.在此阶段,使用共享的可升级元数据锁来保护当前表定义。(也就是说再该阶段会获取一个shared lock,该锁是具有升级功能)  

  2.Execution阶段:

  在这个阶段,语句被准备和执行。 shared元数据锁是否升级为独占锁(exclusive metadata lock)取决于初始化阶段评估的因素。 如果需要独占元数据锁,则仅在语句准备期间短暂使用。如果不升级为独占元数据锁,那么shared metadata lock 就会堵塞其他的alter table 的操作,但是不会堵塞DML操作。

  3.Commit Table Definition(提交表定义阶段)

  在提交表定义阶段,元数据锁升级为独占以删除旧表定义并提交新表定义。 一旦被授予,独占元数据锁定的持续时间很短。

 

4.Online DDL各个阶段具体操作:

  1.初始化阶段是用来根据ALGORITHM 和 LOCK 选项进行评估,其目的是为后续的执行阶段中的(prepare阶段和execution阶段)作准备的。

  2.执行阶段:执行阶段其实主要包括两个小阶段(prepare阶段和execution阶段) 

  • Prepare阶段:
  1. 创建新的临时frm文件(与InnoDB无关)
  2. 持有EXCLUSIVE-MDL锁,禁止读写
  3. 根据alter类型,确定执行方式(copy,online-rebuild,online-norebuild)
    假如是Add Index,则选择online-norebuild即INPLACE方式
  4. 更新数据字典的内存对象
  5. 分配row_log对象记录增量(仅rebuild类型需要)
  6. 生成新的临时ibd文件(仅rebuild类型需要)
  • ddl执行阶段:
  1. 降级EXCLUSIVE-MDL锁,允许读写
  2. 扫描old_table的聚集索引每一条记录rec
  3. 遍历新表的聚集索引和二级索引,逐一处理
  4. 根据rec构造对应的索引项
  5. 将构造索引项插入sort_buffer块排序
  6. 将sort_buffer块更新到新的索引上
  7. 记录ddl执行过程中产生的增量(仅rebuild类型需要)
  8. 重放row_log中的操作到新索引上(no-rebuild数据是在原表上更新的)
  9. 重放row_log间产生dml操作append到row_log最后一个Block
  • commit阶段:
    当前Block为row_log最后一个时,禁止读写,升级到EXCLUSIVE-MDL锁
  1. 重做row_log中最后一部分增量
  2. 更新innodb的数据字典表
  3. 提交事务(刷事务的redo日志)
  4. 修改统计信息
  5. rename临时idb文件,frm文件
  6. 变更完成

5.Online DDL的种类和状态

  常见的online ddl 的种类有: 

    索引操作

    主键操作

    列操作

    外键操作

    表操作

    表空间操作

    分区操作

   每个操作里面又包含了很多种类,比如,索引操作中包含新增索引、删除索引等操作,列操作中有新增列、修改列、删除列等等,

 

参考:https://www.cnblogs.com/zmc60/p/14872073.html

 

 

标签: mysql

相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
11月前
|
SQL 存储 关系型数据库
菜鸟之路Day29一一MySQL之DDL
本文《菜鸟之路Day29——MySQL之DDL》由作者blue于2025年5月2日撰写,主要介绍了MySQL中的数据定义语言(DDL)。文章详细讲解了DDL在数据库和表操作中的应用,包括数据库的查询、创建、使用与删除,以及表的创建、修改与删除。同时,文章还深入探讨了字段约束(如主键、外键、非空等)、常见数据类型(数值、字符串、日期时间类型)及表结构的查询与调整方法。通过示例代码,读者可以更好地理解并实践MySQL中DDL的相关操作。
352 11
|
10月前
|
SQL 关系型数据库 MySQL
MySQL 5.6/5.7 DDL 失败残留文件清理指南
通过本文的指南,您可以更安全地处理 MySQL 5.6 和 5.7 版本中 DDL 失败后的残留文件,有效避免数据丢失和数据库不一致的问题。
|
SQL 关系型数据库 MySQL
MySQL DDL(数据定义语言)深度解析
MySQL DDL(数据定义语言)深度解析
|
SQL 监控 关系型数据库
MySQL如何优雅的执行DDL
在MySQL中优雅地执行DDL操作需要综合考虑性能、锁定和数据一致性等因素。通过使用在线DDL工具、分批次执行、备份和监控等最佳实践,可以在保障系统稳定性的同时,顺利完成DDL操作。本文提供的实践和案例分析为安全高效地执行DDL操作提供了详细指导。
620 14
|
SQL 关系型数据库 MySQL
MySQL 更新1000万条数据和DDL执行时间分析
MySQL 更新1000万条数据和DDL执行时间分析
1086 4
|
SQL 存储 关系型数据库
"MySQL增列必锁表?揭秘InnoDB在线DDL,让你的数据库操作飞一般,性能无忧!"
【8月更文挑战第11天】在数据库领域,MySQL凭借其稳定高效的表现深受开发者喜爱。对于是否会在给数据表添加列时锁表的问题,MySQL的行为受版本、存储引擎等因素影响。从5.6版起,InnoDB支持在线DDL,可在改动表结构时保持表的可访问性,避免长时间锁表。而MyISAM等则需锁表完成操作。例如,在使用InnoDB的表上运行`ALTER TABLE users ADD COLUMN email VARCHAR(255);`时,通常不会完全锁表。虽然在线DDL提高了灵活性,但复杂操作或大表变更仍可能暂时影响性能。因此,进行结构变更前应评估其影响并择机执行。
337 6
|
SQL 存储 关系型数据库
MySQL数据库—初识数据库 | DDL语句 | DML语句
MySQL数据库—初识数据库 | DDL语句 | DML语句
209 0
|
SQL 算法 关系型数据库
MySQL Online DDL原理解读
MySQL Online DDL原理解读
|
7月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
485 158

推荐镜像

更多