随笔分类 - MySQL
摘要:随着 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
屠魔的少年
摘要:问题 mysql> show create table users; + + + | Table | Create Table | + + + | users | CREATE TABLE `users` ( `user` varchar(11) DEFAULT NULL, `password` v
阅读全文
posted @ 2025-06-20 19:50
屠魔的少年
摘要:前言 如果项目要支持7*24小时服务,对MySQL表添加列或者添加索引等,无法在停机的情况下做了,需要Online DDL的支持,也就是在不影响服务的情况下,在线修改表的定义。 从MySQL 5.6开始,就有官方的Online DDL支持。 目前,MySQL Online DDL主要有三种方式: P
阅读全文
posted @ 2025-06-20 19:49
屠魔的少年
摘要:XtraBackup 2.4,适用于 MySQL 5.6 和 MySQL 5.7。 XtraBackup 8.0,适用于 MySQL 8.0。 注意,两者不可混用,因为 MySQL 8.0 的 redo log 和数据字典的格式发生了变化。 在XtraBackup 2.4中,还有 innobacku
阅读全文
posted @ 2023-05-22 22:03
屠魔的少年
摘要:1.全库备份mydumper -u mydumper_user -p mydumper-pass -G -E -R r 100000 -F 64 -t 1 -0 /data/backup/mydumper 其中,-G -E-R 分别用来备份触发器、定时器和存储过程(函数)r 指定了分片的大小,-F
阅读全文
posted @ 2023-05-21 23:04
屠魔的少年