广告
返回顶部
首页 > 资讯 > 数据库 >MySql Online DDL操作记录详解
  • 785
分享到

MySql Online DDL操作记录详解

MySqlOnlineDDL操作MySqlOnlineDDL 2022-12-20 18:12:11 785人浏览 安东尼
摘要

目录一、环境二、执行过程分析三、遇到的问题四、工具尝试五、Online DDL 尝试一、环境 为支持用户账号删除功能,需要在 user 表上加一个字段 deleted。 数据库:Mysql5.6 被 操作表

一、环境

为支持用户账号删除功能,需要在 user 表上加一个字段 deleted。

数据库Mysql5.6

被 操作表 user:数量级为100w,外键200多个

操作:alter table user add deleted boolean NOT NULL default false comment '用户注销标识' , alGorithm=inplace, lock=none;

二、执行过程分析

mysql5.6之后,mysql支持 Online DDL 操作。

Online DDL Support for Column Operations

OperationIn PlaceRebuilds TablePermits Concurrent DMLOnly Modifies Metadata
Adding a columnYesYesYes*No
Dropping a columnYesYesYesNo
Renaming a columnYesNoYes*Yes
Reordering columnsYesYesYesNo
Setting a column default valueYesNoYesYes
Changing the column data typeNoYesNoNo
Dropping the column default valueYesNoYesYes
Changing the auto-increment valueYesNoYesNo*
Making a column NULLYesYes*YesNo
Making a column NOT NULLYes*Yes*YesNo
Modifying the definition of an ENUM or SET columnYesNoYesYes

如图所示,所执行的添加列操作整个过程为:

  • 初始化:为创建临时表的表结构,获取MDL的排他
  • 执行:根据参数 algorithm=inplace, lock=none ,MDL锁降级为共享锁进行数据拷贝
  • 提交:由于涉及到增量备份和临时表的重命名,MDL锁需要升级为排他锁

分析后认为,整个过程只有在初始化和提交的极短过程内需要用到MDL排他锁(影响线上),故而就直接在线上进行操作尝试。

三、遇到的问题

在初始化和提交阶段需要用到MDL的排他锁,而如果DDL操作一直没获取MDL锁(默认获取MDL锁超时时间为一年),那么就会造成 Waiting for table metadata lock 状态,也会阻塞后面所有对 user 表的操作(包括select)。后面会看到连接占满,服务502:

MySql Online DDL操作记录详解

在遇到这样的问题后,为不影响线上,于是后面进行了工具的尝试。

四、工具尝试

工具涉及到 pt-online-schema-change、gh-ost和阿里云无锁DDL。三个工具大同小异,均为使用临时表,将原表数据拷贝到临时表,最后将临时表重命名替换掉原表。区别是在增量同步方面,一个用的触发器、一个用的binlog日志

但是在处理外键方面,pt-online-schema-change用的删除、重建外键,gh-ost和阿里云无锁DDL则是不支持主表外键的变更。eg:阿里云无锁DDL的失败尝试

MySql Online DDL操作记录详解

故使用工具进行 DDL 操作也不适合。

五、Online DDL 尝试

在本地测试30w数据新增列只需440ms后,尝试选择了 online ddl 的操作:

设置 session 级别获取 MDL 锁等待时间时间,避免长时间阻塞其他线程

$ set lock_wait_timeout=10;
# 在10s内获取不到MDL锁,直接退出 alter 操作
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

kill 掉对应的线程以及事务

$ select group_concat(stat separator ' ') from (select concat('kill query ',id,';') as stat from infORMation_schema.processlist  where command != 'Sleep' and Time > 5 order by Time desc) as stats;
+-------------------------------------+
| group_concat(stat separator ' ')    |
+-------------------------------------+
| kill query 42510; kill query 42514; |
+-------------------------------------+
1 row in set (0.00 sec)
$ select group_concat(stat separator ' ') from (select concat('kill ',trx_mysql_thread_id,';')   as stat from information_schema.innodb_trx order by trx_started desc) as stats;
+-------------------------------------------------------------------------+
| group_concat(stat separator ' ')                                        |
+-------------------------------------------------------------------------+
| kill 42436; kill 42435; kill 42521; kill 42511; kill 42510; kill 42483; |
+-------------------------------------------------------------------------+
1 row in set (0.01 sec)

执行 DDL 操作:

$ alter table user add deleted boolean NOT NULL default false comment '用户注销标识' , algorithm=inplace, lock=none;

结果:

MySql Online DDL操作记录详解

以上是在停服后操作的结果,其中 2 操作在停服后,没有需要 kill 的 ID。

参考文献

InnoDB and Online DDL

以上就是MySql Online DDL操作记录详解的详细内容,更多关于MySql Online DDL操作的资料请关注我们其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: MySql Online DDL操作记录详解

