您的位置:首页 > 数据库 > MySQL

mysql5.6在线DDL修改字段测试

2016-04-24 15:52 597 查看
基本信息:

(product)root@localhost [lots]> select @@version;

+------------+

| @@version |

+------------+

| 5.6.29-log |

+------------+

1 row in set (0.00 sec)

lots.t_order表结构:

(product) desc t_order;

+-------------------+--------------+------+-----+-------------------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------------------+--------------+------+-----+-------------------+----------------+

| ID | int(11) | NO | PRI | NULL | auto_increment |

| CUSTOMER_ID | varchar(50) | YES | | NULL | |

| CUSTOMER_NAME | varchar(200) | YES | | NULL | |

| WAREHOUSE_NAME | varchar(200) | YES | | NULL | |

| CUSTOMER_ORDER_NO | varchar(50) | YES | MUL | NULL | |

| ANNTO_ORDER_NO | varchar(50) | YES | MUL | NULL | |

| EXPRESS_CODE | varchar(20) | YES | MUL | NULL | |

| EXPRESS_NAME | varchar(50) | YES | | NULL | |

| EXPRESS_NO | varchar(100) | YES | MUL | NULL | |

| ORDER_TYPE | varchar(20) | YES | | NULL | |

| ORDER_SOURCE | varchar(20) | YES | | NULL | |

| SHIP_TO_NAME | varchar(50) | YES | | NULL | |

| SHIP_TO_ADRESS | varchar(400) | YES | | NULL | |

| SHIP_TO_PROVINCE | varchar(50) | YES | | NULL | |

| SHIP_TO_CITY | varchar(50) | YES | | NULL | |

| SHIP_TO_AREA | varchar(50) | YES | | NULL | |

| SHIP_TO_MOBILE1 | varchar(50) | YES | | NULL | |

| SHIP_TO_MOBILE2 | varchar(50) | YES | | NULL | |

| CREATE_DATE | datetime | YES | MUL | CURRENT_TIMESTAMP | |

| IS_SIGN | varchar(1) | YES | | 0 | |

| SIGN_DATE | datetime | YES | | NULL | |

| is_delivery | varchar(1) | YES | | 0 | |

| delivery_date | datetime | YES | | NULL | |

| business_type | varchar(10) | YES | | NULL | |

| contract_no | varchar(50) | YES | MUL | NULL | |

| edi_id | varchar(10) | YES | | NULL | |

| is_got | varchar(1) | YES | | 0 | |

| got_date | datetime | YES | | NULL | |

| is_end | varchar(1) | YES | | 0 | |

+-------------------+--------------+------+-----+-------------------+----------------+

29 rows in set (0.00 sec)

表lots.t_order的记录数:

(product) select count(*) from lots.t_order;

+----------+

| count(*) |

+----------+

| 1872178 |

+----------+

1 row in set (0.31 sec)

控制是否启用老版本修改表的参数:

(product) show variables like 'old_alter_table';

+-----------------+-------+

| Variable_name | Value |

+-----------------+-------+

| old_alter_table | OFF |

+-----------------+-------+

1 row in set (0.00 sec)

控制在线ddl过程中临时存放日志的参数:

(product) show variables like 'innodb_online_alter_log_max_size';

+----------------------------------+-----------+

| Variable_name | Value |

+----------------------------------+-----------+

| innodb_online_alter_log_max_size | 134217728 |

+----------------------------------+-----------+

1 row in set (0.00 sec)

场景一:

测试利用ALGORITHM=COPY,LOCK=EXCLUSIVE方式修改SHIP_TO_ADRESS字段类型varchar(400)为varchar(500)的所需时间,并监控表是否有加锁?

1.会话1先执行每秒监控查询表lots.t_order是否有锁,并记录到txt文件

#!/bin/bash

while : ;do

date>>/data/mysql/mysql3376/data/lock.txt &&

mysql -uroot -psafe_2016 -S /tmp/mysql3376.sock -e "show open tables from lots where In_use>0">>/data/mysql/mysql3376/data/lock.txt

sleep 1

done

2.会话2执行修改脚本

(product)root@localhost [(none)]> alter table lots.t_order modify SHIP_TO_ADRESS varchar(500),ALGORITHM=COPY,LOCK=EXCLUSIVE;

Query OK, 1872178 rows affected (1 min 32.92 sec)

Records: 1872178 Duplicates: 0 Warnings: 0

3.查看lock.txt

cat lock.txt

Database Table In_use Name_locked

lots t_order 1 0

.......中间省略......

Database Table In_use Name_locked

lots t_order 1 0

4.将字段长度改回400,并重启mysql,以清空buffer pool缓存数据

alter table lots.t_order modify SHIP_TO_ADRESS varchar(400);

并重启mysql。

小结:监控到表lots.t_order在修改字段过程中有锁表,且修改时间为32.92秒。

场景二:

