| Bug #77097 | InnoDB Online DDL should support change data type | ||
|---|---|---|---|
| Submitted: | 19 May 2015 14:20 | Modified: | 4 Jan 2018 10:32 |
| Reporter: | Morgan Tocker | Email Updates: | |
| Status: | Verified | Impact on me: | |
| Category: | MySQL Server: InnoDB storage engine | Severity: | S4 (Feature request) |
| Version: | 5.6 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
[19 May 2015 14:20]
Morgan Tocker
[28 Jun 2015 10:21]
Daniël van Eeden
Some more column changes which are not online in 5.6.24
- ascii -> latin1
- char(10) -> char(11)
- NULL -> NOT NULL
ascii data is valid latin1 (the reverse is only true if all chars<127)
ascii data is valid utf8 (the reverse is only true if only single byte chars are used)
ascii is 7-bit per character, but often stored as 1-byte (8-bit) per character. latin1 is always 1-byte per character.
mysql-5.6.24> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`foo` char(10) CHARACTER SET ascii DEFAULT NULL,
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql-5.6.24> ALTER TABLE t1 MODIFY COLUMN `foo` char(10) CHARACTER SET latin1 DEFAULT NULL, LOCK=NONE, ALGORITHM=INPLACE;
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
mysql-5.6.24> ALTER TABLE t1 MODIFY COLUMN `foo` char(10) CHARACTER SET latin1 DEFAULT NULL, LOCK=NONE, ALGORITHM=COPY;
ERROR 1846 (0A000): LOCK=NONE is not supported. Reason: COPY algorithm requires a lock. Try LOCK=SHARED.
mysql-5.6.24> ALTER TABLE t1 MODIFY COLUMN `foo` char(11) CHARACTER SET ascii DEFAULT NULL, LOCK=NONE, ALGORITHM=INPLACE;
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
mysql-5.6.24> ALTER TABLE t1 MODIFY COLUMN `foo` char(11) CHARACTER SET ascii DEFAULT NULL, LOCK=NONE, ALGORITHM=COPY;
ERROR 1846 (0A000): LOCK=NONE is not supported. Reason: COPY algorithm requires a lock. Try LOCK=SHARED.
mysql-5.6.24> ALTER TABLE t1 MODIFY COLUMN `foo` char(10) CHARACTER SET ascii NOT NULL, LOCK=NONE, ALGORITHM=INPLACE;
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: cannot silently convert NULL values, as required in this SQL_MODE. Try ALGORITHM=COPY.
mysql-5.6.24> ALTER TABLE t1 MODIFY COLUMN `foo` char(10) CHARACTER SET ascii NOT NULL, LOCK=NONE, ALGORITHM=COPY;
ERROR 1846 (0A000): LOCK=NONE is not supported. Reason: COPY algorithm requires a lock. Try LOCK=SHARED.
[28 Jun 2015 10:25]
Daniël van Eeden
5.7.7 is similar but allows NULL to NOT NULL change.
mysql-5.7.7-rc-debug> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`foo` char(10) CHARACTER SET ascii DEFAULT NULL,
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.02 sec)
mysql-5.7.7-rc-debug> ALTER TABLE t1 MODIFY COLUMN `foo` char(10) CHARACTER SET latin1 DEFAULT NULL, LOCK=NONE, ALGORITHM=INPLACE;
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
mysql-5.7.7-rc-debug> ALTER TABLE t1 MODIFY COLUMN `foo` char(10) CHARACTER SET latin1 DEFAULT NULL, LOCK=NONE, ALGORITHM=COPY;
ERROR 1846 (0A000): LOCK=NONE is not supported. Reason: COPY algorithm requires a lock. Try LOCK=SHARED.
mysql-5.7.7-rc-debug> ALTER TABLE t1 MODIFY COLUMN `foo` char(11) CHARACTER SET ascii DEFAULT NULL, LOCK=NONE, ALGORITHM=INPLACE;
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
mysql-5.7.7-rc-debug> ALTER TABLE t1 MODIFY COLUMN `foo` char(11) CHARACTER SET ascii DEFAULT NULL, LOCK=NONE, ALGORITHM=COPY;
ERROR 1846 (0A000): LOCK=NONE is not supported. Reason: COPY algorithm requires a lock. Try LOCK=SHARED.
mysql-5.7.7-rc-debug> ALTER TABLE t1 MODIFY COLUMN `foo` char(10) CHARACTER SET ascii NOT NULL, LOCK=NONE, ALGORITHM=INPLACE;
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
[18 Jun 2016 21:26]
Omer Barnir
Posted by developer: Reported version value updated to reflect release name change from 5.8 to 8.0
[4 Jan 2018 10:32]
MySQL Verification Team
Verified: -- drop table if exists t; create table t(a mediumint(8) not null auto_increment,b blob,primary key(a))engine=innodb; insert into t(b) values(uuid()),(uuid()),(uuid()),(uuid()),(uuid()),(uuid()),(uuid()),(uuid()),(uuid()),(uuid()); insert into t(b) select uuid() from t a,t b,t c,t d,t e,t f; alter table t change a a int(8) not null auto_increment, algorithm=inplace,lock=none; alter table t change a a int(8) not null auto_increment, algorithm=copy,lock=shared; --
[4 Jan 2018 10:33]
MySQL Verification Team
Above testcase outputs: mysql> create table t(a mediumint(8) not null auto_increment,b blob,primary key(a))engine=innodb; Query OK, 0 rows affected (0.01 sec) mysql> insert into t(b) values(uuid()),(uuid()),(uuid()),(uuid()),(uuid()),(uuid()),(uuid()),(uuid()),(uuid()),(uuid()); Query OK, 10 rows affected (0.01 sec) Records: 10 Duplicates: 0 Warnings: 0 mysql> insert into t(b) select uuid() from t a,t b,t c,t d,t e,t f; Query OK, 1000000 rows affected (50.66 sec) Records: 1000000 Duplicates: 0 Warnings: 0 mysql> alter table t change a a int(8) not null auto_increment, algorithm=inplace,lock=none; ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY. mysql> alter table t change a a int(8) not null auto_increment, algorithm=copy,lock=shared; Query OK, 1000010 rows affected (46.66 sec) Records: 1000010 Duplicates: 0 Warnings: 0
[15 May 2018 17:20]
MySQL Verification Team
https://bugs.mysql.com/bug.php?id=90865 marked as duplicate of this one.
