1. 程式人生 > >online ddl

online ddl

工作原理 alter line RoCE blog 邏輯 https sha 獲取

(0)版本支持

    mysql5.5及之前的版本是不支持online ddl的, 需要鎖全表; 
    mysql5.6及之後的版本支持online ddl, 需要提前獲取mdl寫鎖, 在copy數據的時候會降級成mdl讀鎖; 

(1)online ddl簡單版工作原理

    1.建立一個臨時文件, 掃描表A主鍵的所有數據頁
    2.用數據頁中表A的記錄生成B+樹, 存儲到臨時文件中
    3.生成臨時文件的過程中, 對A的操作記錄到日誌文件中, 
    4.臨時文件生成後, 將日誌文件中的操作應用到臨時文件文件, 得到一個邏輯數據上與表A 相同的數據文件
    5.用臨時文件替換表A 的數據文件

技術分享圖片

說明: alter語句在啟動的時候事先獲取mdl寫鎖, 在拷貝數據的時候就退化成讀鎖, 讀鎖不阻塞增刪改數據, 但是會阻塞其它線程的ddl語句(例如alter等), 由於mdl寫鎖的占用時間比較短就被認為是online

(2)常見ddl操作

註意: mysql5.6.42版本不支持命令optimize table命令;修改列類型, 例如給主鍵數據類型由int修改為bigint會導致其他的會話對這個表操作鎖表; 

技術分享圖片

(3)是否鎖表驗證:對一個表的50萬數據, 修改這個表的列數據類型由int為bigint會導致鎖表
技術分享圖片

技術分享圖片

(4)給表添加字段驗證是否鎖表: 不會鎖表,但是要註意, 需要提前獲取mdl寫鎖

技術分享圖片
技術分享圖片

(5)給表加mdl讀鎖, alter語句會阻塞, 那是因為alter語句需要獲取mdl寫鎖, mdl寫鎖和mdl讀鎖互斥

開啟一個事務
技術分享圖片

在另外一個連接刪除這張表的字段
技術分享圖片

查看進程信息發現等待鎖超時
技術分享圖片

online ddl