mysql 5.6 online ddl測試 在生產環境中,因為業務需求,改動mysql表結構,特別是數據量特別大的時候,幾百萬甚至幾千萬的數據,mysql online ddl操作非常讓mysql dba揪心。5.6版本支持online ddl。 為什麼mysql ddl操作讓dba揪心呢?因為mysql ddl操作內部原理是這樣的: 1create table tmp like table2 (創建臨時表,與原表相似) 2insert into tmp select * from table2 (原數據拷貝到臨時表裡,並且索引等信息與原表一樣) 3drop table table1 刪除原表 4rename tmp to table1 臨時表名改名為原表 在整個過程中,原表table1加共享鎖(s鎖),這樣對業務影響就很大,作業造成阻塞(曾經同事晚上11點增加字段,導致訂單業務受到影響)接下來測試一下。在mysql5.6版本裡,進行了優化,alter table table1 add ….操作時,增、刪、改、查都不會鎖表. 首先准備測試數據,盡量千萬以上,測試效果明顯 [root@aeolus1 bin]# sysbench --test=oltp--oltp-table-size=15000000 --mysql-db=test --mysql-user=root prepare sysbench 0.4.12: multi-threaded system evaluation benchmark No DB drivers specified, using mysql Creating table 'sbtest'... Creating 15000000 records in table'sbtest'... 其中一個會話執行 mysql> alter table sbtest add testvarchar(10); 另一會話執行 mysql> insert into sbtestvalues(0,1,'abc','abc'); Query OK, 1 row affected (0.44 sec) mysql> delete from sbtest where id=2000; Query OK, 1 row affected (1.21 sec) mysql> update sbtest set k=3 whereid=20000; Query OK, 1 row affected (0.59 sec) Rows matched: 1 Changed: 1 Warnings: 0 順利執行完畢,沒有鎖表。 當有會話訪問時,花費時間比較長,這時進行alter table sbtest add 操作,alter table sbtest操作會等這個會話結束後,再進行ddl操作。