MySQL扩展varchar字段长度能否Online DDL

目录

问题场景

Online DDL 简介

场景复现

DBdoctor快速识别 Online DDL

总结


问题场景

在MySQL数据库中,DDL变更可以通过两种算法实现:Copy算法和In-Place算法。Copy算法会复制整个表,这可能导致长时间的写入阻塞,从而严重影响业务运行。相比之下,In-Place算法直接在现有表上进行结构修改,通常锁定时间较短,因此对业务的干扰也较小。由于In-Place算法几乎不需要锁定表,它通常被称为Online DDL。判断哪些SQL不支持Online DDL,成为DBA 面临的一大挑战。

大家看下面这条SQL在大表DDL变更时,会不会长时间阻塞写入?

alter table test_tb modify name varchar(128) default '' not null comment '创建人';

表test_tb 的charset为utf8mb4,字段name原类型为varchar(32)。官方文档中扩展varchar长度是支持Online DDL的,但是最近开发同学却遇到了问题。

某个版本上线一段时间后,发现一个表的两个varchar字段的长度不够用,开发紧急上线数据库脚本扩展字段长度,而在执行过程中,修改第一个字段很快就执行完了,修改第二个字段时执行时间较长,执行时间段内业务有告警写入失败,对应功能界面全部转圈,收到用户投诉。

数据库版本为MySQL 5.7,表结构如下:

create table k8s_auth_server.paas_role_list(id              bigint                         not null primary key,creator         varchar(16) default ''        not null comment '创建人',role_name       varchar(32)                    not null comment '角色英文名称',...)comment '平台角色表' collate = utf8mb4_general_ci;

扩展字段长度SQL如下:

alter table k8s_auth_server.paas_role_list modify creator varchar(32) default '' not null
comment '创建人';
alter table k8s_auth_server.paas_role_list modify role_name varchar(128) not null comment'角色英文名称';

同样是修改字段长度,为什么修改字段creator很快,而修改字段role_name 特别慢呢?

Online DDL 简介

在MySQL 5.6 版本之前,所有的DDL变更都需要锁表,导致大量线程处于“Waiting for meta data lock”的状态,5.6版本引入Online DDL新特性,部分DDL 变更不需要锁表,引入算法In-Place和Copy(8.0增加Instant),其中 Instant,In-Place可以实现无锁变更。

  • Copy:建一张新表,并将表数据逐行从原始表复制到新表,复制阶段全程不允许并发DML。

  • In-Place:尽量避免复制表数据,但可能会在原地重建表。在操作的准备和执行阶段,可以短暂地对表进行独占元数据锁定。通常支持并发DML(全文索引和空间索引例外)。

  • Instant:操作仅修改数据字典中的元数据。在操作的执行阶段,可以短暂地对表进行独占元数据锁定。表数据不受影响,允许并发DML。

Copy算法和In-Place算法各阶段加锁情况对比如下,可以看到In-Place算法仅在开始和结束时短时间阻塞写入,而Copy算法在变更阶段全程阻塞写入。

图片

Online DDL的变更原理这里不再详细描述,在MySQL 5.7 官方文档中,对于字段相关的Online DDL支持如下:

图片

可以看到扩展varchar字段长度支持In-Place算法,但实际表现为什么和官方文档中不一致呢?

继续往下看,文档中对扩展varchar字段长度有额外说明:

  • The number of length bytes required by a VARCHAR column must remain the same. For VARCHAR columns of 0 to 255 bytes in size, one length byte is required to encode the value. For VARCHAR columns of 256 bytes in size or more, two length bytes are required. As a result, in-place ALTER TABLE only supports increasing VARCHAR column size from 0 to 255 bytes, or from 256 bytes to a greater size. In-place ALTER TABLE does not support increasing the size of a VARCHAR column from less than 256 bytes to a size equal to or greater than 256 bytes. In this case, the number of required length bytes changes from 1 to 2, which is only supported by a table copy (ALGORITHM=COPY)

翻译下就是只有256 字节内的变更才支持In-Place算法,超过这个长度只能使用Copy算法,换言之需要锁表。

文档中有提示:

  • The byte length of a VARCHAR column is dependant on the byte length of the character set

也就是使用In-Place算法扩展varchar类型的长度限制,和字段的字符集有关。

mysql> show charset where Charset in ('latin1', 'utf8', 'utf8mb4');+---------+----------------------+--------------------+--------+| Charset | Description          | Default collation  | Maxlen |+---------+----------------------+--------------------+--------+| latin1  | cp1252 West European | latin1_swedish_ci  |      1 || utf8    | UTF-8 Unicode        | utf8_general_ci    |      3 || utf8mb4 | UTF-8 Unicode        | utf8mb4_general_ci |      4 |+---------+----------------------+--------------------+--------+3 rows in set (0.00 sec)

