online ddl
阿新 • • 發佈:2019-03-01
工作原理 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