I'm running the following ALTER
command on a MySQL 5.6 database on a large table with 60 million rows:
ALTER TABLE `large_table` ADD COLUMN `note` longtext NULL,
ALGORITHM=INPLACE, LOCK=NONE;
Despite specifying both ALGORITHM=INPLACE
and LOCK=NONE
, the table gets locked and essentially takes down the app until the migration is complete.
I verified that the table was indeed locked by checking the value of the In_use
column on the output of the SHOW OPEN TABLES
command. It was set to 1
.
From what I gather in the MySQL documentation, this operation should not be locking the table. And, MySQL is supposed to fail the command if it is not able to proceed without a lock. I upgraded the database to MySQL 5.7 to see if it's any better, but I face the same problem on 5.7 too.
Is this an expected behavior? How do I find out what's going wrong here?
I assume you were not doing some other DDL on that table at about the same time?
For the future:
8.0.12 has ALTER TABLE .. ALGORITHM=INSTANT
for ADD COLUMN
. See Discussion and ALTER Reference and Online DDL Reference
The following limitations apply when the INSTANT algorithm is used to add a column:
Multiple columns may be added in the same ALTER TABLE statement.
If you can't upgrade then consider Percona's pt-online-schema-change
or a new, competing, product gh-ost
(which uses the binlog).