Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.1Mb
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


13.1.7.1 ALTER TABLE パーティション操作

ALTER TABLE のパーティション化関連の句は、再パーティション化、パーティションの追加、削除、マージ、および分割、パーティション化の保守の実行などのために、パーティション化されたテーブルで使用できます。

  • 単に、パーティション化されたテーブルに対して ALTER TABLEpartition_options 句を使用するだけで、partition_options で定義されたパーティション化スキームに従って、そのテーブルが再パーティション化されます。この句は、常に PARTITION BY で始まり、CREATE TABLEpartition_options 句に適用されるのと同じ構文およびその他のルールに従います (詳細は、セクション13.1.17「CREATE TABLE 構文」を参照してください)。また、まだパーティション化されていない既存のテーブルのパーティション化にも使用できます。たとえば、次に示すように定義された (パーティション化されていない) テーブルを考えてみます。

    CREATE TABLE t1 (
        id INT,
        year_col INT
    );
    

    このテーブルは、次のステートメントを使用し、id カラムをパーティション化キーとして使用して HASH によって 8 つのパーティションにパーティション化できます。

    ALTER TABLE t1
        PARTITION BY HASH(id)
        PARTITIONS 8;
    

    MySQL 5.6.11 以降では、[SUB]PARTITION BY [LINEAR] KEYALGORITHM オプションがサポートされます。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 によってパーティション化されたテーブルを作成することを目的にしています。

    MySQL 5.1 で作成された、KEY によってパーティション化されたテーブルをアップグレードするには、最初に SHOW CREATE TABLE を実行し、表示される正確なカラムおよびパーティションの数をメモします。次に、CREATE TABLE ステートメントとまったく同じカラムリストおよびパーティションの数を使用して ALTER TABLE ステートメントを実行しますが、そのとき PARTITION BY キーワードの直後に ALGORITHM=2 を追加します。(元のテーブル定義に LINEAR キーワードが使用されていた場合は、そのキーワードも含めるようにしてください。)mysql クライアントでのセッションの例を次に示します。

    mysql> SHOW CREATE TABLE p\G
    *************************** 1. row ***************************
           Table: p
    Create Table: CREATE TABLE `p` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `cd` datetime NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    /*!50100 PARTITION BY LINEAR KEY (id)
    PARTITIONS 32 */
    1 row in set (0.00 sec)
    
    mysql> ALTER TABLE p PARTITION BY LINEAR KEY ALGORITHM=2 (id) PARTITIONS 32;
    Query OK, 0 rows affected (5.34 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> SHOW CREATE TABLE p\G
    *************************** 1. row ***************************
           Table: p
    Create Table: CREATE TABLE `p` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `cd` datetime NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    /*!50100 PARTITION BY LINEAR KEY (id)
    PARTITIONS 32 */
    1 row in set (0.00 sec)
    

    MySQL 5.5 以降で使用されているデフォルトのキーハッシュを使用して作成されたテーブルを、MySQL 5.1 サーバーで使用できるようにダウングレードする場合も同様です。ただし、この場合は、そのテーブルのパーティションが強制的に MySQL 5.1 のキーハッシュ関数を使用して再構築されるように、ALGORITHM=1 を使用するようにしてください。MySQL 5.5 以降ではデフォルトで使用される改善された KEY ハッシュ関数により、古い実装で見つかった多くの問題に対する修正が提供されるため、MySQL 5.1 サーバーとの互換性のために必要な場合を除き、これは行わないようにすることをお勧めします。

    注記

    ALTER TABLE ... PARTITION BY ALGORITHM=2 [LINEAR] KEY ... を使用してアップグレードされたテーブルは、MySQL 5.1 サーバーでは使用できなくなります。(このようなテーブルを MySQL 5.1 サーバーでふたたび使用できるようにするには、ALTER TABLE ... PARTITION BY ALGORITHM=1 [LINEAR] KEY ... を使用してダウングレードする必要があります。)

    ALTER TABLE ... PARTITION BY ステートメントを使用して作成されたテーブルは、CREATE TABLE ... PARTITION BY を使用して作成されたテーブルと同じルールに従う必要があります。これには、そのテーブルに含まれている可能性のあるすべての一意のキー (すべての主キーを含む) と、パーティショニング式で使用されている 1 つまたは複数のカラムの間の関係を管理するルールが含まれます。これについては、セクション19.6.1「パーティショニングキー、主キー、および一意キー」で説明されています。また、パーティションの数を指定するための CREATE TABLE ... PARTITION BY のルールも ALTER TABLE ... PARTITION BY に適用されます。

    ALTER TABLE ADD PARTITIONpartition_definition 句は、CREATE TABLE ステートメントの同じ名前の句と同じオプションをサポートしています。(構文と説明については、セクション13.1.17「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 ストレージエンジンを使用するテーブルでは機能しません。セクション19.3.1「RANGE および LIST パーティションの管理」およびセクション18.1.6「MySQL Cluster の既知の制限」を参照してください。

    ADD PARTITIONDROP PARTITION は現在、IF [NOT] EXISTS をサポートしていません。

    パーティション化されたテーブルの名前変更がサポートされています。ALTER TABLE ... REORGANIZE PARTITION を使用して、間接的に個々のパーティションの名前を変更できます。ただし、この操作によってパーティションのデータのコピーが作成されます。

    MySQL 5.6 では、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 条件が必要になる、パーティション化されたテーブルでの削除操作が大幅に簡素化される可能性があります。たとえば、次のステートメントは、パーティション p1p3 のすべての行を削除します。

    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 は行を削除するだけです。そのテーブル自体や、どのパーティションの定義も変更されません。

    注記

    TRUNCATE PARTITION は、サブパーティションでは機能しません。

    次のようなクエリーを使用して INFORMATION_SCHEMA.PARTITIONS テーブルをチェックすることにより、行が削除されたことを確認できます。

    SELECT PARTITION_NAME, TABLE_ROWS 
        FROM INFORMATION_SCHEMA.PARTITIONS 
        WHERE TABLE_NAME = 't1';
    

    TRUNCATE PARTITION は、MyISAMInnoDB、または MEMORY ストレージエンジンを使用するパーティション化されたテーブルでのみサポートされます。また、BLACKHOLE テーブルに対しても機能します (ただし、何の効果もありません)。ARCHIVE テーブルではサポートされません。

    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 に 1 つの定義を指定することによって実行できます。

    • 既存のパーティションをいくつかのパーティションに分割します。これは、partition_names に単一パーティションを指定し、複数の partition_definitions を指定することによって実行できます。

    • VALUES LESS THAN を使用して、定義されたパーティションのサブセットの範囲を変更するか、または VALUES IN を使用して、定義されたパーティションのサブセットの値リストを変更します。

    • このステートメントはまた、HASH パーティション化を使用して自動的にパーティション化されるテーブルに対して partition_names INTO (partition_definitions) オプションなしで使用すると、データを強制的に再配布できます。(現在、このように自動的にパーティション化されるのは NDB テーブルだけです。)これは、既存の MySQL Cluster に新しい MySQL Cluster データノードをオンラインで追加したあと、既存の MySQL Cluster テーブルデータを新しいデータノードに再配布する必要がある MySQL Cluster で役立ちます。このような場合は、ONLINE オプションを使用してこのステートメントを呼び出すようにしてください。つまり、次に示すようにします。

      ALTER ONLINE TABLE table REORGANIZE PARTITION;
      

      オンラインのテーブル再編成と同時にほかの DDL を実行することはできません。つまり、ALTER ONLINE TABLE ... REORGANIZE PARTITION ステートメントの実行中は、ほかの DDL ステートメントを発行できません。MySQL Cluster データノードをオンラインで追加する方法の詳細は、セクション18.5.13「MySQL Cluster データノードのオンライン追加」を参照してください。

      ALTER ONLINE TABLE ... REORGANIZE PARTITION は、MAX_ROWS オプションを使用して作成されたテーブルでは機能しません。このステートメントは、元の CREATE TABLE ステートメントで指定された一定の MAX_ROWS 値を使用して必要なパーティションの数を決定するため、新しいパーティションが作成されないためです。テーブルの行の最大数を増やすには、ALTER ONLINE TABLE ... MAX_ROWS=rows を使用できます。このあと、ALTER ONLINE TABLE ... REORGANIZE PARTITION は、この大きくなった新しい値を使用してパーティションの数を増やすことができます。これが機能するには、rows の値を、元の CREATE TABLE ステートメントで MAX_ROWS に指定された値より大きくする必要があります。

      明示的にパーティション化されたテーブルに対して、REORGANIZE PARTITIONpartition_names INTO (partition_definitions) オプションなしで使用しようとすると、REORGANIZE PARTITION without parameters can only be used on auto-partitioned tables using HASH partitioningエラーが発生します。

    注記

    明示的に名前が付けられていないパーティションに対して、MySQL は自動的に p0p1p2 などのデフォルト名を付けます。同じことがサブパーティションにも当てはまります。

    ALTER TABLE ... REORGANIZE PARTITION ステートメントの詳細および例については、セクション19.3.1「RANGE および LIST パーティションの管理」を参照してください。

  • MySQL 5.6 では、ALTER TABLE ... EXCHANGE PARTITION ステートメントを使用して、テーブルパーティションまたはサブパーティションを別のテーブルと交換できます。つまり、パーティションまたはサブパーティション内の既存の任意の行をパーティション化されていないテーブルに移動したり、パーティション化されていないテーブル内の既存の任意の行をテーブルパーティションまたはサブパーティションに移動したりできます。

    使用方法および例については、セクション19.3.3「パーティションとサブパーティションをテーブルと交換する」を参照してください。

  • いくつかの追加オプションによって、パーティション化されていないテーブルのために CHECK TABLEREPAIR TABLE などのステートメントによって実装されている機能 (これは、パーティション化されたテーブルでもサポートされます。詳細は、セクション13.7.2「テーブル保守ステートメント」を参照してください) に類似したパーティションの保守および修復機能が提供されます。これには、ANALYZE PARTITIONCHECK PARTITIONOPTIMIZE PARTITIONREBUILD PARTITION、および REPAIR PARTITION が含まれます。これらの各オプションは、1 つ以上のパーティション名から成るカンマで区切られた partition_names 句を受け取ります。これらのパーティションは、変更されるテーブル内にすでに存在する必要があります。partition_names の代わりに ALL キーワードを使用することもできます。その場合、このステートメントはテーブル内のすべてのパーティションに対して機能します。詳細および例については、セクション19.3.4「パーティションの保守」を参照してください。

    InnoDB などの一部の MySQL ストレージエンジンは、パーティションごとの最適化をサポートしていません。このようなストレージエンジンを使用したパーティション化されたテーブルに対して、ALTER TABLE ... OPTIMIZE PARTITION はテーブル全体を再構築します。これは既知の問題です。MySQL 5.6.9 から、このようなテーブルに対してこのステートメントを実行するとテーブル全体が再構築および分析され、該当する警告が発行されます。(Bug #11751825、Bug #42822)

    この問題を回避するには、代わりに、ステートメント ALTER TABLE ... REBUILD PARTITION および ALTER TABLE ... ANALYZE PARTITION を使用します。

    ANALYZE PARTITIONCHECK PARTITIONOPTIMIZE PARTITION、および REPAIR PARTITION オプションは、パーティション化されていないテーブルには許可されません。

  • REMOVE PARTITIONING を使用すると、テーブルのパーティション化を削除でき、そのテーブルやデータはそれ以外の影響を受けません。このオプションは、カラムやインデックスの追加、削除、名前変更などのために使用されるその他の ALTER TABLE オプションと組み合わせることができます。

  • ALTER TABLEENGINE オプションを使用すると、パーティション化に影響を与えることなく、テーブルで使用されるストレージエンジンが変更されます。

MySQL 5.6.6 より前は、MyISAM (または、テーブルレベルのロックを使用する別のストレージエンジン) を使用するパーティション化されたテーブルに対して ALTER TABLE ... EXCHANGE PARTITION または ALTER TABLE ... TRUNCATE PARTITION が実行されると、そのパーティション化されたテーブル全体がロックされました。MySQL 5.6.6 以降では、このような場合、実際に読み取られたパーティションのみがロックされます。これは、行レベルロックを採用している (InnoDB などの) ストレージエンジンを使用するパーティション化されたテーブルには影響しませんでした (現在も影響しません)。セクション19.6.4「パーティショニングとロック」を参照してください。

ALTER TABLE ステートメントには、ほかの変更指定に加えて、PARTITION BY または REMOVE PARTITIONING 句を含めることができますが、PARTITION BY または REMOVE PARTITIONING 句は、ほかのどの指定よりもあとの最後に指定する必要があります。

ADD PARTITIONDROP PARTITIONCOALESCE PARTITIONREORGANIZE PARTITIONANALYZE PARTITIONCHECK PARTITION、および REPAIR PARTITION オプションは、個々のパーティションに対して機能するため、1 つの ALTER TABLE 内でほかの変更指定と組み合わせることはできません。詳細は、セクション13.1.7.1「ALTER TABLE パーティション操作」を参照してください。

特定の ALTER TABLE ステートメントでは、次のいずれか 1 つのオプションの単一インスタンスのみを使用できます。PARTITION BYADD PARTITIONDROP PARTITIONTRUNCATE PARTITIONEXCHANGE PARTITIONREORGANIZE PARTITION、または COALESCE PARTITIONANALYZE PARTITIONCHECK PARTITIONOPTIMIZE PARTITIONREBUILD PARTITIONREMOVE 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 のパーティション p1p2 を同時に分析できます。

ALTER TABLE t1 ANALYZE PARTITION p1, p2;

2 番目のケースでは、同じテーブルの別のパーティションに対する ANALYZE 操作と CHECK 操作を同時に実行することはできません。代わりに、次のように、2 つの個別のステートメントを発行する必要があります。

ALTER TABLE t1 ANALYZE PARTITION p1;
ALTER TABLE t1 CHECK PARTITION p2;

ANALYZECHECKOPTIMIZEREBUILDREPAIR、および TRUNCATE 操作は、サブパーティションではサポートされません。


User Comments
Sign Up Login You must be logged in to post a comment.