常见的字符集utf8一个字符需要3个字节,utf8mb4需要4个字节,即 utf8 的varchar(86)及以上,utf8mb4 的varchar(64)及以上不支持In-Place算法,不支持 Online DDL。

场景复现

一张utf8mb4的测试表

create table testmb4(id              bigint                         not null primary key,creator         varchar(16) default ''        not null comment '创建人',role_name       varchar(32)                    not null comment '角色英文名称') charset = utf8mb4 collate = utf8mb4_general_ci;

变更字段 creator

mysql> alter table testmb4 modify creator varchar(32) default '' not null comment '创建人', ALGORITHM = INPLACE;
Query OK, 0 rows affected (0.10 sec)
Records: 0  Duplicates: 0  Warnings: 0

变更字段 role_name

mysql> alter table testmb4 modify role_name varchar(128) default '' not null comment '角色英文名称', ALGORITHM = INPLACE;
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.

果然,utf8mb4的字段将varchar(32)变至varchar(128)不再支持In-Place算法。

测试支持In-Place算法的边界:


mysql> alter table testmb4 modify role_name varchar(64) default '' not null comment '角色英文名称', ALGORITHM = INPLACE;
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
mysql> alter table testmb4 modify role_name varchar(63) default '' not null comment '角色英文名称', ALGORITHM = INPLACE;
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0

经验证,utf8mb4的varchar类型字段,变更长度大于等于64时,不再支持In-Place算法。

DBdoctor快速识别 Online DDL

Online DDL包含表、字段、索引等多个场景,DBA也很难全部识别。线上DDL变更更是个挑战。但是DBdoctor提供的免费SQL审核工具可以简化这一过程。只需将多条DDL变更的SQL放入审核窗口内,就可快速识别不支持Online DDL的SQL语句。

上传SQL

图片

点击审核

图片

审核详情中出现:DDL语句不支持Online DDL

图片

总结

扩展varchar字段长度虽然支持In-Place算法,但是有一定限制,长度若大于等于256 byte则不支持Online DDL,utf8对应varchar(86),utf8mb4对应varchar(64)。面对Online DDL的众多场景,DBdoctor免费的SQL审核功能可以快速识别Online DDL,支撑线上DDL变更,有效预防锁表问题,欢迎小伙伴们下载体验!

*************************************************************************************************************

免*费下载,一键部署:DBdoctor-数据库性能诊断

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/475492.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【WPF】Prism学习(九)

Prism Dependency Injection 1.Container Locator 1.1. Container Locator的引入: Container Locator是在Prism 8.0版本中新引入的一个特性。它的目的是为了帮助Prism框架摆脱对CommonServiceLocator的依赖,并解决一些必须回退到ServiceLocator模式的内…

.NET 9与C# 13革新:新数据类型与语法糖深度解析

记录(Record)类型 使用方式: public record Person(string FirstName, string LastName); 适用场景:当需要创建不可变的数据结构,且希望自动生成 GetHashCode 和 Equals 方法时。不适用场景:当数据结构需…

3C产品说明书电子化转变:用户体验、环保与商业机遇的共赢

在科技日新月异的当代社会,3C产品(涵盖计算机类、通信类和消费类电子产品)已成为我们日常生活中不可或缺的重要元素。与此同时,这些产品的配套说明书也经历了一场从纸质到电子化的深刻变革。这一转变不仅体现了技术的飞速进步&…

GIT 入门详解指南

前言: 注:本博客仅用于记录本人学习过程中对git的理解,仅供学习参考,如有异议请自行查资料求证 安装 使用git之前必须完成git的安装,Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平台上运行 git 安装教程 基本…

【数据结构】用四个例子来理解动态规划算法

1. 动态规划 动态规划(Dynamic Programming, DP)是一种通过将复杂问题分解为更小的子问题来求解的算法设计思想,一般用于求解具有最优子结构和重叠子问题性质的问题。动态规划的核心在于:(1)最优子结构--问…

前端两大利器:Vue与TypeScript的渊源

Vue 在前端领域占据着重要地位,是最受欢迎的前端框架之一。它被广泛应用于各种类型的 Web 应用开发,从简单的小型项目,如个人博客、公司宣传网站等,到复杂的大型企业级应用,如电商平台、金融系统等。例如,许…

【Python】使用Windows任务计划程序定时运行Python脚本!

在搭建了一个python 文件以后,如果我们想每天一次或者多次运行这个文件,或者想要一天运行多个python 文件,推荐可以使用: Win的【任务计划程序】 创建【批处理文件(.bat)】运行Python脚本。 我们可以在Wind…

