ALTER TABLE
のパーティション関連の句をパーティションテーブルとともに使用して、パーティションの再パーティション化、パーティションの追加、削除、破棄、インポート、マージおよび分割、パーティション化メンテナンスの実行を行うことができます。
-
単に、パーティション化されたテーブルに対して
ALTER TABLE
でpartition_options
句を使用するだけで、partition_options
で定義されたパーティション化スキームに従って、そのテーブルが再パーティション化されます。 この句は常にPARTITION BY
で始まり、CREATE TABLE
のpartition_options
句に適用されるものと同じ構文およびその他のルールに従い (詳細は、セクション13.1.20「CREATE TABLE ステートメント」 を参照)、まだパーティション化されていない既存のテーブルのパーティション化にも使用できます。 たとえば、次に示すように定義された (パーティション化されていない) テーブルを考えてみます。CREATE TABLE t1 ( id INT, year_col INT );
このテーブルは、次のステートメントを使用し、
id
カラムをパーティション化キーとして使用してHASH
によって 8 つのパーティションにパーティション化できます。ALTER TABLE t1 PARTITION BY HASH(id) PARTITIONS 8;
MySQL は、
[SUB]PARTITION BY [LINEAR] KEY
でALGORITHM
オプションをサポートしています。ALGORITHM=1
を指定すると、サーバーは、パーティション内の行の配置を計算するときに MySQL 5.1 と同じキーハッシュ関数を使用します。ALGORITHM=2
は、サーバーが、MySQL 5.5 以降で実装され、KEY
によってパーティション化された新しいテーブルに対してデフォルトで使用されるキーハッシュ関数を使用することを示します。 (MySQL 5.5 以降で採用されたキーハッシュ関数によって作成されたパーティション化されたテーブルを MySQL 5.1 サーバーで使用することはできません。) このオプションを指定しない場合は、ALGORITHM=2
を使用するのと同じ効果があります。 このオプションは、主に[LINEAR] KEY
によってパーティション化されたテーブルを MySQL 5.1 以降の MySQL バージョン間でアップグレードまたはダウングレードするときに使用するか、または MySQL 5.5 以降のサーバー上で、MySQL 5.1 サーバー上で使用できるKEY
またはLINEAR KEY
によってパーティション化されたテーブルを作成することを目的にしています。ALTER TABLE ... PARTITION BY
ステートメントを使用して作成されたテーブルは、CREATE TABLE ... PARTITION BY
を使用して作成されたテーブルと同じルールに従う必要があります。 これには、そのテーブルに含まれている可能性のあるすべての一意のキー (すべての主キーを含む) と、パーティショニング式で使用されている 1 つまたは複数のカラムの間の関係を管理するルールが含まれます。これについては、セクション24.6.1「パーティショニングキー、主キー、および一意キー」で説明されています。 また、パーティションの数を指定するためのCREATE TABLE ... PARTITION BY
のルールもALTER TABLE ... PARTITION BY
に適用されます。ALTER TABLE ADD PARTITION
のpartition_definition
句は、CREATE TABLE
ステートメントの同じ名前の句と同じオプションをサポートしています。 (構文と説明については、セクション13.1.20「CREATE TABLE ステートメント」を参照してください。) 次に示すように作成されたパーティション化されたテーブルがあるとします。CREATE TABLE t1 ( id INT, year_col INT ) PARTITION BY RANGE (year_col) ( PARTITION p0 VALUES LESS THAN (1991), PARTITION p1 VALUES LESS THAN (1995), PARTITION p2 VALUES LESS THAN (1999) );
このテーブルに、
2002
より小さい値を格納するための新しいパーティションp3
を次のように追加できます。ALTER TABLE t1 ADD PARTITION (PARTITION p3 VALUES LESS THAN (2002));
DROP PARTITION
を使用すると、1 つ以上のRANGE
またはLIST
パーティションを削除できます。 このステートメントは、HASH
またはKEY
パーティションでは使用できません。かわりに、COALESCE PARTITION
を使用してください (このセクションの後半を参照)。partition_names
リストで名前が指定されている削除されたパーティションに格納されていたデータはすべて破棄されます。 たとえば、前に定義されたテーブルt1
の場合は、p0
およびp1
という名前のパーティションを次に示すように削除できます。ALTER TABLE t1 DROP PARTITION p0, p1;
注記DROP PARTITION
は、NDB
ストレージエンジンを使用するテーブルでは機能しません。 セクション24.3.1「RANGE および LIST パーティションの管理」およびセクション23.1.7「NDB Cluster の既知の制限事項」を参照してください。ADD PARTITION
とDROP PARTITION
は現在、IF [NOT] EXISTS
をサポートしていません。DISCARD PARTITION ... TABLESPACE
およびIMPORT PARTITION ... TABLESPACE
オプションは、Transportable Tablespace 機能を個々のInnoDB
テーブルパーティションに拡張します。 各InnoDB
テーブルパーティションには、独自のテーブルスペースファイル (.ibd
ファイル) があります。 Transportable Tablespace 機能を使用すると、実行中の MySQL サーバーインスタンスから別の実行中のインスタンスにテーブルスペースを簡単にコピーしたり、同じインスタンスでリストアを実行できます。 どちらのオプションも、1 つ以上のパーティション名のカンマ区切りリストを取ります。 例:ALTER TABLE t1 DISCARD PARTITION p2, p3 TABLESPACE;
ALTER TABLE t1 IMPORT PARTITION p2, p3 TABLESPACE;
サブパーティションテーブルで
DISCARD PARTITION ... TABLESPACE
およびIMPORT PARTITION ... TABLESPACE
を実行する場合、パーティション名とサブパーティション名の両方が許可されます。 パーティション名を指定すると、そのパーティションのサブパーティションが含まれます。Transportable Tablespace 機能では、パーティション
InnoDB
テーブルのコピーまたはリストアもサポートされています。 詳細は、セクション15.6.1.3「InnoDB テーブルのインポート」を参照してください。パーティションテーブルの名前変更はサポートされています。
ALTER TABLE ... REORGANIZE PARTITION
を使用して個々のパーティションの名前を間接的に変更できますが、この操作ではパーティションデータがコピーされます。選択したパーティションから行を削除するには、
TRUNCATE PARTITION
オプションを使用します。 このオプションは、1 つ以上のカンマ区切りのパーティション名のリストを取ります。 次のステートメントによって作成されたテーブルt1
について考えてみます:CREATE TABLE t1 ( id INT, year_col INT ) PARTITION BY RANGE (year_col) ( PARTITION p0 VALUES LESS THAN (1991), PARTITION p1 VALUES LESS THAN (1995), PARTITION p2 VALUES LESS THAN (1999), PARTITION p3 VALUES LESS THAN (2003), PARTITION p4 VALUES LESS THAN (2007) );
パーティション
p0
からすべての行を削除するには、次のステートメントを使用します:ALTER TABLE t1 TRUNCATE PARTITION p0;
今示したステートメントには、次の
DELETE
ステートメントと同じ効果があります。DELETE FROM t1 WHERE year_col < 1991;
複数のパーティションを切り詰める場合、パーティションが連続している必要はありません。これにより、通常、
DELETE
ステートメントで実行された場合は非常に複雑なWHERE
条件が必要になる、パーティション化されたテーブルでの削除操作が大幅に簡素化される可能性があります。 たとえば、次のステートメントは、パーティションp1
とp3
のすべての行を削除します。ALTER TABLE t1 TRUNCATE PARTITION p1, p3;
同等の
DELETE
ステートメントを次に示します。DELETE FROM t1 WHERE (year_col >= 1991 AND year_col < 1995) OR (year_col >= 2003 AND year_col < 2007);
パーティション名のリストのかわりに
ALL
キーワードを使用すると、ステートメントはすべてのテーブルパーティションに対して機能します。TRUNCATE PARTITION
は行を削除するだけです。そのテーブル自体や、どのパーティションの定義も変更されません。行が削除されたことを確認するには、次のようなクエリーを使用して
INFORMATION_SCHEMA.PARTITIONS
テーブルを確認します:SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 't1';
HASH
またはKEY
によってパーティション化されたテーブルでCOALESCE PARTITION
を使用すると、そのパーティションの数をnumber
だけ減らすことができます。 次のようにテーブルt2
を作成したとします:CREATE TABLE t2 ( name VARCHAR (30), started DATE ) PARTITION BY HASH( YEAR(started) ) PARTITIONS 6;
t2
で使用されるパーティションの数を 6 から 4 に減らすには、次のステートメントを使用します:ALTER TABLE t2 COALESCE PARTITION 2;
最後の
number
パーティションに含まれるデータは、残りのパーティションにマージされます。 この場合、パーティション 4 および 5 は最初の 4 つのパーティション (0、1、2 および 3 の番号が付けられたパーティション) にマージされます。パーティション化されたテーブルで使用される (すべてではなく) 一部のパーティションを変更するには、
REORGANIZE PARTITION
を使用できます。 このステートメントは、次のいくつかの方法で使用できます。一連のパーティションを単一パーティションにマージします。 これを行うには、
partition_names
リスト内の複数のパーティションに名前を付け、partition_definition
の単一の定義を指定します。既存のパーティションをいくつかのパーティションに分割します。 これを実現するには、
partition_names
の単一のパーティションに名前を付け、複数のpartition_definitions
を指定します。VALUES LESS THAN
を使用して、定義されたパーティションのサブセットの範囲を変更するか、またはVALUES IN
を使用して、定義されたパーティションのサブセットの値リストを変更します。
注記明示的に名前が付けられていないパーティションに対して、MySQL は自動的に
p0
、p1
、p2
などのデフォルト名を付けます。 同じことがサブパーティションにも当てはまります。ALTER TABLE ... REORGANIZE PARTITION
ステートメントの詳細および例については、セクション24.3.1「RANGE および LIST パーティションの管理」を参照してください。 -
テーブルのパーティションまたはサブパーティションをテーブルと交換するには、
ALTER TABLE ... EXCHANGE PARTITION
ステートメントを使用します。つまり、パーティションまたはサブパーティション内の既存の行を非パーティションテーブルに移動し、非パーティションテーブル内の既存の行をテーブルのパーティションまたはサブパーティションに移動します。使用方法および例については、セクション24.3.3「パーティションとサブパーティションをテーブルと交換する」を参照してください。
-
いくつかのオプションでは、
CHECK TABLE
やREPAIR TABLE
などのステートメントによって非パーティションテーブルに実装されるものと同様のパーティションメンテナンスおよび修復機能が提供されます (パーティションテーブルでもサポートされます。詳細は、セクション13.7.3「テーブル保守ステートメント」 を参照してください)。 これには、ANALYZE PARTITION
、CHECK PARTITION
、OPTIMIZE PARTITION
、REBUILD PARTITION
、およびREPAIR PARTITION
が含まれます。 これらの各オプションは、1 つ以上のパーティション名から成るカンマで区切られたpartition_names
句を受け取ります。 パーティションはターゲットテーブルにすでに存在している必要があります。partition_names
のかわりにALL
キーワードを使用することもできます。この場合、ステートメントはすべてのテーブルパーティションで動作します。 詳細および例については、セクション24.3.4「パーティションの保守」を参照してください。InnoDB
は現在、パーティションごとの最適化をサポートしていません。ALTER TABLE ... OPTIMIZE PARTITION
では、テーブル全体が再構築および分析され、適切な警告が発行されます。 (Bug #11751825、Bug #42822) この問題を回避するには、かわりにALTER TABLE ... REBUILD PARTITION
およびALTER TABLE ... ANALYZE PARTITION
を使用します。ANALYZE PARTITION
,CHECK PARTITION
,OPTIMIZE PARTITION
およびREPAIR PARTITION
オプションは、パーティション化されていないテーブルではサポートされていません。 REMOVE PARTITIONING
を使用すると、テーブルまたはそのデータに影響を与えることなく、テーブルのパーティション化を削除できます。 このオプションは、カラムやインデックスの追加、削除、名前変更などのために使用されるその他のALTER TABLE
オプションと組み合わせることができます。ALTER TABLE
でENGINE
オプションを使用すると、パーティション化に影響を与えることなく、テーブルで使用されるストレージエンジンが変更されます。 ターゲットストレージエンジンは、独自のパーティショニングハンドラを提供する必要があります。 ネイティブのパーティショニングハンドラを持つのは、InnoDB
およびNDB
ストレージエンジンだけです。現在、NDB
は MySQL 8.0 ではサポートされていません。
ALTER TABLE
ステートメントには、ほかの変更指定に加えて、PARTITION BY
または REMOVE PARTITIONING
句を含めることができますが、PARTITION BY
または REMOVE PARTITIONING
句は、ほかのどの指定よりもあとの最後に指定する必要があります。
ADD PARTITION
、DROP PARTITION
、COALESCE PARTITION
、REORGANIZE PARTITION
、ANALYZE PARTITION
、CHECK PARTITION
、および REPAIR PARTITION
オプションは、個々のパーティションに対して機能するため、1 つの ALTER TABLE
内でほかの変更指定と組み合わせることはできません。 詳細は、セクション13.1.9.1「ALTER TABLE パーティション操作」を参照してください。
特定の ALTER TABLE
ステートメントでは、次のいずれか 1 つのオプションの単一インスタンスのみを使用できます。PARTITION BY
、ADD PARTITION
、DROP PARTITION
、TRUNCATE PARTITION
、EXCHANGE PARTITION
、REORGANIZE PARTITION
、または COALESCE PARTITION
、ANALYZE PARTITION
、CHECK PARTITION
、OPTIMIZE PARTITION
、REBUILD PARTITION
、REMOVE PARTITIONING
。
たとえば、次の 2 つのステートメントは無効です。
ALTER TABLE t1 ANALYZE PARTITION p1, ANALYZE PARTITION p2;
ALTER TABLE t1 ANALYZE PARTITION p1, CHECK PARTITION p2;
最初のケースでは、次のように、分析される両方のパーティションを一覧表示した 1 つの ANALYZE PARTITION
オプションを含む 1 つのステートメントを使用して、テーブル t1
のパーティション p1
と p2
を同時に分析できます。
ALTER TABLE t1 ANALYZE PARTITION p1, p2;
2 番目のケースでは、同じテーブルの別のパーティションに対する ANALYZE
操作と CHECK
操作を同時に実行することはできません。 代わりに、次のように、2 つの個別のステートメントを発行する必要があります。
ALTER TABLE t1 ANALYZE PARTITION p1;
ALTER TABLE t1 CHECK PARTITION p2;
サブパーティションに対する REBUILD
操作は現在サポートされていません。 REBUILD
キーワードはサブパーティションでは明示的に禁止されており、使用すると ALTER TABLE
はエラーで失敗します。
チェックまたは修復するパーティションに重複キーエラーが含まれている場合、CHECK PARTITION
および REPAIR PARTITION
の操作は失敗します。
これらのステートメントの詳細は、セクション24.3.4「パーティションの保守」 を参照してください。