首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql select阻塞ddl

基础概念

MySQL中的SELECT语句用于从数据库表中检索数据。当一个SELECT查询在执行时,如果它需要访问的数据被其他事务锁定,那么这个查询可能会被阻塞,直到锁被释放。DDL(Data Definition Language)语句,如CREATE TABLEALTER TABLE等,用于定义或修改数据库结构。在执行DDL操作时,MySQL可能会锁定相关的表,以防止数据不一致。

相关优势

  • 数据一致性:DDL操作通常会锁定表,确保在修改表结构时不会有数据变更,从而保持数据的一致性。
  • 简单易用:DDL语句语法简单,易于理解和使用。

类型

  • 表级锁:在执行DDL操作时,MySQL可能会锁定整个表,阻止其他事务对该表的读写操作。
  • 元数据锁(MDL):MySQL 5.5引入了元数据锁,用于保护表的元数据。在执行DDL操作时,会获取MDL锁,阻止其他事务修改表结构。

应用场景

  • 数据库迁移:在迁移数据库时,可能需要修改表结构,这时会用到DDL语句。
  • 表结构优化:为了提高查询性能,可能需要修改表结构,如添加索引、修改列类型等。

遇到的问题及原因

当执行SELECT查询时,如果表正在进行DDL操作,SELECT查询可能会被阻塞。这是因为DDL操作会锁定表或表的元数据,阻止其他事务访问。

解决方法

  1. 等待DDL操作完成:如果DDL操作很快完成,可以等待其完成后再执行SELECT查询。
  2. 优化DDL操作:尽量减少DDL操作的持续时间,例如在低峰期执行DDL操作。
  3. 使用在线DDL:某些存储引擎(如InnoDB)支持在线DDL操作,可以在不阻塞读写操作的情况下修改表结构。例如,使用ALGORITHM=INPLACE选项:
  4. 使用在线DDL:某些存储引擎(如InnoDB)支持在线DDL操作,可以在不阻塞读写操作的情况下修改表结构。例如,使用ALGORITHM=INPLACE选项:
  5. 分阶段执行DDL:如果DDL操作非常复杂,可以考虑分阶段执行,减少对其他事务的影响。
  6. 使用备份和恢复:如果DDL操作影响较大,可以考虑先备份数据,执行DDL操作后再恢复数据。

示例代码

假设有一个表users,我们需要添加一个新列email

代码语言:txt
复制
-- 使用在线DDL
ALTER TABLE users ADD COLUMN email VARCHAR(255) ALGORITHM=INPLACE;

参考链接

通过以上方法,可以有效解决SELECT查询被DDL操作阻塞的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

MySQL Online DDL与DML并发阻塞关系总结

MySQL DDL操作执行的三种方式 1,INPLACE,在进行DDL操作时,不影响表的读&写,可以正常执行表上的DML操作,避免与COPY方法相关的磁盘I/O和CPU周期,从而最小化数据库的总体负载。...最小化负载有助于在DDL操作期间保持良好的性能和高吞吐量。 2,COPY,不允许并发执行过多个DDL,执行过程中表不允许写但可读。...过程是通过创建一个新结构的临时表,将数据copy到临时表,完成后删除原表,重命名新表的方式,需要拷贝原始表, 3,INSTANT,从 MySQL 8.0.12 开始被引入并默认使用。...以下是MySQL 5.7版本中各种DDL操作的执行方式,总结一下: 1,如果DDL的执行方式是InPlace = YES ,那么改DDL的执行会支持并发DML,不会影响表的增删查改,   1.1,如果...对IO和CPU等资源的消耗 2,如果DDL的执行方式是InPlace = NO,那么改DDL的执行期间表只读,阻塞写(增删改),同时需要考虑对IO和CPU等资源的消耗 3,如果是INSTANT方式,类似于

