iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySql Online DDL操作问题怎么解决
  • 330
分享到

MySql Online DDL操作问题怎么解决

2023-07-04 20:07:34 330人浏览 安东尼
摘要

本文小编为大家详细介绍“MySql Online DDL操作问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mysql Online DDL操作问题怎么解决”文章能帮助大家解决疑惑,下面跟

本文小编为大家详细介绍“MySql Online DDL操作问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mysql Online DDL操作问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

一、环境

为支持用户账号删除功能,需要在 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。

读到这里,这篇“MySql Online DDL操作问题怎么解决”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: MySql Online DDL操作问题怎么解决

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

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

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

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

下载Word文档
猜你喜欢
  • MySql Online DDL操作问题怎么解决
    本文小编为大家详细介绍“MySql Online DDL操作问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySql Online DDL操作问题怎么解决”文章能帮助大家解决疑惑,下面跟...
    99+
    2023-07-04
  • MySql Online DDL操作记录详解
    目录一、环境二、执行过程分析三、遇到的问题四、工具尝试五、Online DDL 尝试一、环境 为支持用户账号删除功能,需要在 user 表上加一个字段 deleted。 数据库:mysql5.6 被 操作表 ...
    99+
    2022-12-20
    MySqlOnlineDDL操作 MySqlOnlineDDL
  • 怎么理解MySQL 5.7 Online DDL Overview
    这期内容当中小编将会给大家带来有关怎么理解MySQL 5.7 Online DDL Overview,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 ...
    99+
    2024-04-02
  • MySQL online ddl工具之pt-online-schema-change怎么用
    这篇文章主要介绍MySQL online ddl工具之pt-online-schema-change怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MySQL ddl 的问题现状...
    99+
    2024-04-02
  • 怎么解决MySQL 5.7中定位DDL被阻塞的问题
    这篇文章主要为大家展示了“怎么解决MySQL 5.7中定位DDL被阻塞的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么解决MySQL 5.7中定位DDL...
    99+
    2024-04-02
  • Linux操作系统问题怎么解决
    这篇文章主要讲解了“Linux操作系统问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux操作系统问题怎么解决”吧!在多人共用一台电脑或管理局域网时,常常会遇到这种情况:普通...
    99+
    2023-06-17
  • LINQ查询操作的问题怎么解决
    这篇文章主要介绍“LINQ查询操作的问题怎么解决”,在日常操作中,相信很多人在LINQ查询操作的问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”LINQ查询操作的问题怎么解决”的疑惑有所帮助!接下来...
    99+
    2023-06-17
  • 怎么解决fsockopen php操作失败问题
    本篇内容主要讲解“怎么解决fsockopen php操作失败问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决fsockopen php操作失败问题”吧!fsockopen php操作失...
    99+
    2023-06-20
  • React操作DOM之forwardRef问题怎么解决
    本篇内容主要讲解“React操作DOM之forwardRef问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React操作DOM之forwardRef问题怎么解决”吧!React操作D...
    99+
    2023-07-05
  • MySQL DDL操作实践是怎样的
    本篇文章给大家分享的是有关MySQL DDL操作实践是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。根据网上的DDL 树状图,自己cop...
    99+
    2024-04-02
  • mysql删除操作其实是假删除问题怎么解决
    本篇内容介绍了“mysql删除操作其实是假删除问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!mysql删除操作其实是假删除在 I...
    99+
    2023-07-06
  • MySQL 中定位 DDL 被阻塞的问题及解决方案
    DDL 被阻塞了,如何找到阻塞它的 SQL 经常碰到开发、测试童鞋会问,线下开发、测试环境,执行了一个DDL,发现很久都没有执行完,是不是被阻塞了?要怎么解决? 包括在群里,也经常会...
    99+
    2024-04-02
  • MySQL Backup问题怎么解决
    这篇文章主要讲解了“MySQL Backup问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL Backup问题怎么解决”吧!#!/bin...
    99+
    2024-04-02
  • windows鼠标驱动安装操作问题怎么解决
    本文小编为大家详细介绍“windows鼠标驱动安装操作问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“windows鼠标驱动安装操作问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。鼠标驱动怎...
    99+
    2023-06-30
  • MySQL 5.6中怎么定位DDL被阻塞的问题
    这篇文章将为大家详细讲解有关MySQL 5.6中怎么定位DDL被阻塞的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。对于DDL被阻塞问题的定位,我们主要是基于MySQ...
    99+
    2024-04-02
  • 解决mysql的赋权操作之GRANTALLPRIVILEGESON*.*TO‘root‘@‘%‘IDENTIFIEDBY‘123456‘WITHGRANTOPTION问题
    一种情况 mysql的赋权操作:GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘%‘ IDENTIFIE...
    99+
    2022-11-13
    GRANT ALL PRIVILEGES mysql赋权操作
  • mysql怎么解决幻读问题
    MySQL可以通过以下几种方式解决幻读问题:1. 事务隔离级别:将事务的隔离级别设置为串行化(SERIALIZABLE)可以解决幻读...
    99+
    2023-08-23
    mysql
  • 怎么解决mysql的Warning问题
    这篇文章主要介绍“怎么解决mysql的Warning问题”,在日常操作中,相信很多人在怎么解决mysql的Warning问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么...
    99+
    2024-04-02
  • 怎么解决mysql错1005问题
    这篇文章主要介绍了怎么解决mysql错1005问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 mysql错误...
    99+
    2024-04-02
  • Linux操作系统怎么解决-bash: !: event not found的问题
    本篇内容介绍了“Linux操作系统怎么解决-bash: !: event not found的问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2023-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作