本文链接: https://www.lsjlt.com/news/175363.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySql Online DDL操作记录详解
    目录一、环境二、执行过程分析三、遇到的问题四、工具尝试五、Online DDL 尝试一、环境 为支持用户账号删除功能,需要在 user 表上加一个字段 deleted。 数据库:mysql5.6 被 操作表 ...
    99+
    2022-12-20
    MySqlOnlineDDL操作 MySqlOnlineDDL
  • 【MySQL】Online DDL详解
    目录 前言一、分类二、Copy三、Inplace四、Instant五、一些补充六、总结 前言 一天,一位许久未见的澳同学,一见面先不是打招呼,直接给我当面一问 澳同学问我:小涛小涛,我这一...
    99+
    2023-08-31
    mysql 数据库 database
  • MySQL DDL执行方式Online DDL详解
    目录1 引言2 概述3 介绍4 用法5 两种算法第一种 Copy第二种 Inplace6 执行过程7 踩坑8 限制9 总结1 引言 一般来说mysql分为DDL(定义)和DML(操作)。 DDL:Data Definit...
    99+
    2022-09-22
  • MySQL DDL执行方式Online DDL详解
    目录1 引言2 概述3 介绍4 用法5 两种算法第一种 Copy第二种 Inplace6 执行过程7 踩坑8 限制9 总结1 引言 一般来说MySQL分为DDL(定义)和DML(操作...
    99+
    2022-11-13
  • Mysql Online DDL的使用详解
    目录正文LOCK参数ALGORITHM参数COPY TABLE流程IN-PLACE流程允许并发DML的DDL操作不允许并发DML的DDL操作正文 Online DDL在MySQL 5.6才开始支持的,在5.5及之前...
    99+
    2022-05-22
    Mysql Online DDL Mysql Online DDL的使用
  • MySql Online DDL操作问题怎么解决
    本文小编为大家详细介绍“MySql Online DDL操作问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySql Online DDL操作问题怎么解决”文章能帮助大家解决疑惑,下面跟...
    99+
    2023-07-04
  • MySQL & MariaDB Online DDL的详解示例
    这篇文章主要介绍MySQL & MariaDB Online DDL的详解示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MySQL教程栏目介绍指导MySQL & ...
    99+
    2022-10-18
  • MySqlOnlineDDL操作记录详解
    目录一、环境二、执行过程分析三、遇到的问题四、工具尝试五、Online DDL 尝试一、环境 为支持用户账号删除功能,需要在 user 表上加一个字段 deleted。 ...
    99+
    2022-12-20
    MySql Online DDL操作 MySql Online DDL
  • 【MySQL】MySQL审计操作记录
    server_audit是一款内嵌在mariadb的审计插件,在mysql中同样适用,主要用于记录用户操作 1.安装: 通过show variables like 'plugin_dir';查看你的插件目录...
    99+
    2022-10-18
  • 详解记录MySQL中lower_case_table_names的坑
    1 起因 项目迁移数据库, 重新启动后, 报错"T_AAA表不存在", 但数据库中可以查看到该表并有数据 2 问题分析 通过重装系统与数据库, 确认系统与数据库纯净, 排除系统和数据库的原因 使用同一方式恢复两天...
    99+
    2022-05-14
    MySQL lower_case_table_names
  • Django记录操作日志与LogEntry的使用详解
    前言 LogEntry是在后台开发中经常用到的模块,它在admin是默认开启的。 可以使用LogEntry模块记录所有用户的操作记录。一方面可以用来监督,另一方面可以用来做回滚。 1...
    99+
    2022-11-12
  • SpringBoot使用AOP记录接口操作日志详解
    SpringBoot 使用 AOP 记录接口操作日志,供大家参考,具体内容如下 一、AOP简介 1.什么是AOP AOP:Aspect Oriented Programming 面向...
    99+
    2022-11-13
  • MySQL中行记录的操作示例
    这篇文章主要介绍MySQL中行记录的操作示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在Mysql管理软件中, 可以通过sql语句中的dml语言来实现数据的操作, 包括1、使用I...
    99+
    2022-10-18
  • MYSQL——操作数据表中的记录
       MYSQL操作数据表中的记录1    把选中的列数名到最前面   ALTER TABCE 表名 MODIFY 列数名以及列数名的类型 FIR...
    99+
    2022-10-18
  • navicat查看mysql操作记录的方法
    这篇文章将为大家详细讲解有关navicat查看mysql操作记录的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在navicat中查看mysql的操作记录其实方法很简...
    99+
    2022-10-18
  • mysql表中删除重复记录,只保留一条记录的操作
    mysql表中两个字段重复记录,只保留一条记录的操作 例如有一张学生表 其中name 和 class 相同的视为重复记录,需要保留一条记录,删除重复记录, 两种操作方式如下: 方法一: group ...
    99+
    2023-09-27
    mysql 数据库
  • MySQL 删除表中的数据记录详解
      目录 前言言 一、删除表中的数据记录? 1.删除特定数据记录 2.删除所有数据记录 总结 前言         删除数据记录是数据操作中常见的操作,可以删除表中已经存在的数据记录。在MySQL中可以通过DELETE语句来删...
    99+
    2023-09-11
    mysql 数据库 sql
  • MySQL insert死锁问题解决详细记录
    目录Insert死锁问题剖析前置知识构造死锁原因故死锁产生的原因MySQL 5.7 的死锁前提示例原因解决方案总结Insert死锁问题剖析 线上有个批量的insert … on duplicate key ...
    99+
    2022-11-04
  • MySQL insert死锁问题解决详细记录
    目录Insert死锁问题剖析前置知识构造死锁原因故死锁产生的原因MySQL 5.7 的死锁前提示例原因解决方案总结Insert死锁问题剖析 线上有个批量的insert &hellip...
    99+
    2022-11-13
    mysql insert死锁 mysql死锁排查及解决 MySQL死锁
  • MySQL该如何操作数据表中的记录
    下文主要给大家带来MySQL该如何操作数据表中的记录,希望这些内容能够带给大家实际用处,这也是我编辑MySQL该如何操作数据表中的记录这篇文章的主要目的。好了,废话不多说,大家直接看下文吧。 1....
    99+
    2022-11-30
    mysql 数据库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作