今天开发那边过来和我说他那边数据库无法提交数据,一直卡住
我查看了一下进程show processlist,发现有几条delete语句和insert语句,已经执行了6000多秒了,都是非常简单的语句
在RR模式下:
有几条语句:
alter table tbname drop primary key; 执行了6000多秒。
其他delete,insert操作也一直卡在哪里。
ALTER TBALE DROP PRIMARY KEY操作会使用COPY算法,把整张表进行重建操作。
mysql的在线DDL语句会等待事物完成后再执行,但是会阻塞后面的事物。
如:
第一个session:
begin;
select * from test;
第二个session:
alter table test drop primary key; 等待事物一完成
第三个session:
select * from test; 这时候会阻塞这条语句
在线DDL操作可以分为三个阶段:
-
阶段1:初始化
在初始化阶段,服务器确定操作期间允许的并发数,同时考虑存储引擎功能,语句中指定的操作以及用户指定的 选项
ALGORITHM
和LOCK
选项。在此阶段,将采用共享的可升级元数据锁来保护当前表定义。 -
阶段2:执行
在此阶段,准备并执行该陈述。元数据锁是否升级为独占取决于初始化阶段评估的因素。如果需要独占元数据锁定,则仅在语句准备期间进行短暂锁定。
-
阶段3:提交表定义
在提交表定义阶段,元数据锁升级为独占以驱逐旧表定义并提交新表定义。授予后,独占元数据锁定的持续时间很短。
ALTER TABLE 使用以下两种算法之一处理操作:
-
COPY
:对原始表的副本执行操作,并将表数据从原始表逐行复制到新表。不允许并发DML。 -
INPLACE
:避免复制表数据操作,可以在适当的位置重建表。在操作的准备和执行阶段期间可以短暂地对表进行独占元数据锁定。支持并发DML。
使用INPLACE算法的操作:
- 重命名表,rename操作
- 创建删除索引,重命名索引操作
- 更改列的默认值
- 修改字段定义长度
- 添加字段,增加列
- 重命名列
- 以上操作都不包括修改字段类型定义
其余则使用COPY算法。可以在ALTER TABLE 语句后制定算法和锁定模式:ALGORITHM=INPLACE,LOCK=NONE;
在无法使用INPLACE算法时,改语句将报错终止。
ALTER TABLE要求:
1、有足够的空间。所有操作产生的日志文件都将记录。可以由innodb_online_alter_log_max_size参数控制。
2、临时排序空间,参数:
--tmpdir
在进行ALTER TABLE 操作时,确认没有很大的事物在执行,确认硬盘空间足够,确认该表上的事物执行完成。