测试利用ALGORITHM=COPY,LOCK=SHARED方式修改SHIP_TO_ADRESS字段类型varchar(400)为varchar(500)的所需时间,并监控表是否有加锁?

1.会话1先执行每秒监控查询表lots.t_order是否有锁,并记录到txt文件

#!/bin/bash

while : ;do

date>>/data/mysql/mysql3376/data/lock.txt &&

mysql -uroot -psafe_2016 -S /tmp/mysql3376.sock -e "show open tables from lots where In_use>0">>/data/mysql/mysql3376/data/lock.txt

sleep 1

done

2.会话2执行修改脚本

(product)root@localhost [(none)]> alter table lots.t_order modify SHIP_TO_ADRESS varchar(500),ALGORITHM=COPY,LOCK=SHARED;

Query OK, 1872178 rows affected (1 min 33.41 sec)

Records: 1872178 Duplicates: 0 Warnings: 0

3.查看lock.txt

cat lock.txt

Sun Apr 24 10:58:52 HKT 2016

Database Table In_use Name_locked

lots t_order 1 0

---中间省略----

Sun Apr 24 11:00:24 HKT 2016

Database Table In_use Name_locked

lots t_order 1 0

4.将字段长度改回400,并重启mysql,以清空buffer pool缓存数据

alter table lots.t_order modify SHIP_TO_ADRESS varchar(400);

并重启mysql。

小结:监控到表lots.t_order在修改字段过程中有锁表,且修改时间为33.41秒。

场景三:

测试利用ALGORITHM=COPY,LOCK=SHARED方式修改SHIP_TO_ADRESS字段类型varchar(400)为varchar(500)的所需时间,并监控表是否有加锁?

1.会话1先执行每秒监控查询表lots.t_order是否有锁,并记录到txt文件

#!/bin/bash

while : ;do

date>>/data/mysql/mysql3376/data/lock.txt &&

mysql -uroot -psafe_2016 -S /tmp/mysql3376.sock -e "show open tables from lots where In_use>0">>/data/mysql/mysql3376/data/lock.txt

sleep 1

done

2.会话2执行修改脚本

mysql> alter table lots.t_order modify SHIP_TO_ADRESS varchar(500),ALGORITHM=COPY,LOCK=NONE;

ERROR 1846 (0A000): LOCK=NONE is not supported. Reason: COPY algorithm requires a lock. Try LOCK=SHARED.

mysql>

小结:ALGORITHM=COPY,LOCK=NONE两个参数不能同时组合使用,copy方式必需要加锁。

场景四:

测试利用ALGORITHM=INPLACE,LOCK=EXCLUSIVE方式修改SHIP_TO_ADRESS字段类型varchar(400)为varchar(500)的所需时间,并监控表是否有加锁?

1.会话1先执行每秒监控查询表lots.t_order是否有锁,并记录到txt文件

#!/bin/bash

while : ;do

date>>/data/mysql/mysql3376/data/lock.txt &&

mysql -uroot -psafe_2016 -S /tmp/mysql3376.sock -e "show open tables from lots where In_use>0">>/data/mysql/mysql3376/data/lock.txt

sleep 1

done

2.会话2执行修改脚本

mysql> alter table lots.t_order modify SHIP_TO_ADRESS varchar(500),ALGORITHM=INPLACE,LOCK=EXCLUSIVE;

ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.

小结:mysql 5.6版本不支持inplace方式修改字段。

场景五:

测试利用默认方式修改SHIP_TO_ADRESS字段类型varchar(400)为varchar(500)的所需时间,并监控表是否有加锁?

1.会话1先执行每秒监控查询表payment是否有锁,并记录到txt文件

#!/bin/bash

while : ;do

date>>/data/mysql/mysql3376/data/lock.txt &&

mysql -uroot -psafe_2016 -S /tmp/mysql3376.sock -e "show open tables from lots where In_use>0">>/data/mysql/mysql3376/data/lock.txt

sleep 1

done

2.会话2执行修改脚本

mysql> alter table lots.t_order modify SHIP_TO_ADRESS varchar(500);

Query OK, 1872178 rows affected (1 min 43.12 sec)

Records: 1872178 Duplicates: 0 Warnings: 0

3.查看lock.txt

cat lock.txt

Sun Apr 24 15:38:43 HKT 2016

Database Table In_use Name_locked

lots t_order 1 0

---中间省略---

Database Table In_use Name_locked

lots t_order 1 0

小结:默认方式监控到表lots.t_order在修改字段过程中有锁表,且修改字段时间为43.12秒。

总结:

1.mysql5.6不支持inplace方式在线修改字段,只支持copy方式,即默认行为.

2.ALGORITHM=COPY,LOCK=NONE两个参数不能同时组合使用,因为copy方式必需要加锁。

3.mysql 5.6在线ddl修改字段的行为与maridb 10.0.20是一致的。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: