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是一致的。
(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是一致的。
相关文章推荐
- MySQL存储引擎
- mysql load data local infile error
- MySQL(三) —— 约束以及修改数据表
- mysql中profile的使用
- MySQLdb模块中的常用方法
- MySQL数据库介绍及基本操作
- mysql 执行reset master 风险
- commandline (命令行)登录mysql
- mysql总结
- Mysql——分组排序加序列号
- [笔记]在Mac下进行mysql操作细节
- Mysql批量删除和修改某个前缀的表
- MySQL排错工具perror
- MySQL排错工具perror
- MySQL datetime数据类型设置当前时间为默认值
- HIVE+mysql环境搭建及简单应用
- mysql 时间
- 查看修改mysql编码方式
- mysql死锁,等待资源,事务锁,Lock wait timeout exceeded; try restarting transaction解决
- 绿色版mysql