パーティションとパーツの操作
パーティションに対する以下の操作が可能です:
- DETACH PARTITION|PART — パーティションまたはパーツを
detachedディレクトリに移動し、忘れます。 - DROP PARTITION|PART — パーティションまたはパーツを削除します。
- DROP DETACHED PARTITION|PART -
detachedから指定されたパートまたはすべてのパーティションのパーツを削除します。 - FORGET PARTITION — パーティションが空の場合、ZooKeeperからそのメタデータを削除します。
- ATTACH PARTITION|PART —
detachedディレクトリからテーブルにパーティションまたはパーツを追加します。 - ATTACH PARTITION FROM — データパーティションを他のテーブルからコピーして追加します。
- REPLACE PARTITION — データパーティションを他のテーブルからコピーし、置き換えます。
- MOVE PARTITION TO TABLE — データパーティションを他のテーブルに移動します。
- CLEAR COLUMN IN PARTITION — パーティション内の指定されたカラムの値をリセットします。
- CLEAR INDEX IN PARTITION — パーティション内の指定されたセカンダリインデックスをリセットします。
- FREEZE PARTITION — パーティションのバックアップを作成します。
- UNFREEZE PARTITION — パーティションのバックアップを削除します。
- FETCH PARTITION|PART — 他のサーバーからパーツまたはパーティションをダウンロードします。
- MOVE PARTITION|PART — パーティションまたはデータパーツを他のディスクまたはボリュームに移動します。
- UPDATE IN PARTITION — パーティション内のデータを条件に基づいて更新します。
- DELETE IN PARTITION — パーティション内のデータを条件に基づいて削除します。
DETACH PARTITION|PART
ALTER TABLE table_name [ON CLUSTER cluster] DETACH PARTITION|PART partition_expr
指定されたパーティションのすべてのデータをdetachedディレクトリに移動します。サーバーは、このデタッチされたデータパーティションを存在しないものとして忘れます。このデータについてサーバーは、ATTACHクエリを行うまで認識しません。
例:
ALTER TABLE mt DETACH PARTITION '2020-11-21';
ALTER TABLE mt DETACH PART 'all_2_2_0';
パーティション式の設定については、パーティション式の設定方法セクションを参照してください。
クエリが実行された後、detachedディレクトリのデータに対して好きな操作を行うことができます。ファイルシステムから削除するか、そのままにしておくことが可能です。
このクエリはレプリケートされ、すべてのレプリカでデータをdetachedディレクトリに移動します。このクエリを実行できるのは、リーダーレプリカ上のみです。レプリカがリーダーかどうかを確認するには、system.replicasテーブルへのSELECTクエリを実行します。あるいは、すべてのレプリカでDETACHクエリを実行するのが簡単で、リーダーレプリカ以外のすべてのレプリカは例外を投げます(複数のリーダーを許可するとは言え、リーダーレプリカのみがクエリを処理します)。
DROP PARTITION|PART
ALTER TABLE table_name [ON CLUSTER cluster] DROP PARTITION|PART partition_expr
指定されたパーティションをテーブルから削除します。このクエリはパーティションを非アクティブとしてタグ付けし、約10分でデータを完全に削除します。
パーティション式の設定については、パーティション式の設定方法セクションを参照してください。
このクエリはレプリケートされ、すべてのレプリカからデータを削除します。
例:
ALTER TABLE mt DROP PARTITION '2020-11-21';
ALTER TABLE mt DROP PART 'all_4_4_0';
DROP DETACHED PARTITION|PART
ALTER TABLE table_name [ON CLUSTER cluster] DROP DETACHED PARTITION|PART ALL|partition_expr
detachedから指定されたパーツまたは指定されたパーティションのすべてのパーツを削除します。
パーティション式の設定については、パーティション式の設定方法セクションを参照してください。
FORGET PARTITION
ALTER TABLE table_name FORGET PARTITION partition_expr
ZooKeeperから空のパーティションに関するすべてのメタデータを削除します。パーティションが空でないか、不明な場合はクエリが失敗します。再利用されないパーティションに対してのみ実行してください。
パーティション式の設定については、パーティション式の設定方法セクションを参照してください。
例:
ALTER TABLE mt FORGET PARTITION '20201121';
ATTACH PARTITION|PART
ALTER TABLE table_name [ON CLUSTER cluster] ATTACH PARTITION|PART partition_expr
detachedディレクトリからテーブルにデータを追加します。全体のパーティションまたは個別のパーツについてデータを追加することができます。例:
ALTER TABLE visits ATTACH PARTITION 201901;
ALTER TABLE visits ATTACH PART 201901_2_2_0;
パーティション式の設定については、パーティション式の設定方法セクションを参照してください。
このクエリはレプリケートされます。レプリカ・イニシエーターはdetachedディレクトリにデータがあるか確認し、データが存在する場合、その整合性をチェックします。すべてが正しければ、データをテーブルに追加します。
非イニシエーターのレプリカが添付コマンドを受け取った際に、正しいチェックサムを持つパーツが自身のdetachedフォルダに見つかれば、他のレプリカからデータを取得せずにデータを添付します。
パーツが正しいチェックサムを持つ場合は、データは該当パーツを持つ任意のレプリカからダウンロードされます。
データを1つのレプリカのdetachedディレクトリに配置し、ALTER ... ATTACHクエリを使用してデータをすべてのレプリカのテーブルに追加することができます。
ATTACH PARTITION FROM
ALTER TABLE table2 [ON CLUSTER cluster] ATTACH PARTITION partition_expr FROM table1
このクエリは、table1からtable2にデータパーティションをコピーします。
注意点:
table1やtable2からデータは削除されません。table1は一時テーブルである可能性があります。
クエリを成功させるためには、次の条件を満たす必要があります:
- 両方のテーブルが同じ構造でなければならない。
- 両方のテーブルが同じパーティションキー、ソートキー、主キーを持っている必要がある。
- 両方のテーブルが同じインデックスとプロジェクションを持っている必要がある。
- 両方のテーブルが同じストレージポリシーを持っている必要がある。
REPLACE PARTITION
ALTER TABLE table2 [ON CLUSTER cluster] REPLACE PARTITION partition_expr FROM table1
このクエリは、table1からtable2にデータパーティションをコピーし、table2の既存のパーティションを置き換えます。操作はアトミックです。
注意点:
table1からデータは削除されません。table1は一時テーブルである可能性があります。
クエリを成功させるためには、次の条件を満たす必要があります:
- 両方のテーブルが同じ構造でなければならない。
- 両方のテーブルが同じパーティションキー、ソートキー、主キーを持っている必要がある。
- 両方のテーブルが同じインデックスとプロジェクションを持っている必要がある。
- 両方のテーブルが同じストレージポリシーを持っている必要がある。
MOVE PARTITION TO TABLE
ALTER TABLE table_source [ON CLUSTER cluster] MOVE PARTITION partition_expr TO TABLE table_dest
このクエリは、table_sourceからtable_destにデータパーティションを移動し、table_sourceからデータを削除します。
クエリを成功させるためには、次の条件を満たす必要があります:
- 両方のテーブルが同じ構造でなければならない。
- 両方のテーブルが同じパーティションキー、ソートキー、主キーを持っている必要がある。
- 両方のテーブルが同じインデックスとプロジェクションを持っている必要がある。
- 両方のテーブルが同じストレージポリシーを持っている必要がある。
- 両方のテーブルが同じエンジンファミリーでなければならない(レプリケートまたは非レプリケート)。
CLEAR COLUMN IN PARTITION
ALTER TABLE table_name [ON CLUSTER cluster] CLEAR COLUMN column_name IN PARTITION partition_expr
指定されたパーティション内の特定のカラムのすべての値をリセットします。テーブル作成時にDEFAULT句が指定されていた場合、このクエリはカラムの値を指定されたデフォルト値に設定します。
例:
ALTER TABLE visits CLEAR COLUMN hour in PARTITION 201902
FREEZE PARTITION
ALTER TABLE table_name [ON CLUSTER cluster] FREEZE [PARTITION partition_expr] [WITH NAME 'backup_name']
このクエリは、指定されたパーティションのローカルバックアップを作成します。PARTITION句が省略された場合、すべてのパーティションのバックアップが一度に作成されます。
バックアッププロセス全体がサーバーを停止せずに行われます。
名前が指定されたパーティションのバックアップを削除します。PARTITION句が省略された場合、すべてのパーティションのバックアップが一度に削除されます。
データストレージ用のディスクセットをテーブルに使用する場合、PARTITION式に一致するデータパーツを格納するshadow/Nディレクトリが各ディスクに作成されます。
バックアップ作成時間には、データスナップショット用に、テーブルデータにハードリンクが作成されます。ハードリンクは、/var/lib/clickhouse/shadow/N/...ディレクトリに配置され、ここで:
/var/lib/clickhouse/は設定で指定されたClickHouseの作業ディレクトリです。Nはバックアップのインクリメンタル番号です。WITH NAMEパラメータが指定されている場合、インクリメンタル番号の代わりに'backup_name'パラメータの値が使用されます。
このバックアップはほぼ瞬時に作成されます(ただし、まず対応するテーブルに現在のクエリが終了するのを待機します)。
ALTER TABLE t FREEZE PARTITIONはデータのみをコピーし、テーブルのメタデータはコピーしません。テーブルメタデータのバックアップを取るには、/var/lib/clickhouse/metadata/database/table.sqlファイルをコピーします。
バックアップからデータを復元するには、次の操作を行います:
- テーブルが存在しない場合は作成します。クエリを見るには、
.sqlファイルを使用します(ATTACHをCREATEに置き換えます)。 - バックアップ内の
data/database/table/ディレクトリから/var/lib/clickhouse/data/database/table/detached/ディレクトリにデータをコピーします。 ALTER TABLE t ATTACH PARTITIONクエリを実行して、データをテーブルに追加します。
バックアップからの復元はサーバーの停止を必要としません。
バックアップおよびデータ復元についての詳細は、データバックアップセクションを参照してください。
UNFREEZE PARTITION
ALTER TABLE table_name [ON CLUSTER cluster] UNFREEZE [PARTITION 'part_expr'] WITH NAME 'backup_name'
指定された名前を持つfreezedパーティションをディスクから削除します。PARTITION句が省略された場合、すべてのパーティションのバックアップが一度に削除されます。
CLEAR INDEX IN PARTITION
ALTER TABLE table_name [ON CLUSTER cluster] CLEAR INDEX index_name IN PARTITION partition_expr
このクエリは、CLEAR COLUMNと同様に機能しますが、カラムデータの代わりにインデックスをリセットします。
FETCH PARTITION|PART
ALTER TABLE table_name [ON CLUSTER cluster] FETCH PARTITION|PART partition_expr FROM 'path-in-zookeeper'
他のサーバーからパーティションをダウンロードします。このクエリはレプリケートされたテーブルでのみ動作します。
このクエリは次の動作を行います:
- 指定されたシャードからパーティション|パートをダウンロードします。'path-in-zookeeper'には、ZooKeeper内でのシャードへのパスを指定する必要があります。
- 次に、クエリはダウンロードしたデータを
table_nameテーブルのdetachedディレクトリに配置します。ATTACH PARTITION|PARTクエリを使用してデータをテーブルに追加します。
例:
- FETCH PARTITION
ALTER TABLE users FETCH PARTITION 201902 FROM '/clickhouse/tables/01-01/visits';
ALTER TABLE users ATTACH PARTITION 201902;
- FETCH PART
ALTER TABLE users FETCH PART 201901_2_2_0 FROM '/clickhouse/tables/01-01/visits';
ALTER TABLE users ATTACH PART 201901_2_2_0;
注意点:
ALTER ... FETCH PARTITION|PARTクエリはレプリケートされません。それはデータまたはパーティションをローカルサーバーのdetachedディレクトリにのみ配置します。ALTER TABLE ... ATTACHクエリはレプリケートされます。それはデータをすべてのレプリカに追加します。データはdetachedディレクトリから1つのレプリカに追加され、他のレプリカには隣接するレプリカから追加されます。
ダウンロードする前に、システムはパーティションが存在し、テーブル構造が一致するかをチェックします。最も適切なレプリカは、健全なレプリカから自動的に選択されます。
このクエリはALTER TABLEと呼ばれていますが、テーブル構造を変更したり、即座にテーブル内の利用可能なデータを変更することはありません。
MOVE PARTITION|PART
MergeTreeエンジンテーブルのパーティションまたはデータパーツを別のボリュームまたはディスクに移動します。詳細はデータストレージ用に複数のブロックデバイスを使用するを参照してください。
ALTER TABLE table_name [ON CLUSTER cluster] MOVE PARTITION|PART partition_expr TO DISK|VOLUME 'disk_name'
ALTER TABLE t MOVEクエリ:
- レプリケートされません。異なるレプリカは異なるストレージポリシーを持つことができるためです。
- 指定されたディスクまたはボリュームが構成されていない場合、エラーを返します。また、ストレージポリシーで指定された移動条件が適用できない場合にもエラーを返します。
- データが既にバックグラウンドプロセスによって移動している、同時の
ALTER TABLE t MOVEクエリまたはバックグラウンドデータマージの結果として移動している場合には、エラーを返すことがあります。この場合、ユーザーは追加の操作を行う必要はありません。
例:
ALTER TABLE hits MOVE PART '20190301_14343_16206_438' TO VOLUME 'slow'
ALTER TABLE hits MOVE PARTITION '2019-09-01' TO DISK 'fast_ssd'
UPDATE IN PARTITION
指定されたフィルタリング式にマッチするパーティション内のデータを操作します。これはmutationとして実装されています。
構文:
ALTER TABLE [db.]table [ON CLUSTER cluster] UPDATE column1 = expr1 [, ...] [IN PARTITION partition_expr] WHERE filter_expr
例
-- パーティション名を使用
ALTER TABLE mt UPDATE x = x + 1 IN PARTITION 2 WHERE p = 2;
-- パーティションIDを使用
ALTER TABLE mt UPDATE x = x + 1 IN PARTITION ID '2' WHERE p = 2;
関連項目
DELETE IN PARTITION
指定されたフィルタリング式にマッチするパーティション内のデータを削除します。これはmutationとして実装されています。
構文:
ALTER TABLE [db.]table [ON CLUSTER cluster] DELETE [IN PARTITION partition_expr] WHERE filter_expr
例
-- パーティション名を使用
ALTER TABLE mt DELETE IN PARTITION 2 WHERE p = 2;
-- パーティションIDを使用
ALTER TABLE mt DELETE IN PARTITION ID '2' WHERE p = 2;
関連項目
パーティション式の設定方法
ALTER ... PARTITIONクエリでパーティション式を設定するには、さまざまな方法があります:
system.partsテーブルのpartitionカラムの値として指定します。例:ALTER TABLE visits DETACH PARTITION 201901。- キーワード
ALLを使用します。これはDROP/DETACH/ATTACH/ATTACH FROMでのみ使用できます。例:ALTER TABLE visits ATTACH PARTITION ALL。 - テーブルのパーティションキーのタプルと型が一致する式や定数のタプルとして指定します。単一要素のパーティションキーの場合、式を
tuple(...)関数で包む必要があります。例:ALTER TABLE visits DETACH PARTITION tuple(toYYYYMM(toDate('2019-01-25')))。 - パーティションIDを使用します。パーティションIDはファイルシステムやZooKeeperでパーティションの名前として使われる(可能であれば人間が読める文字列の)識別子です。パーティションIDは
PARTITION ID句で引用符内に指定しなければなりません。例:ALTER TABLE visits DETACH PARTITION ID '201901'。 - ALTER ATTACH PARTおよびDROP DETACHED PARTクエリでは、
system.detached_partsテーブルのnameカラムからの値を使用して、パーツの名前を文字列リテラルで指定します。例:ALTER TABLE visits ATTACH PART '201901_1_1_0'。
パーティションを指定する際の引用符の使用は、パーティション式のタイプに依存します。例えば、Stringタイプの場合、その名前を引用符(')で囲む必要があります。DateやInt*タイプの場合、引用符は不要です。
上記の規則は、OPTIMIZEクエリにも適用されます。パーティション化されていないテーブルを最適化する際に特定のパーティションのみを指定する必要がある場合、式をPARTITION tuple()と設定してください。例:
OPTIMIZE TABLE table_not_partitioned PARTITION tuple() FINAL;
IN PARTITIONは、ALTER TABLEクエリの結果としてUPDATEまたはDELETE式が適用されるパーティションを指定します。指定されたパーティションからのみ新しいパーツが作成されます。これにより、パーティションが多く分かれている場合でも、インデックスを更新する必要があるポイントだけにデータを更新する負荷を減らすことができます。
ALTER ... PARTITIONクエリの例は、テスト00502_custom_partitioning_localおよび00502_custom_partitioning_replicated_zookeeperで示されています。