您好,登錄后才能下訂單哦!
Online DDL從名字上看很容易誤導(dǎo)新手,以為不論什么情況,修改表結(jié)構(gòu)都不會鎖表,理想很豐滿,現(xiàn)實很骨感,注意這個坑!
有以下兩種情況執(zhí)行DDL操作會鎖表的,Waiting for table metadata lock(元數(shù)據(jù)表鎖)
1、增加、刪除字段或索引不會鎖全表,刪除主鍵、更改字段屬性會鎖全表,見下圖所示:
2、在添加字段alter table表時,對該表的增、刪、改、查均不會鎖表。而在這之前,該表有被訪問時,需要等其執(zhí)行完畢后,才可以執(zhí)行alter table,例如在會話一,故意執(zhí)行一條大結(jié)果的查詢,然后在會話二執(zhí)行增加字段age,此時還會出現(xiàn)表鎖,如下圖所示:
針對第二種情況,MariaDB10.3 增補AliSQL補丁-DDL FAST FAIL,讓其DDL操作快速失敗。
語法為:
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(以秒為單位設(shè)置等待)或NOWAIT在語句中顯式設(shè)置鎖等待超時,在這種情況下,如果無法獲取鎖,語句將立即失敗。 WAIT 0相當于NOWAIT。
參考:https://jira.mariadb.org/browse/MDEV-11388
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。