Version sans cache

Mise en cache désactivé. Réglage défaut pour cette page : actif (code DEF204)
Si l'affichage est trop lent, vous pouvez désactiver le mode utilisateur pour visualiser la version en cache.

Rechercher dans le manuel MySQL

22.5.14 Online Operations with ALTER TABLE in NDB Cluster

MySQL NDB Cluster 8.0 supports online table schema changes using the standard ALTER TABLE syntax employed by the MySQL Server (ALGORITHM=DEFAULT|INPLACE|COPY), and described elsewhere.

Note

Some older releases of NDB Cluster used a syntax specific to NDB for online ALTER TABLE operations. That syntax has since been removed.

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 an NDB Cluster (but see Limitations of NDB online operations, later in this section). Such operations do not require single user mode for NDB table alterations made in an NDB cluster with multiple API nodes; transactions can continue uninterrupted during online DDL operations.

ALGORITHM=INPLACE 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.

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:

  1. mysql> CREATE TABLE t1 (
  2.      >     c1 INT NOT NULL PRIMARY KEY,
  3.      >     c2 VARCHAR(30)
  4.      >     )
  5.      >     TABLESPACE ts1 STORAGE DISK
  6.      >     ENGINE NDB;
  7. Query OK, 0 rows affected (1.73 sec)
  8. Records: 0  Duplicates: 0  Warnings: 0

You can add a new in-memory column to this table online as shown here:

  1. mysql> ALTER TABLE t1
  2.      >     ADD COLUMN c3 INT COLUMN_FORMAT DYNAMIC STORAGE MEMORY,
  3.      >     ALGORITHM=INPLACE;
  4. Query OK, 0 rows affected (1.25 sec)
  5. Records: 0  Duplicates: 0  Warnings: 0

This statement fails if the STORAGE MEMORY option is omitted:

  1. mysql> ALTER TABLE t1
  2.      >     ADD COLUMN c4 INT COLUMN_FORMAT DYNAMIC,
  3.      >     ALGORITHM=INPLACE;
  4. ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason:
  5. Adding column(s) or add/reorganize partition not supported online. Try
  6. ALGORITHM=COPY.

