mysql online ddl更改varchar长度的锁表情况

news2024/12/24 20:57:12

我们只看5.7及其之后的版本,官方文档:https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl.html https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl.html

mysql online ddl的特性是指,支持以instant(8.0版本开始支持)和in-place的方式修改表,同时允许在修改表的过程中,并发地进行dml操作。

mysql ddl操作中,修改varchar长度是一个比较常见的操作。我们需要关注的是修改varchar长度过程中是否是以instant或in-place的方式进行。

官方文档是这么描述的:

图片

图片

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). For example, attempting to change VARCHAR column size for a single byte character set from VARCHAR(255) to VARCHAR(256) using in-place ALTER TABLE returns this error:
ALTER TABLE tbl_name ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256); ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
.....
Decreasing VARCHAR size using in-place ALTER TABLE is not supported. Decreasing VARCHAR size requires a table copy (ALGORITHM=COPY).

由官方文档可梳理出下面几点:

1.对于varchar这种存储可变长度字符串的类型来说,需要使用1或2个额外字节记录字符串的长度:如果列的最大长度小于或等于255字节,则只需要使用1个字节表示,否则使用2个字节。
2.如果想要支持in-place的方式修改varchar的长度,varchar列的长度字节数需要保持不变。也就是说in-place的方式只支持varchar列的大小在0~255之间或者256~256+之间变动,不支持从小于等于255的值增大到255以上,比如varchar(20)-->varchar(500)。因为这个时候长度字节数从1变成了2。
3.当长度字节数发生改变时,仅支持以copy的方式进行。
4.缩减varchar长度,只能使用copy方法。

这里需要注意的是,这里我们提到的字节数并不等于字符数,也即varchar(n)中的n。

varchar实际占用的字节数会根据字符的编码和存储格式来计算VARCHAR列的实际字节数。例如,对于UTF-8编码的字符,utf8mb3占3个字节,utf8mb4占4个字节。

