MySQL 5 7 online ddl的一些改進

2021-09-20 11:41:11 字數 2263 閱讀 9737

mysql dba應該都知道,資料庫操作裡面,ddl操作(比如create,drop,alter等)代價是非常高的,特別是在單錶上千萬的情況下,加個索引或改個列型別,就有可能堵塞整個表的讀寫。

支援了對於tinyint、int、smallint、bigint等數值型別的資料型別,自身位大小的增大或減小是支援online的(注意:不支援從tinyint變更為int),如下:

mysql> alter table t1 change id id bigint(10),algorithm=inplace,lock=none;

query ok, 0 rows affected (0.01 sec)

records: 0  duplicates: 0  warnings: 0

mysql> alter table t1 change id id bigint(30),algorithm=inplace,lock=none;

query ok, 0 rows affected (0.01 sec)

records: 0  duplicates: 0  warnings: 0

另外,如果是更改字段屬性(型別不變)根據型別不同支援的online ddl也是有限的,如把允許為null變更為不允許為null就不支援。

mysql> alter table sbtest change column dd dd varchar(100) not null,algorithm=inplace,lock=none;

error 1846 (0a000): algorithm=inplace is not supported. reason: cannot silently convert null values, as required in this sql_mode. try algorithm=copy;

mysql> alter table info change dd dd varchar(100) null comment "test",algorithm=inplace,lock=none;

需要注意的是,在mysql 5.6之前使用alter table … algorithm=inplace的表不支援包含時間列(date,datetime,timestamp),不然會報錯。

mysql 5.7版本支援重新命名索引和修改varchar的大小(增大不能減小),且無需table-copy(秒級增加varchar大小)。這兩項操作在之前的版本中,都需要重建索引或表,適用於各引擎。

mysql> alter table sbtest algorithm=inplace,change column dt td varchar(100);

但存在限制,即只支援0~255位元組內的或者255以上位元組間的增加,也就是說若從254增到256時不能使用inplace演算法(增加到255可以),必須使用copy演算法,否則會報錯。這個原理就是varchar會在頭部儲存乙個長度,如果小於255就是乙個bytes位元組,8位;如果大於255當然就需要兩個位元組 了。頭部都變了,自然要重新copy table了。另外使用inplace演算法縮小varchar的alter table也是不支援的,必須用copy演算法。

mysql> alter table sbtest add column td varchar(10);

query ok, 0 rows affected (10.81 sec)

records: 0  duplicates: 0  warnings: 0

mysql> alter table sbtest algorithm=inplace,change column td td varchar(254);

query ok, 0 rows affected (0.01 sec)

records: 0  duplicates: 0  warnings: 0

mysql> alter table sbtest algorithm=inplace,change column td td varchar(256);

error 1846 (0a000): algorithm=inplace is not supported. reason: cannot change column type inplace. try algorithm=copy.

總結:

1.對於tinyint、int、smallint、bigint等數值型別,自身位大小的增大或減小是支援online的(注意:不支援從tinyint變更為int)

2.varchar型別,只支援0~255位元組內的或者255以上位元組間的增加,不支援縮小

3.online ddl盡量在業務低峰期執行,以免產生mdl鎖

mysql5 7學習 mysql 5 7 學習

mysql uroot proot mysql5.7 mysql.user表沒有password欄位改 authentication string 一.建立使用者 命令 create user username host identified by password 例子 create user d...

mysql57 MySQL57安裝與設定

安裝mysql 新增mysql源 安裝mysql root localhost yum y install mysql community server 啟動mysql 檢查狀態 設定為開機自啟 root localhost systemctl start mysqld root localhost...

mysql5 7如何開啟 mysql57怎麼開啟

開啟mysql57的方法 首先開啟winodws執行視窗 然後在開啟編輯框中輸入cmd命令 最後在終端介面中輸入 mysql hlocalhost uroot p123 即可顯示開啟mysql資料庫。windows下用命令列啟動mysql5.7 win菜單鍵即是在鍵盤左下角 ctrl控制 鍵與 al...