If you omit the COLUMN_FORMAT DYNAMIC option, the dynamic column format is employed automatically, but a warning is issued, as shown here:

  1. mysql> ALTER ONLINE TABLE t1 ADD COLUMN c4 INT STORAGE MEMORY;
  2. Query OK, 0 rows affected, 1 warning (1.17 sec)
  3. Records: 0  Duplicates: 0  Warnings: 0
  4.  
  5. mysql> SHOW WARNINGS\G
  6. *************************** 1. row ***************************
  7.   Level: Warning
  8.    Code: 1478
  9. Message: DYNAMIC column c4 with STORAGE DISK is not supported, column will
  10. become FIXED
  11.  
  12.  
  13. mysql> SHOW CREATE TABLE t1\G
  14. *************************** 1. row ***************************
  15.        Table: t1
  16.   `c1` int(11) NOT NULL,
  17.   `c2` varchar(30) DEFAULT NULL,
  18.   `c3` int(11) /*!50606 STORAGE MEMORY */ /*!50606 COLUMN_FORMAT DYNAMIC */ DEFAULT NULL,
  19.   `c4` int(11) /*!50606 STORAGE MEMORY */ DEFAULT NULL,
  20.   PRIMARY KEY (`c1`)
  21. ) /*!50606 TABLESPACE ts_1 STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=latin1
  22. 1 row in set (0.03 sec)
Note

The STORAGE and COLUMN_FORMAT keywords are supported only in NDB 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 TABLE ... REORGANIZE PARTITION, ALGORITHM=INPLACE with no partition_names INTO (partition_definitions) option on NDB tables. This can be used to redistribute NDB Cluster data among new data nodes that have been added to the cluster online. This does not perform any defragmentation, which requires an OPTIMIZE TABLE or null ALTER TABLE statement. For more information, see Section 22.5.15, “Adding NDB Cluster Data Nodes Online”.

Limitations of NDB online operations

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 NDB 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 ALGORITHM=COPY 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:

    1. mysql> CREATE TABLE t2 (
    2.      >     ) ENGINE=NDB;
    3. Query OK, 0 rows affected (1.44 sec)
    4.  
    5. mysql> ALTER TABLE t2
    6.      >     ADD COLUMN c2 INT,
    7.      >     ADD COLUMN c3 INT,
    8.      >     ALGORITHM=INPLACE;
    9. Query OK, 0 rows affected, 2 warnings (0.93 sec)
    10.  
    11. mysql> SHOW CREATE TABLE t1\G
    12. *************************** 1. row ***************************
    13.        Table: t1
    14.   `c1` int(11) NOT NULL AUTO_INCREMENT,
    15.   `c2` int(11) DEFAULT NULL,
    16.   `c3` int(11) DEFAULT NULL,
    17.   PRIMARY KEY (`c1`)
    18. ) ENGINE=ndbcluster DEFAULT CHARSET=latin1
    19. 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 (repeating the CREATE TABLE and ALTER TABLE statements just shown for the sake of clarity):

  1. mysql> CREATE TABLE t2 (
  2.      >     ) ENGINE=NDB;
  3. Query OK, 0 rows affected (1.44 sec)
  4.  
  5. mysql> ALTER TABLE t2
  6.      >     ADD COLUMN c2 INT,
  7.      >     ADD COLUMN c3 INT,
  8.      >     ALGORITHM=INPLACE;
  9. Query OK, 0 rows affected, 2 warnings (0.93 sec)
  10.  
  11. mysql> SHOW WARNINGS;
  12. *************************** 1. row ***************************
  13.   Level: Warning
  14.    Code: 1478
  15. Message: Converted FIXED field 'c2' to DYNAMIC to enable online ADD COLUMN
  16. *************************** 2. row ***************************
  17.   Level: Warning
  18.    Code: 1478
  19. Message: Converted FIXED field 'c3' to DYNAMIC to enable online ADD COLUMN
  20. 2 rows in set (0.00 sec)

Only the column or columns to be added online must be dynamic. Existing columns need not be; this includes the table's primary key, which may also be FIXED, as shown here:

  1. mysql> CREATE TABLE t3 (
  2.      >     c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY COLUMN_FORMAT FIXED
  3.      >     ) ENGINE=NDB;
  4. Query OK, 0 rows affected (2.10 sec)
  5.  
  6. mysql> ALTER TABLE t3 ADD COLUMN c2 INT, ALGORITHM=INPLACE;
  7. Query OK, 0 rows affected, 1 warning (0.78 sec)
  8. Records: 0  Duplicates: 0  Warnings: 0
  9.  
  10. mysql> SHOW WARNINGS;
  11. *************************** 1. row ***************************
  12.   Level: Warning
  13.    Code: 1478
  14. Message: Converted FIXED field 'c2' to DYNAMIC to enable online ADD COLUMN
  15. 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.20, “CREATE TABLE Syntax”.

The KEY, CONSTRAINT, and IGNORE keywords are supported in ALTER TABLE statements using ALGORITHM=INPLACE.

Setting MAX_ROWS to 0 using an online ALTER TABLE statement is disallowed. You must use a copying ALTER TABLE to perform this operation. (Bug #21960004)


Rechercher dans le manuel MySQL

Traduction non disponible

Le manuel MySQL n'est pas encore traduit en français sur l'infobrol. Seule la version anglaise est disponible pour l'instant.

Document créé le 26/06/2006, dernière modification le 26/10/2018
Source du document imprimé : https://www.gaudry.be/mysql-rf-mysql-cluster-online-operations.html

L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.

Références

  1. Consulter le document html Langue du document :en Manuel MySQL : https://dev.mysql.com/

Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.

Table des matières Haut