mysql5.6的online ddl功能測試

hxw2ljj發表於2015-10-30


online DDL的前身是 innodb fast index creation(5.1和5.5), 5.6裡對這個功能做了擴充套件:
很多alter table的操作繞開了 table copying,支援DML併發操作。


一、online ddl的支援測試:
1、主鍵的增刪
主鍵新增:
支援online ddl,加主鍵過程中支援 併發的DML
主鍵刪除:
不支援online ddl,刪除主鍵過程需要copy table,導致DML被阻塞


2、索引的增刪
1)普通索引
5.5使用新的邏輯(fast index creation),不再copy表,(引數old_alter_table),加快的索引的建立和刪除,
                            但是會阻塞DML,可以select
5.6中建立和刪除索引不再阻塞dml
2)unique索引
同上


3、欄位的增刪改
新增:
(alter table test add hehe2 int default 100)
5.5阻塞 DML,支援select
5.6支援併發DML
刪除:
(alter table test drop hehe2)
5.5阻塞 DML,支援select
5.6支援併發DML
修改:
  只改欄位名:
(alter table test change hehe2 hehe20 int default '100')
5.5阻塞 DML,支援select
5.6支援online ddl,併發DML
  修改欄位型別:
(alter table test change hehe20 hehe2 varchar(100) default '100')
5.5阻塞 DML,支援select
5.6不再支援online ddl

 

http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html
中的Table 14.5列出了詳細的online ddl支援的操作型別,
但是實際上並不需要記憶這麼多:

二、新引入語法:
在5.6中,alter table增加了新的語法:
ALGORITHM [=] {DEFAULT|INPLACE|COPY}
LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE}
ALGORITHM:
INPLACE: 不copy table
COPY:     copy table
DEFAULT:

LOCK:
DEFAULT:    mysql自己選擇鎖定資源最少的方式
NONE:      支援select和DML
SHARED:   支援select,不支援DML
EXCLUSIVE:不支援select,不支援DML


可以借用這個新增語法測試是否alter table語句支援online DDL:
新建一個表結構一樣的表,儲存少量的資料:
root:3306:popo>alter table test change hehe2 hehe20 int default '100' ,LOCK=NONE;              
ERROR 1846 (0A000): LOCK=NONE is not supported. Reason: Cannot change column type INPLACE. Try LOCK=SHARED.
根據提示,這個欄位型別修改的alter table不支援併發的DML操作

root:3306:popo>alter table test change hehe2 hehe20 int default 100,  ALGORITHM=inplace;
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
同樣 這個alter table 也需要copy table操作。


三、online ddl相關引數和原理:
innodb_online_alter_log_max_size
 online ddl的原理是,mysql把在ddl時間內的所有的 插入,更新和刪除操作記錄到一個日誌檔案,
然後再把這些增量資料應用到相應的表上(等表上的事務完全釋放後),這個臨時日誌檔案的上限值由
innodb_online_alter_log_max_size指定,每次擴充套件innodb_sort_buffer_size的大小 該引數如果太小,
有可能導致DDL失敗,這期間所有的未提交的併發DML操作都會回滾;但是如果太大
會可能會導致後DDL操作最後鎖定表的時間更長(鎖定表,應用日誌到表上)。
每一個變化的索引或者表都會分配一個。


參考:
http://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl.html
http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-examples.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18796236/viewspace-1818792/,如需轉載,請註明出處,否則將追究法律責任。

相關文章