ALTER TABLE語句引發的事故
今天開發那邊過來和我說他那邊資料庫無法提交資料,一直卡住
我查看了一下程序show processlist,發現有幾條delete語句和insert語句,已經執行了6000多秒了,都是非常簡單的語句
在RR模式下:
有幾條語句:
alter table tbname drop primary key; 執行了6000多秒。
其他delete,insert操作也一直卡在哪裡。
ALTER TBALE DROP PRIMARY KEY操作會使用COPY演算法,把整張表進行重建操作。
mysql的線上DDL語句會等待事物完成後再執行,但是會阻塞後面的事物。
如:
第一個session:
begin;
select * from test;
第二個session:
alter table test drop primary key; 等待事物一完成
第三個session:
select * from test; 這時候會阻塞這條語句
線上DDL操作可以分為三個階段:
-
階段1:初始化
在初始化階段,伺服器確定操作期間允許的併發數,同時考慮儲存引擎功能,語句中指定的操作以及使用者指定的 選項
ALGORITHM
LOCK
選項。在此階段,將採用共享的可升級元資料鎖來保護當前表定義。 -
階段2:執行
在此階段,準備並執行該陳述。元資料鎖是否升級為獨佔取決於初始化階段評估的因素。如果需要獨佔元資料鎖定,則僅在語句準備期間進行短暫鎖定。
-
階段3:提交表定義
在提交表定義階段,元資料鎖升級為獨佔以驅逐舊錶定義並提交新表定義。授予後,獨佔元資料鎖定的持續時間很短。
ALTER TABLE 使用以下兩種演算法之一處理操作:
-
COPY
:對原始表的副本執行操作,並將表資料從原始表逐行復制到新表。不允許併發DML。 -
INPLACE
:避免複製表資料操作,可以在適當的位置重建表。在操作的準備和執行階段期間可以短暫地對錶進行獨佔元資料鎖定。支援併發DML。
使用INPLACE演算法的操作:
- 重命名錶,rename操作
- 建立刪除索引,重新命名索引操作
- 更改列的預設值
- 修改欄位定義長度
- 新增欄位,增加列
- 重新命名列
- 以上操作都不包括修改欄位型別定義
其餘則使用COPY演算法。可以在ALTER TABLE 語句後製定演算法和鎖定模式:ALGORITHM=INPLACE,LOCK=NONE;
在無法使用INPLACE演算法時,改語句將報錯終止。
ALTER TABLE要求:
1、有足夠的空間。所有操作產生的日誌檔案都將記錄。可以由innodb_online_alter_log_max_size引數控制。
2、臨時排序空間,引數:
--tmpdir
在進行ALTER TABLE 操作時,確認沒有很大的事物在執行,確認硬碟空間足夠,確認該表上的事物執行完成。