1K10
  • 技术分享 | 一招解决 MySQLDDL阻塞的问题

    ---- 背景 之前碰到客户咨询定位 DDL 阻塞的相关问题,整理了一下方法,如何解决 DDL阻塞的问题。下面,就这个问题,整理了一下思路: 怎么判断一个 DDL 是不是被阻塞了?...当 DDL阻塞时,怎么找出阻塞它的会话? 1. 如何判断一个 DDL 是不是被阻塞了?...所以,碰到类似情况,我们一般都会 Kill 阻塞 DDL 的会话。 2. 怎么知道是哪些会话阻塞DDL?...sys.schema_table_lock_waits 是 MySQL 5.7 引入的,用来定位 DDL阻塞的问题。 针对上面这个情况。...定位导致 DDL阻塞的会话,常用的方法如下:sys.schema_table_lock_waits select sql_kill_blocking_connection from sys.schema_table_lock_waits

    26210

    MySQL Online DDL

    作者:黄稚禹 Online DDL in MySQL5.5 历史上看,MySQL 在 2007 年就完成了在线索引接口的设计。...MySQL5.6 出现之前(5.5 版本及之前版本),MySQL 数据库长期被吐槽的原因之一(特别是 Oracle DBA) MySQL5.5 版本及之前版本的 DDL 实现方式: 上图不难看出,5.5...虽然在 MySQL5.5 版本中增加了 IN-Place 方式,但依然会阻塞 INSERT、UPDATE、DELETE 操作 Online DDL in MySQL5.6 MySQL5.5 中对添加索引操作引入了新特性...Fast Index Create(FIC 特性),在 MySQL5.6 中,开始支持更多的 alter table 类型操作来避免 copy data,同时支持了在线上 DDL 的过程中不阻塞 DML...但并不是所有的 DDL 操作都支持在线操作,这里附上 MySQL 官方文档对于 DDL 操作的总结: http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html

    7.8K22

    MySQLDDL和DML

    4,DDL:操作数据库 我们先来学习DDL来操作数据库。而操作数据库主要就是对数据库的增删查操作。...使用数据库 USE 数据库名称; 查看当前使用的数据库 SELECT DATABASE(); 运行语句效果如下: 5,DDL:操作表 操作表也就是对表进行增(Create)删(Retrieve...5.1 查询表 查询当前数据库下所有表名称 SHOW TABLES; 我们创建的数据库中没有任何表,因此我们进入mysql自带的mysql数据库,执行上述语句查看 查询表结构 DESC 表名称...6.1 navicat概述 Navicat for MySQL 是管理和开发 MySQL 或 MariaDB 的理想解决方案。...…; INSERT INTO 表名 VALUES(值1,值2,…),(值1,值2,…),(值1,值2,…)…; 练习 为了演示以下的增删改操作是否操作成功,故先将查询所有数据的语句介绍给大家: select

    23230

    MySQL 5.7 特性:Online DDL

    本文详细解释 MySQL DDL 的原理,以及尽可能减少 DDL 对业务的影响的办法。 MySQL DDL 的方法 MySQLDDL 有很多种方法。...gh-ost 参考其他的文章 MySQL DDL 的使用注意事项 MySQL 在大型表上的 DDL 会带来耗时较久、负载较高、额外空间占用、MDL、主从同步延时等情况。需要特别引起重视。...如果使用的是 MySQL 自带的 DDLMySQL 5.7 可以开启 DDL 监控,使用以下语句查看 DDL 执行进度: SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED...语句,以及所有在该 DDL 语句之后的读写事务,都会阻塞并等待之前的读写事务完成,导致整个实例处于不可用状态。...如果发生了 warting for metadata lock 导致的阻塞,一般有以下三种处理方法: 耐心等待之前的事务全部执行完成 将之前未执行完成的事务全部 kill 掉 kill 掉 DDL 语句

    7.9K142

    MySQL之Online DDL过程

    // MySQL之Online DDL过程 // 昨天内容中说了不同类型的DDL操作所采用的的执行方法,以及Online DDL对系统空间的依赖,今天我们说说Online DDL的操作过程,让大家有一个更加直观的认识...01 Online DDL的过程 从官方文档上看,online ddl操作的执行过程一般被分为3个阶段,如下: 阶段1:初始化阶段(准备阶段) 在初始化阶段,服务器将考虑存储引擎功能,语句中指定的操作以及用户指定的...02 Online DDL失败的情况 昨天的文章中说道,Online DDL失败的情况没有给出样例,但是官方文档上给出了可能失败的几种情况: 1、手工指定的algorithm和存储引擎中的算法出现冲突...的一些限制 1、使用lock=none模式的时候,不允许有外键约束,如果表中有外键的时候,使用Online DDL会出现一些问题 2、持有元数据锁的其他事务可能导致Online DDL阻塞,Online...√ 2、提前准备好故障报告,直接在线上进行变更,该方法纯属娱乐:)× 相关文章: 大表Online-DDL操作问题初探 MySQL之Online DDL再 有帮助的话还希望点下再看哈

    2.6K21

    MySQL 案例:如何监控DDL

    背景 经常会有用户在咨询大表 DDL 的进度,预估时间等信息,其实依靠经验来做判断的话,比较容易出现误差,而且也和评估人的实际评估手段有较大的关系。...事实上 MySQL 本身就有 DDL 的监控手段吗,只是默认情况没有进行开启。 实践一下 测试环境使用了腾讯云数据库 MySQL 5.7,官方的 MySQL 8.0,5.7 版本基本同理。...预估时间的时候,可以参考如下语句进行简单的估算: mysql> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM performance_schema.events_stages_current...;select sleep(5);SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM performance_schema.events_stages_current...实际上 DDL 也可以使用 Online DDL 工具来操作,本身 gh-ost 工具也会展示操作的进度。

    1.6K90

    MySQL DDL发展史

    DDL发展 DDL online DDL 工具化时代 1、DDL(锁表阶段) ALGORITHM=COPY ALGORITHM=inplace ALTER TABLE xxxx ADD xxx, ALGORITHM...关键字:LOCK LOCK=NONE DDL期间允许dml并发 LOCK=SHARED 写操作加锁 LOCK=DEFAULT mysql自己去判断是否加锁,原则是是少加锁 LOCK=EXCLUSIVE...在开头和结尾也是有两个锁的,所以在执行online DDL前需要确认当前是否有正在执行的关于这个表的大事务,防止阻塞开头的锁获取 row_log就是存放增量的地方, innodb_tmpdir参数(5.6.29...tmpdir的空间不足 innodb_online_alter_log_max_size参数,如果增量大小超过这个参数会报错,DB_ONLINE_LOG_TOO_BIG ,默认128M 如何查看进度: 在MySQL...WRITE之后还是可以执行DROP操作的 无论RENAME TABLE和DML操作谁先执行,被阻塞后RENAME TABLE总是优先于DML被执行 gh-ost的bug(源自姜老师公众号,简单描述下)

    1K20
    领券