接下来我们实战验证一下。有张表的表结构如下:

 CREATE TABLE `t` (
  `d` datetime DEFAULT CURRENT_TIMESTAMP,
  `name` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

表t的字符集是utf8mb4,所以name字段,varchar(20)所占字节数为20*4=80。

我们先试试使用inplace算法将varchar(20)改为varchar(63)。

图片

可见,20*4(80)-->63*4(252),255字节以内的变动,支持使用inplace。
再试试使用inplace算法将varchar(63)改为varchar(64):

图片

可以看到,63*4(252)-->64*4(256),这个时候不支持inplace,执行报错:ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.

使用copy算法将n修改为64后,再将n修改为200(256-->800),则又支持inplace了,如下图所示:

图片

此外,减少varchar字段的长度,也不能使用inplace,需要使用copy算法。

图片

注:copy 模式会有持续性的锁(DDL 的整个过程期间无法向该表写入任何数据),要格外关注。

总结

  • 缩小字段长度不能使用inpalce,只能使用copy方式,会锁表。

  • 放大字段长度:in-place的方式只支持varchar列的字节数在0~255之间或者256~256+之间变动,不支持从小于等于255的值增大到255以上。以UTF8mb4编码为例,一个字符占4个字节。如:

    • varchar(20)--》varchar(63),inplace方式,不锁表。

    • varchar(64)--》varchar(120),inplace方式,不锁表。

    • varchar(20)--》vachar(64),copy方式,会锁表(20*4=80个字节,64*4=256字节);

参考:http://mysql.taobao.org/monthly/2021/03/06/
https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl.html
https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl.html
https://blog.csdn.net/yuanlairuci1992/article/details/126886422

图片

点个“赞 or 在看” 你最好看!

喜欢,就关注我吧!

图片

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线性筛法与欧拉函数

文章目录 筛法求质数欧拉函数基本模板筛法求欧拉函数 每次从最小质数开始遍历,可以保证n只会被最小质数筛到, 避免多次筛到, 每个数只会被筛一次, 即时间复杂度为 O ( n ) O(n) O(n), 线性筛法 筛法求质数 原题链接&a…

3、windows环境下vscode开发c/c++环境配置(二)

前言:上一篇文章写了windows环境下,配置vscode的c/c开发环境,这一篇讲vscode开发c/c的配置文件,包括c_cpp_propertues.json,task.json及launch.json。 一、总体流程 通过c/c插件我们就可以来编写c/c程序了&#xff0c…

77、Spring、Spring Boot和Spring Cloud的关系

77、Spring、Spring Boot和Spring Cloud的关系 随着 Spring、Spring Boot 和 Spring Cloud 的不断发展,越来越多的开发者加入 Spring 的大军中。对于初学者而言,可能不太了解 Spring、Spring Boot 和 Spring Cloud 这些概念以及它们之间的关系&#xff…

强化学习入门(Matlab2021b)-创建环境【2】

目录 1 前言2 利用step和reset函数创建自定义环境2.1 对象描述2.2 reset函数2.3 step函数2.3 构建自定义环境3 使用匿名函数传递额外的参数4 可视化检查自定义函数的输出参考链接1 前言 本文介绍如何基于MATLAB编写step、reset函数,创建自己的强化学习环境(Environment)。 使…

ThreadLocal(5):ThreadLocalMap源码分析

在分析ThreadLocal方法的时候,我们了解到ThreadLocal的操作实际上是围绕ThreadLocalMap展开的。ThreadLocalMap的源码相对比较复杂, 我们从以下三个方面进行讨论。 1 基本结构 ​ ThreadLocalMap是ThreadLocal的内部类,没有实现Map接口,用独…

Vue2路由组件练习

Vue2路由组件练习 1. 演示效果 2. 代码分析 2.1. 安装 vue-router 命令:npm i vue-router 应用插件:Vue.use(VueRouter) 2.2. 创建路由文件 在 src 文件夹下,创建router文件夹,并在该文件夹创建index.js文件 2.3. 导入依赖…

SpringBootWeb学习笔记——12万字详细总结!

0. 写在前面 注:这套笔记是根据黑马程序员B站2023-3-21的视频学习的成果,其中省略了前端基础部分、Maven部分和数据库基础部分,详情可见目录。 注注:目前文章内结尾处多幅图片加载不出来,因为图片还存在本地没被传上来,过段时间再改~ 所有的Spring项目都基于Spring Fra…

linux 修改开发板网卡eth0的ip地址

win10如何新增电脑ip地址: https://blog.csdn.net/linxinfa/article/details/105817473 ifconfig # 可设置网络设备的状态,或是显示目前的设置。 命令详解:https://www.runoob.com/linux/linux-comm-ifconfig.html 一、临时修改 ifconfig e…

「Qt Widget中文示例指南」如何实现文档查看器?(一)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 文档查看器是一个显…

基于springboot+vue的洗衣店订单管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

【水处理】水环境治理综合服务,污水一体化管控平台

水是人类生活中不可或缺的资源之一。然而,随着人口的增长和工业化的进程,水资源的压力日益增大。由于污染和过度开采,全球许多地区面临水资源短缺的问题。因此,水处理成为了一个至关重要的问题,旨在净化和保护重要的水…

【Python笔记-设计模式】适配器模式

一、说明 适配器模式是一种结构型模式,它使接口不兼容的对象能够相互合作 (一) 解决问题 主要解决接口不兼容问题 (二) 使用场景 当系统需要使用现有的类,但类的接口不符合需求时当需要一个统一的输出接口,但输入类型不可预知时当需要创…

Nginx 反向代理配置

Nginx就不废话了,web服务器。 最近在备案一个域名,想要备案,部署一个服务器,平常很少自己配置Nginx,今天记录下。 1、反向代理 正向代理 指 客户端通过代理访问后端服务 反向代理 指 服务器推出一个客户&#xff0…

最优二叉搜索树 C#实现

最优二叉搜索树 C#实现 介绍一下 上一篇博文搞半天挺烧脑,没搞清楚继续… 主要是练习动态规划算法。最关键的一个是这个最优二叉搜索树能干啥。我认为如果数据稳定,统计出概率来,用最优二叉树保存,以后搜索应该是效率比较高的。…

五种多目标优化算法(MOJS、MOGWO、NSWOA、MOPSO、NSGA2)性能对比,包含6种评价指标,9个测试函数(提供MATLAB代码)

一、5种多目标优化算法简介 1.1MOJS 1.2MOGWO 1.3NSWOA 1.4MOPSO 1.5NSGA2 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数(zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3)&#xff0…

计算机设计大赛 深度学习人脸表情识别算法 - opencv python 机器视觉

文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习人脸表情识别系…

隐匿的炸弹 — C语言的隐式声明

前言 (1)如果有嵌入式企业需要招聘湖南区域日常实习生,任何区域的暑假Linux驱动实习岗位,可C站直接私聊,或者邮件:zhangyixu02gmail.com,此消息至2025年1月1日前均有效 (2&#xff0…

comsol燃料电池+锂离子电池

电化学仿真技术通过对电池微观行为进行研究,明晰电池内部多现象机理,并将其数值化,通过数值法实现对物理特征联合计算,建立完整的电池模型。COMSOL Multiphysics 具有强大的多物理场全耦合仿真分析功能、高效的计算性能&#xff0…

WebRTC最新版报错解决:FileNotFoundError: LASTCHANGE.committime (二十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

IP地址定位可以精确到哪里

IP地址定位能够精确到的位置级别取决于多种因素,包括IP地址的分配方式、数据库的质量和更新频率、用户的移动性等。一般而言,IP地址定位可以精确到市级,甚至可以达到街道级别 https://www.ip66.net/?utm-sourceLJ&utm-keyword?1146 但需…