このページは機械翻訳したものです。
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「パーティションの保守」 を参照してください。