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

news2024/11/20 5:15:52

目录

问题场景

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.coloradmin.cn/o/2243818.html

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

相关文章

低成本出租屋5G CPE解决方案:ZX7981PG/ZX7981PM WIFI6千兆高速网络

刚搬进新租的房子,没有网络,开个热点?续航不太行。随身WIFI?大多是百兆级网络。找人拉宽带?太麻烦,退租的时候也不能带着走。5G CPE倒是个不错的选择,插入SIM卡就能直接连接5G网络,千…

港大ArcLab最新开源DEIO:第一个学习与传统非线性图优化紧密结合的单目事件惯性里程计

原文链接:港大ArcLab最新开源DEIO:第一个学习与传统非线性图优化紧密结合的单目事件惯性里程计 导读 本文介绍了一种名为 DEIO(Deep Event Inertial Odometry)的新型单目深度事件惯性里程计框架。该方法创新性地将深度学习与传统…

基于麒麟服务器操作系统V10版本,部署Nginx服务、MySql服务搭建PHP环境,实现静态网站平台的搭建。

一、环境准备 关闭防火墙。 查看当前防火墙的状态 systemctl status firewalld Copy 如果防火墙的状态参数是inactive,则防火墙为关闭状态。 如果防火墙的状态参数是active,则防火墙为开启状态。 关闭防火墙。 如果您想临时关闭防火墙,需要运行以下命令: systemctl…

【priority_queue的使用及模拟实现】—— 我与C++的不解之缘(十六)

前言 ​ priority_queue,翻译过来就是优先级队列,但是它其实是我们的堆结构(如果堆一些遗忘的可以看一下前面的文章复习一下【数据结构】二叉树——顺序结构——堆及其实现_二叉树顺序结构-CSDN博客),本篇文章就来使用…

在AndroidStudio中新建项目时遇到的Gradle下载慢问题,配置错的按我的来,镜像地址不知道哪个网页找的,最主要下载要快

android-studio-2024.2.1.11-windows Android 移动应用开发者工具 – Android 开发者 | Android Developers https://r4---sn-j5o76n7z.gvt1-cn.com/edgedl/android/studio/install/2024.2.1.11/android-studio-2024.2.1.11-windows.exe?cms_redirectyes&met1731775…

《Java核心技术 卷I》用户界面中首选项API

首选项API 在桌面程序中,通常都会存储用户首选项,如用户最后处理的文件、窗口的最后位置等。 利用Properties类可以很容易的加载和保存程序的配置信息,但有以下缺点: 有些操作系统没有主目录概念,很难为匹配文件找到…

服务器数据恢复—raid5阵列故障导致上层系统分区无法识别的数据恢复案例

服务器数据恢复环境: 某品牌DL380服务器,服务器中三块SAS硬盘组建了一组raid5阵列。服务器安装Windows Server操作系统,划分了3个分区,D分区存放数据库,E分区存放数据库备份。 服务器故障: RAID5阵列中有一…

Linux_shell脚本if语句详细教程

前言 在 Linux Shell 脚本中,if 语句用于基于条件执行命令或代码块。它的基本语法结构如下: if 条件; then# 如果条件为真时执行的代码 elif 另一个条件; then# 如果另一个条件为真时执行的代码 else# 如果所有条件都不成立时执行的代码 fi一、if 语句…

java中设计模式的使用(持续更新中)

概述 设计模式的目的:编写软件过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战,设计模式是为了让程序(软件),具有…

Leetcode 有效的数独

这段代码解决的是 验证一个数独是否有效 的问题,其算法思想是基于 规则校验和状态记录。具体思想如下: 算法思想 核心目标: 检查每个数字在 同一行、同一列 和 同一个 3x3 子格 中是否重复。 状态记录: 使用 3 个布尔二维数组分别…

群控系统服务端开发模式-应用开发-前端文件格式功能开发

一、添加视图 在根目录下src文件夹下views文件夹下param文件夹下filedoc文件夹下&#xff0c;新建index.vue&#xff0c;代码如下 <template><div class"app-container"><div class"filter-container" style"float:left;">&l…

可认证数据资产合约标准协议(CMIDA-1)意见征集

标准背景 数据资产具备多维度的属性&#xff0c;涵盖行业特性、状态信息、资产类型、存储格式等。数据资产在不同流通主体之间可理解、可流通、可追溯、可信任的重要前提之一是存在统一的标准&#xff0c;缺失统一的标准&#xff0c;数据混乱冲突、一数多源、多样多类等问题将…

大数据-227 离线数仓 - Flume 自定义拦截器(续接上节) 采集启动日志和事件日志

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

Solana应用开发常见技术栈

编程语言 Rust Rust是Solana开发中非常重要的编程语言。它具有高性能、内存安全的特点。在Solana智能合约开发中&#xff0c;Rust可以用于编写高效的合约代码。例如&#xff0c;Rust的所有权系统可以帮助开发者避免常见的内存错误&#xff0c;如悬空指针和数据竞争。通过合理利…

redis类型介绍

1. 字符串&#xff08;String&#xff09;&#xff1a; • 简介&#xff1a;最基础的数据类型&#xff0c;可以存储任何形式的字符串&#xff0c;包括文本数据和数字数据。 • 常用操作&#xff1a;SET、GET、INCR、DECR等。 2. 列表&#xff08;List&#xff09;&#xff1a; …

Pytest-Bdd-Playwright 系列教程(10):配置功能文件路径 优化场景定义

Pytest-Bdd-Playwright 系列教程&#xff08;10&#xff09;&#xff1a;配置功能文件路径 & 优化场景定义 前言一、功能文件路径的配置1.1 全局设置功能文件路径1.2. 在场景中覆盖路径 二、避免重复输入功能文件名2.1 使用方法2.2 functools.partial 的背景 三、应用场景总…

HarmonyOs鸿蒙开发实战(17)=>沉浸式效果第二种方案一组件安全区方案

1.沉浸式效果的目的 开发应用沉浸式效果主要指通过调整状态栏、应用界面和导航条的显示效果来减少状态栏导航条等系统界面的突兀感&#xff0c;从而使用户获得最佳的UI体验。 2.组件安全区方案介绍 应用在默认情况下窗口背景绘制范围是全屏&#xff0c;但UI元素被限制在安全区内…

构建安全的数据库环境:群晖NAS安装MySQL和phpMyAdmin详细步骤

文章目录 前言1. 安装MySQL2. 安装phpMyAdmin3. 修改User表4. 本地测试连接MySQL5. 安装cpolar内网穿透6. 配置MySQL公网访问地址7. 配置MySQL固定公网地址8. 配置phpMyAdmin公网地址9. 配置phpmyadmin固定公网地址 前言 本文将详细讲解如何在群晖NAS上安装MySQL及其数据库管理…

【c++丨STL】list的使用

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C、STL 目录 前言 list简介 一、list的默认成员函数 构造函数(constructor) 析构函数 赋值重载 二、list的迭代器接口 迭代器的功能分类 三、list的容量…

如何编译 Cesium 源码

如何编译 Cesium 源码 Cesium 是一个开源的 JavaScript 库&#xff0c;用于构建 3D 地球和地图应用程序。它提供了一套强大的 API 和工具&#xff0c;使开发者能够创建丰富的地理空间应用。本文将指导您如何从 GitHub 下载 Cesium 源码&#xff0c;并在本地进行编译。 TilesB…