Online DDL從名字上看很容易誤導新手,覺得不論什麼狀況,修改表結構都不會鎖表,理想很豐滿,現實很骨感,注意這個坑!bash
有如下兩種狀況執行DDL操做會鎖表的,Waiting for table metadata lock(元數據表鎖)ide
一、增長、刪除字段或索引不會鎖全表,刪除主鍵、更改字段屬性會鎖全表,見下圖所示:spa
二、在添加字段alter table表時,對該表的增、刪、改、查均不會鎖表。而在這以前,該表有被訪問時,須要等其執行完畢後,才能夠執行alter table,例如在會話一,故意執行一條大結果的查詢,而後在會話二執行增長字段age,此時還會出現表鎖,以下圖所示:3d
針對第二種狀況,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]
例:圖片
若是線上有某個慢SQL對該表進行操做,能夠使用WAIT n(以秒爲單位設置等待)或NOWAIT在語句中顯式設置鎖等待超時,在這種狀況下,若是沒法獲取鎖,語句將當即失敗。 WAIT 0至關於NOWAIT。
get