MariaDB10.3 增补AliSQL补丁---安全执行Online DDL

Online DDL从名字上看很容易误导新手,觉得不论什么状况,修改表结构都不会锁表,理想很丰满,现实很骨感,注意这个坑!bash


有如下两种状况执行DDL操做会锁表的,Waiting for table metadata lock(元数据表锁)ide

一、增长、删除字段或索引不会锁全表,删除主键、更改字段属性会锁全表,见下图所示:图片.pngspa


二、在添加字段alter table表时,对该表的增、删、改、查均不会锁表。而在这以前,该表有被访问时,须要等其执行完毕后,才能够执行alter table例如在会话一,故意执行一条大结果的查询,而后在会话二执行增长字段age,此时还会出现表锁,以下图所示:3d

图片.png


针对第二种状况,MariaDB10.3 增补AliSQL补丁-DDL FAST FAIL,让其DDL操做快速失败。blog

语法为:索引

ALTER TABLE tbl_name [WAIT n|NOWAIT] ...
CREATE ... INDEX ON tbl_name (index_col_name, ...) [WAIT n|NOWAIT] ...
DROP INDEX ... [WAIT n|NOWAIT]
DROP TABLE tbl_name [WAIT n|NOWAIT] ...
LOCK TABLE ... [WAIT n|NOWAIT]
OPTIMIZE TABLE tbl_name [WAIT n|NOWAIT]
RENAME TABLE tbl_name [WAIT n|NOWAIT] ...
SELECT ... FOR UPDATE [WAIT n|NOWAIT]
SELECT ... LOCK IN SHARE MODE [WAIT n|NOWAIT]
TRUNCATE TABLE tbl_name [WAIT n|NOWAIT]


例:图片

图片.png

若是线上有某个慢SQL对该表进行操做,能够使用WAIT n(以秒为单位设置等待)或NOWAIT在语句中显式设置锁等待超时,在这种状况下,若是没法获取锁,语句将当即失败。 WAIT 0至关于NOWAIT。
get


参考:https://jira.mariadb.org/browse/MDEV-11388
it

相关文章
相关标签/搜索