目录
问题场景
在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 特别慢呢?