ALTER TABLE语句引发的事故

今天开发那边过来和我说他那边数据库无法提交数据,一直卡住

我查看了一下进程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:初始化

    在初始化阶段,服务器确定操作期间允许的并发数,同时考虑存储引擎功能,语句中指定的操作以及用户指定的 选项ALGORITHMLOCK选项。在此阶段,将采用共享的可升级元数据锁来保护当前表定义。

  • 阶段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 操作时,确认没有很大的事物在执行,确认硬盘空间足够,确认该表上的事物执行完成。

猜你喜欢

转载自blog.csdn.net/baijiu1/article/details/83861885