1. 程式人生 > >ALTER TABLE語句引發的事故

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 操作時,確認沒有很大的事物在執行,確認硬碟空間足夠,確認該表上的事物執行完成。