This section discusses online table schema changes as
implemented in MySQL Cluster 5.1, using a syntax specific to
NDB that is now deprecated and
subject to removal in a future version of MySQL Cluster. This
syntax is not supported by any other storage engine, including
InnoDB. MySQL Cluster NDB 7.3 and
later support the standard ALTER
TABLE syntax employed by the MySQL Server
(ALGORITHM=DEFAULT|INPLACE|COPY), and
described elsewhere in this section.
Operations that add and drop indexes on variable-width columns
of NDB tables occur online. Online
operations are noncopying; that is, they do not require that
indexes be re-created. They do not lock the table being altered
from access by other API nodes in a MySQL Cluster (but see
Limitations later in this section). Such
operations do not require single user mode for
NDB table alterations made in a
cluster with multiple API nodes; transactions can continue
uninterrupted during online DDL operations.
The ONLINE keyword can be used to perform
online ADD COLUMN, ADD
INDEX (including CREATE INDEX
statements), and DROP INDEX operations on
NDB tables. Online renaming of
NDB tables is also supported.
The ONLINE and OFFLINE
keywords are supported only in MySQL Cluster. In standard
MySQL Server 5.6 releases, attempting to use the
ONLINE or OFFLINE
keyword in an ALTER TABLE,
CREATE INDEX, or
DROP INDEX statement results in
an error.
The ONLINE and OFFLINE
keywords are deprecated beginning with MySQL Cluster NDB 7.3.
They continue to be supported in MySQL Cluster NDB 7.4, but
are subject to removal in a future version of MySQL Cluster.
Currently you cannot add disk-based columns to
NDB tables online. This means that,
if you wish to add an in-memory column to an
NDB table that uses a table-level
STORAGE DISK option, you must declare the new
column as using memory-based storage explicitly. For
example—assuming that you have already created tablespace
ts1—suppose that you create table
t1 as follows:
mysql>CREATE TABLE t1 (>c1 INT NOT NULL PRIMARY KEY,>c2 VARCHAR(30)>)>TABLESPACE ts1 STORAGE DISK>ENGINE NDB;Query OK, 0 rows affected (1.73 sec) Records: 0 Duplicates: 0 Warnings: 0
You can add a new in-memory column to this table online as shown here:
mysql> ALTER ONLINE TABLE t1 ADD COLUMN c3 INT COLUMN_FORMAT DYNAMIC STORAGE MEMORY;
Query OK, 0 rows affected (1.25 sec)
Records: 0 Duplicates: 0 Warnings: 0
This statement fails if the STORAGE MEMORY
option is omitted:
mysql> ALTER ONLINE TABLE t1 ADD COLUMN c3 INT COLUMN_FORMAT DYNAMIC;
ERROR 1235 (42000): This version of MySQL doesn't yet support
'ALTER ONLINE TABLE t1 ADD COLUMN c3 INT COLUMN_FORMAT DYNAMIC'
If you omit the COLUMN_FORMAT DYNAMIC option,
the dynamic column format is employed automatically, but a
warning is issued, as shown here:
mysql>ALTER ONLINE TABLE t1 ADD COLUMN c3 INT STORAGE MEMORY;Query OK, 0 rows affected, 1 warning (1.17 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql>SHOW WARNINGS;+---------+------+---------------------------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------------------------+ | Warning | 1478 | Converted FIXED field to DYNAMIC to enable on-line ADD COLUMN | +---------+------+---------------------------------------------------------------+ 1 row in set (0.00 sec) mysql>SHOW CREATE TABLE t1\G*************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` varchar(30) DEFAULT NULL, `c3` int(11) /*!50120 STORAGE MEMORY */ /*!50120 COLUMN_FORMAT DYNAMIC */ DEFAULT NULL, `t4` int(11) /*!50120 STORAGE MEMORY */ DEFAULT NULL, PRIMARY KEY (`c1`) ) /*!50100 TABLESPACE ts_1 STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=latin1 1 row in set (0.03 sec)
The STORAGE and
COLUMN_FORMAT keywords are supported only
in MySQL Cluster; in any other version of MySQL, attempting to
use either of these keywords in a CREATE
TABLE or ALTER TABLE
statement results in an error.
It is also possible to use the statement ALTER ONLINE
TABLE ... REORGANIZE PARTITION with no
option on partition_names INTO
(partition_definitions)NDB tables. This can be
used to redistribute MySQL Cluster data among new data nodes
that have been added to the cluster online. For more information
about this statement, see
Section 13.1.7.1, “ALTER TABLE Partition Operations” For more
information about adding data nodes online to a MySQL Cluster,
see Section 18.5.13, “Adding NDB Cluster Data Nodes Online”.
Online DROP COLUMN operations are not
supported.
Online ALTER TABLE,
CREATE INDEX, or
DROP INDEX statements that add
columns or add or drop indexes are subject to the following
limitations:
A given online ALTER TABLE
can use only one of ADD COLUMN,
ADD INDEX, or DROP
INDEX. One or more columns can be added online in
a single statement; only one index may be created or dropped
online in a single statement.
The table being altered is not locked with respect to API
nodes other than the one on which an online
ALTER TABLE ADD
COLUMN, ADD INDEX, or
DROP INDEX operation (or
CREATE INDEX or
DROP INDEX statement) is run.
However, the table is locked against any other operations
originating on the same API node while
the online operation is being executed.
The table to be altered must have an explicit primary key;
the hidden primary key created by the
NDB storage engine is not
sufficient for this purpose.
The storage engine used by the table cannot be changed online.
When used with MySQL Cluster Disk Data tables, it is not
possible to change the storage type (DISK
or MEMORY) of a column online. This
means, that when you add or drop an index in such a way that
the operation would be performed online, and you want the
storage type of the column or columns to be changed, you
must use the OFFLINE keyword in the
statement that adds or drops the index.
Columns to be added online cannot use the
BLOB or
TEXT type, and must meet the
following criteria:
The columns must be dynamic; that is, it must be possible to
create them using COLUMN_FORMAT DYNAMIC.
If you omit the COLUMN_FORMAT DYNAMIC
option, the dynamic column format is employed automatically.
The columns must permit NULL values and
not have any explicit default value other than
NULL. Columns added online are
automatically created as DEFAULT NULL, as
can be seen here:
mysql>CREATE TABLE t1 (>c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY>) ENGINE=NDB;Query OK, 0 rows affected (1.44 sec) mysql>ALTER ONLINE TABLE t1>ADD COLUMN c2 INT,>ADD COLUMN c3 INT;Query OK, 0 rows affected, 2 warnings (0.93 sec) mysql>SHOW CREATE TABLE t1\G*************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, `c2` int(11) DEFAULT NULL, `c3` int(11) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=ndbcluster DEFAULT CHARSET=latin1 1 row in set (0.00 sec)
The columns must be added following any existing columns. If
you attempt to add a column online before any existing
columns or using the FIRST keyword, the
statement fails with an error.
Existing table columns cannot be reordered online.
For online ALTER TABLE operations
on NDB tables, fixed-format columns
are converted to dynamic when they are added online, or when
indexes are created or dropped online, as shown here:
mysql>CREATE TABLE t1 (>c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY>) ENGINE=NDB;Query OK, 0 rows affected (1.44 sec) mysql>ALTER ONLINE TABLE t1 ADD COLUMN c2 INT, ADD COLUMN c3 INT;Query OK, 0 rows affected, 2 warnings (0.93 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql>SHOW WARNINGS;+---------+------+---------------------------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------------------------+ | Warning | 1475 | Converted FIXED field to DYNAMIC to enable on-line ADD COLUMN | | Warning | 1475 | Converted FIXED field to DYNAMIC to enable on-line ADD COLUMN | +---------+------+---------------------------------------------------------------+ 2 rows in set (0.00 sec)
Existing columns, including the table's primary key, need not be dynamic; only the column or columns to be added online must be dynamic.
mysql>CREATE TABLE t2 (>c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY COLUMN_FORMAT FIXED>) ENGINE=NDB;Query OK, 0 rows affected (2.10 sec) mysql>ALTER ONLINE TABLE t2 ADD COLUMN c2 INT;Query OK, 0 rows affected, 1 warning (0.78 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql>SHOW WARNINGS;+---------+------+---------------------------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------------------------+ | Warning | 1475 | Converted FIXED field to DYNAMIC to enable on-line ADD COLUMN | +---------+------+---------------------------------------------------------------+ 1 row in set (0.00 sec)
Columns are not converted from FIXED to
DYNAMIC column format by renaming operations.
For more information about COLUMN_FORMAT, see
Section 13.1.17, “CREATE TABLE Syntax”.
The KEY, CONSTRAINT, and
IGNORE keywords are supported in
ALTER TABLE statements using the
ONLINE keyword.