mysql版本:5.7.28
表結構
CREATE TABLE `t2` ( `id` int(11) NOT NULL AUTO_INCREMENT, `col1` int(11) DEFAULT NULL, `col2` bigint(20) DEFAULT NULL, `col3` text, `col4` varchar(30) DEFAULT NULL, `col5` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `un_index` (`col1`) ) ENGINE=InnoDB AUTO_INCREMENT=11057632 DEFAULT CHARSET=utf8mb4;
在添加字段的時候報錯1062
sql>ALTER TABLE t2 ADD COLUMN col6 INT ( 11 );
1062 - Duplicate entry '2068603194' for key 'un_index', Time: 37.923000s
問題原因:表數據較多在執行alter table期間有其他會話執行了造成duplicate entry的語句使online ddl在執行完結構變更回放緩存的時候報錯。
Oline DDL的原理簡單一點理解就是將DML操作緩存起來,等到DDL執行完成后重新應用緩存中的DML語句,如果在Oline DDL執行過程中,DML操作產生了Duplicate entry錯誤,並不會直接影響DDL操作,而是在DDL執行完成最終應用DML時報錯,導致DDL執行失敗。官方認為該問題是一種限制,並不是Bug,所以目前為止還沒有得到解決。
經過測試只有在唯一鍵沖突的時候(insert,update)才會影響到DDL,主鍵沖突沒有影響。
另外在執行insert into ... on duplicate key...或者replace into語句的時候只要是更新了唯一鍵的字段也會影響online DDL的運行。