MySQL Online DDL 原理和踩坑
閱讀本文大概需要 4 分鐘。
來自:網(wǎng)絡(luò),侵刪
按照表 A 的定義新建一個表 B
對表 A 加寫鎖
在表 B 上執(zhí)行 DDL 指定的操作
將 A 中的數(shù)據(jù)拷貝到 B
釋放 A 的寫鎖
刪除表 A
將表 B 重命名為 A
用法

ALGORITHM=INPLACE 表示執(zhí)行DDL的過程中不發(fā)生表拷貝,過程中允許并發(fā)執(zhí)行DML(INPLACE不需要像COPY一樣占用大量的磁盤I/O和CPU,減少了數(shù)據(jù)庫負(fù)載。同時減少了buffer pool的使用,避免 buffer pool 中原有的查詢緩存被大量刪除而導(dǎo)致的性能問題)。
如果設(shè)置 ALGORITHM=COPY,DDL 就會按 MySQL 5.6 之前的方式,采用表拷貝的方式進(jìn)行,過程中會阻塞所有的DML。另外也可以設(shè)置 ALGORITHEM=DAFAULT,讓 MySQL 以盡量保證 DML 并發(fā)操作的原則選擇執(zhí)行方式。LOCK=NONE 表示對 DML 操作不加鎖,DDL 過程中允許所有的 DML 操作。此外還有 EXCLUSIVE(持有排它鎖,阻塞所有的請求,適用于需要盡快完成DDL或者服務(wù)庫空閑的場景)、SHARED(允許SELECT,但是阻塞INSERT UPDATE DELETE,適用于數(shù)據(jù)倉庫等可以允許數(shù)據(jù)寫入延遲的場景)和 DEFAULT(根據(jù)DDL的類型,在保證最大并發(fā)的原則下來選擇LOCK的取值)



執(zhí)行過程
初始化:根據(jù)存儲引擎、用戶指定的操作、用戶指定的 ALGORITHM 和 LOCK 計算 DDL 過程中允許的并發(fā)量,這個過程中會獲取一個 shared metadata lock,用來保護(hù)表的結(jié)構(gòu)定義
執(zhí)行 DDL:根據(jù)第一步的情況決定是否將 shared metadata lock 升級為 exclusive metadata lock(僅在語句準(zhǔn)備階段),然后生成語句并執(zhí)行。執(zhí)行期間的 shared metadata lock 保證了不會同時執(zhí)行其他的 DDL,但 DML 能可以正常執(zhí)行
提交:將 shared metadata lock 升級為 exclusive metadata lock,然后刪除舊的表定義,提交新的表定義

踩坑





Session 1 中的事務(wù)沒有及時提交,因此阻塞了 Session 3 的 DDL
Session 3 Online DDL 阻塞了后續(xù)的 DML 和 DDL
推薦閱讀:
美女學(xué)霸考 692 分想當(dāng)“程序媛”,網(wǎng)友:快勸勸孩子!
批處理框架 Spring Batch 這么強(qiáng),你會用嗎?
最近面試BAT,整理一份面試資料《Java面試BATJ通關(guān)手冊》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。
朕已閱 