分布式数据库中间件可以用在哪些场景呢

在数字化转型的浪潮中,企业面临着海量数据的存储、管理和分析挑战。华为云分布式数据库中间件(DDM)作为一款高效的数据管理解决方案,致力于帮助企业在多个场景中实现数据的高效管理和应用,提升业务效率和用户体验。九河…

Photino:通过.NET Core构建跨平台桌面应用程序,.net国产系统

一、Photino.NET简介: 最近发现了一个不错的框架 Photino.Net 一份代码运行,三个平台 windows max linux ,其中windows10,windows11,ubuntu 18.04,ubuntu 20.04 已测试均可以。mac 因为没有相关电脑没有测试。 github:https://github.com/t…

NAT网络地址转换——Easy IP

NAT网络地址转换 Tip: EasylP没有地址池的概念,使用接口地址作为NAT转换的公有地址。EasylP适用于不具备固定公网IP地址的场景:如通过DHCP, PPPOE拨号获取地址的私有网络出口,可以直接使用获取到的动态地址进行转换。 本次实验模拟nat协议配置 AR1配置如下&…

Redis五大基本类型——List列表命令详解(命令用法详解+思维导图详解)

目录 一、List列表类型介绍 二、常见命令 1、LPUSH 2、LPUSHX 3、RPUSH 4、RPUSHX 5、LRANGE 6、LPOP 7、RPOP 8、LREM 9、LSET 10、LINDEX 11、LINSERT 12、LLEN 13、阻塞版本命令 BLPOP BRPOP 三、命令小结 相关内容: Redis五大基本类型——Ha…

单细胞转录组学在植物系统和合成生物学中的应用进展-文献精读83

Advances in the Application of Single-Cell Transcriptomics in Plant Systems and Synthetic Biology 单细胞转录组学在植物系统和合成生物学中的应用进展 最佳实践:教程-文献精读80 摘要 植物是由多种细胞类型组成的复杂系统,其结构呈现出分层的组…

【设计模式】如何用C++实现适配器模式

【设计模式】如何用C实现适配器模式 一、问题背景 用到过很多次适配器模式,一直不理解为什么用这种模式,好像这个模式天生就该如此使用。 实际上,我们很多的理念都源于一些简朴的思想,这些思想不一定高深,但是在保证…

详解八大排序(一)------(插入排序,选择排序,冒泡排序,希尔排序)

文章目录 前言1.插入排序(InsertSort)1.1 核心思路1.2 实现代码 2.选择排序(SelectSort)2.1 核心思路2.2 实现代码 3.冒泡排序(BubbleSort)3.1 核心思路3.2 实现代码 4.希尔排序(ShellSort&…

《Django 5 By Example》阅读笔记:p679-p765

《Django 5 By Example》学习第10天,p679-p765总结,总计87页。 一、技术总结 1.channel 书里通过聊天软件功能演示Django中channel以及异步编程的应用,本人对这块不是很熟悉,不做评价。 2.deployment(部署) services:db:imag…

kali搭建pikachu靶场

前言: 总所周知搭个网站需要有apachemysqlphp,Apache是一个开源的Web服务器软件, MySQL是一种关系型数据库管理系统(数据库),PHP是一种在服务器上执行的脚本语言 文章内容来自:【黑帽编程与攻…

C++时间复杂度与空间复杂度

一、时间复杂度(Time Complexity) 1. 概念 时间复杂度是用来衡量算法运行时间随着输入规模增长而增长的量级。它主要关注的是算法执行基本操作的次数与输入规模之间的关系,而非具体的运行时间(因为实际运行时间会受硬件、编程语…

【软考】系统架构设计师-信息安全技术基础

信息安全核心知识点 信息安全5要素:机密性、完整性、可用性、可控性、审查性 信息安全范围:设备安全、数据安全、内容安全、行为安全 网络安全 网络安全的隐患体现在:物理安全性、软件安全漏洞、不兼容使用安全漏洞、选择合适的安全哲理 …

SQL Server Management Studio 的JDBC驱动程序和IDEA 连接

一、数据库准备 (一)启用 TCP/IP 协议 操作入口 首先,我们要找到 SQL Server 配置管理器,操作路径为:通过 “此电脑” 右键选择 “管理”,在弹出的 “计算机管理” 窗口中,找到 “服务和应用程…

类和对象——static 成员,匿名对象(C++)

1.static成员 a)⽤static修饰的成员变量,称之为静态成员变量,静态成员变量⼀定要在类外进行初始化。 b)静态成员变量为所有类对象所共享,不属于某个具体的对象,不存在对象中,存放在静态区。 …