随笔分类 -  MySQL / DDL

摘要:在线上进行DDL操作时,相对于其可能带来的系统负载,其实,我们最担心的还是MDL其可能导致的阻塞问题。 一旦DDL操作因获取不到MDL被阻塞,后续其它针对该表的其它操作都会被阻塞。典型如下,如阻塞稍久的话,我们会看到Threads_running飙升,CPU告警。 mysql> show proce 阅读全文
posted @ 2025-06-21 00:45 屠魔的少年
摘要:0. 背景 在业务低峰通过pt-osc在线做DDL期间出现死锁,导致业务的SQL被回滚了,对应用不友好。 本案例死锁发生的场景:pt-osc拷贝最后一个chunk-size并且期间其它事务有对原表做insert操作,才会出现本案例的死锁。 1. 先简单介绍一下pt-osc的工作原理 创建一个跟原表表 阅读全文
posted @ 2025-06-21 00:42 屠魔的少年
摘要:本文基于MySQL 8.0测试常用的DDL工具,通过多个维度进行对比分析。基本结论是MySQL原生Online DDL在性能、存储开销和易用性等方面有较大优势,目前在加列等场景可取代pt-osc/gh-ost,在创建索引等场景还需要做进一步优化。 DDL工具实现分析 在MySQL使用过程中,根据业务 阅读全文
posted @ 2025-06-21 00:38 屠魔的少年
摘要:随着 MySQL 版本的不断更新,对 DDL 操作的支持也在不断的完善和更新:比如从 MySQL 5.6 引入 Online DDL ,在 MySQL 5.7 对 Online DDL 进一步完善,到现在的 8.0 版本,则对 DDL 的实现重新进行了设计,比如 DDL 操作支持原子特性,在 MyS 阅读全文
posted @ 2025-06-21 00:14 屠魔的少年
摘要:还是之前的测试Demo 会话1开启了事务并执行了三个操作,但未提交,此时,会话2执行了alter table操作,被阻塞。 session1> begin; Query OK, 0 rows affected (0.00 sec) session1> delete from slowtech.t1 阅读全文
posted @ 2025-06-21 00:10 屠魔的少年
摘要:背景: 作为一个DBA,大表的DDL的变更大部分都是使用Percona的pt-online-schema-change,本文说明下另一种工具gh-ost的使用:不依赖于触发器,是因为他是通过模拟从库,在row binlog中获取增量变更,再异步应用到ghost表的。在使用gh-ost之前,可以先看G 阅读全文
posted @ 2025-06-20 23:27 屠魔的少年
摘要:背景 Online DDL 一直都是 DBA 运维时比较头疼的事,一般都会选择在业务低峰期谨慎的操作,比较常用的几个工具比如 percona pt-online-schema-change , Facebook OSC, 本质上它们都是基于触发器的,简单来讲就是通过数据库的触发器把作用在源表的操作在 阅读全文
posted @ 2025-06-20 22:49 屠魔的少年
摘要:发展历程 MySQL Online DDL 功能从 5.6 版本开始正式引入,发展到现在的 8.0 版本,经历了多次的调整和完善。本文主要就 Online DDL 的发展过程,以及各版本的区别进行总结。其实早在 MySQL 5.5 版本中就加入了 INPLACE DDL 方式,但是因为实现的问题,依 阅读全文
posted @ 2025-06-20 22:47 屠魔的少年
摘要:随着业务系统的快速迭代,对应的记录相关数据的表的结构也在快速的变化。但是,对于数据库来说,很多的表结构变更都是要花费很大代价的,如增删字段、更改字段数据类型等操作。更需要注意的是,对于原生的 MySQL ONLINE DDL (MySQL 5.6开始支持)功能虽然已经很多操作不再阻塞 DML 操作, 阅读全文
posted @ 2025-06-20 22:31 屠魔的少年
摘要:问题 有时候我们会不小心对一个大表进行了 update,比如说写错了 where 条件...... 此时,如果 kill 掉 update 线程,那回滚 undo log 需要不少时间。如果放置不管,也不知道 update 会持续多久。 那我们能知道 update 的进度么? 实验 我们先创建一个测 阅读全文
posted @ 2025-06-20 22:28 屠魔的少年
摘要:问题 我们执行 alter table 语句后,经常面临“跑又跑不完,杀又不敢杀”的窘境。 如果能评估 alter table 的进度就幸福多了。 实验 MySQL官方已经给出了文档:https://dev.mysql.com/doc/refman/5.7/en/monitor-alter-tabl 阅读全文
posted @ 2025-06-20 22:24 屠魔的少年
摘要:一、前言 作为 MySQL DBA,相信我们大家都会对大表变更(大于10G 以上的)比较头疼,尤其是某些 DDL 会锁表,影响业务可持续性。目前通用的方案使用 Percona 公司开源的 pt-osc 工具解决导致锁表的操作,还有一款 github 基于 go 语言开发的 gh-ost。本文主要介绍 阅读全文
posted @ 2025-06-20 21:59 屠魔的少年
摘要:原子 DDL 听到原子这个关键字大家是不是联想到事务的 ACID 的原子性? 两者相似,事务/语句执行要么全部成功,要么全部失败。MySQL 8.0 之前的版本 DDL 是非原子性的,对于多条 sql 构成的ddl语句比如 rename table t1 to t1_bak,t2 to t2_bak 阅读全文
posted @ 2025-06-20 21:45 屠魔的少年
摘要:一、前言 MySQL 8.0.29之前,在线 DDL 操作中即时添加列只能添加在表的最后一列,对于在某个具体列后面快速添加列很不方便,MySQL 8.0.29 扩展了对 ALTER TABLE … ALGORITHM=INSTANT 的支持:用户可以在表的任何位置即时添加列、即时删除列、添加列时评估 阅读全文
posted @ 2025-06-20 21:30 屠魔的少年
摘要:前言 随着业务的发展,用户对系统需求变得越来越多,这就要求系统能够快速更新迭代以满足业务需求,通常系统版本发布时,都要先执行数据库的DDL变更,包括创建表、添加字段、添加索引、修改字段属性等。 在数据量大不大的情况下,执行DDL都很快,对业务基本没啥影响,但是数据量大的情况,而且我们业务做了读写分离 阅读全文
posted @ 2025-06-20 21:11 屠魔的少年
摘要:本期我们针对这几个问题来进行讨论: 传统情况 我们先回顾一下,在没有 “立刻加列” 功能时,加列操作是怎么完成的。我们也借此来熟悉一下本期的图例: 当进行 加列操作 时,所有的数据行 都必须要 增加一段数据(图中的 列 4 数据) 如上一期图解所讲,当改变数据行的长度,就需要 重建表空间(图中灰蓝的 阅读全文
posted @ 2025-06-20 20:58 屠魔的少年
摘要:讨论的背景是MySQL 8.0+InnoDB。 DDL(Data Definition Language) 众所周知, DDL定义了数据在数据库中的结构、关系以及权限等。比如CREATE,ALTER,DROP等等。 本期我们讨论MySQL 8.0(使用InnoDB存储引擎)在修改表结构时, 究竟会发 阅读全文
posted @ 2025-06-20 20:27 屠魔的少年
摘要:背景 之前碰到客户咨询定位 DDL 阻塞的相关问题,整理了一下方法,如何解决 DDL 被阻塞的问题。 下面,就这个问题,整理了一下思路: 怎么判断一个 DDL 是不是被阻塞了? 当 DDL 被阻塞时,怎么找出阻塞它的会话? 1. 如何判断一个 DDL 是不是被阻塞了? 测试过程如下: mysql> 阅读全文
posted @ 2025-06-20 20:04 屠魔的少年
摘要:DDL 操作一直是我们的 MYSQL 的一个软肋,从MYSQL 5.6 其实相关的alter 语句已经有了改变,也就是题目的的inplace 和 copy 。其实很多人都知道,但用的比较少,因为有pt-OSC 工具呀,还有另外一个工具gh-ost (之前是写过的,如有需要可以自己往前翻翻) 维护现在 阅读全文
posted @ 2025-06-20 19:59 屠魔的少年
摘要:前言 如果项目要支持7*24小时服务,对MySQL表添加列或者添加索引等,无法在停机的情况下做了,需要Online DDL的支持,也就是在不影响服务的情况下,在线修改表的定义。 从MySQL 5.6开始,就有官方的Online DDL支持。 目前,MySQL Online DDL主要有三种方式: P 阅读全文
posted @ 2025-06-20 19:49 屠魔的少年