Manipulating Partitions and Parts
以下の操作がパーティションに対して利用可能です:
- 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
指定したパーティションのすべてのデータをdetached
ディレクトリに移動します。サーバーは、まるでそのデータパーティションが存在しないかのように、detached
データを忘れます。このデータについてサーバーが認識するのは、ATTACHクエリを実行するまではありません。
例:
パーティション式の設定については、How to set the partition expressionのセクションを参照してください。
クエリが実行されると、detached
ディレクトリ内のデータに対して何をしても構いません — ファイルシステムから削除することも、そのまま残すこともできます。
このクエリはレプリケートされ、すべてのレプリカのdetached
ディレクトリにデータを移動します。このクエリはリーダーレプリカでのみ実行可能です。レプリカがリーダーかどうかを知るには、system.replicasテーブルへのSELECT
クエリを実行します。あるいは、すべてのレプリカでDETACH
クエリを実行する方が簡単です — リーダーレプリカを除くすべてのレプリカが例外を投げます(複数のリーダーが許可されているため)。
DROP PARTITION|PART
指定されたパーティションをテーブルから削除します。このクエリは、パーティションを非アクティブとしてタグ付けし、データを完全に削除します。約10分かかります。
パーティション式の設定については、How to set the partition expressionのセクションを参照してください。
このクエリはレプリケートされ、すべてのレプリカでデータが削除されます。
例:
DROP DETACHED PARTITION|PART
指定されたパートまたは指定されたパーティションのすべてのパーツをdetached
から削除します。
パーティション式の設定については、How to set the partition expressionのセクションを参照してください。
FORGET PARTITION
空のパーティションに関するすべてのメタデータをZooKeeperから削除します。パーティションが空でないか不明な場合、クエリは失敗します。再利用されないパーティションに対してのみ実行するようにしてください。
パーティション式の設定については、How to set the partition expressionのセクションを参照してください。
例:
ATTACH PARTITION|PART
detached
ディレクトリからテーブルにデータを追加します。全体のパーティションまたは個別のパートにデータを追加することが可能です。例:
パーティション式の設定については、How to set the partition expressionのセクションを参照してください。
このクエリはレプリケートされます。レプリカのイニシエーターは、detached
ディレクトリ内にデータが存在するかどうかを確認します。
データが存在すれば、クエリはその整合性をチェックします。すべてが正しければ、クエリはデータをテーブルに追加します。
イニシエーターでないレプリカは、ATTACHコマンドを受け取ると、自身のdetached
フォルダに正しいチェックサムのパートが見つかれば、他のレプリカからの取得なしにデータを追加します。
正しいチェックサムのパートが見つからなければ、どのレプリカからでもパートがダウンロードされます。
一つのレプリカのdetached
ディレクトリにデータを配置し、すべてのレプリカのテーブルに追加するためにALTER ... ATTACH
クエリを使用できます。
ATTACH PARTITION FROM
このクエリは、データパーティションをtable1
からtable2
にコピーします。
注意点:
- データは
table1
またはtable2
から削除されません。 table1
は一時テーブルであってもかまいません。
クエリが正常に実行されるためには、以下の条件を満たす必要があります:
- 両方のテーブルは同じ構造を持っている必要があります。
- 両方のテーブルは同じパーティションキー、同じORDER BYキーおよび同じ主キーを持っている必要があります。
- 両方のテーブルは同じストレージポリシーを持っている必要があります。
- 目的のテーブルは源のテーブルに含まれるすべてのインデックスとプロジェクションを含む必要があります。もし
enforce_index_structure_match_on_partition_manipulation
設定が目的のテーブルで有効になっている場合、インデックスとプロジェクションは同一でなければなりません。それ以外の場合、目的のテーブルは源のテーブルのインデックスとプロジェクションのスーパーセットを持つことができます。
REPLACE PARTITION
このクエリは、データパーティションをtable1
からtable2
にコピーし、table2
内の既存のパーティションを置き換えます。操作は原子的です。
注意点:
table1
からデータは削除されません。table1
は一時テーブルであってもかまいません。
クエリが正常に実行されるためには、以下の条件を満たす必要があります:
- 両方のテーブルは同じ構造を持っている必要があります。
- 両方のテーブルは同じパーティションキー、同じORDER BYキーおよび同じ主キーを持っている必要があります。
- 両方のテーブルは同じストレージポリシーを持っている必要があります。
- 目的のテーブルは源のテーブルに含まれるすべてのインデックスとプロジェクションを含む必要があります。もし
enforce_index_structure_match_on_partition_manipulation
設定が目的のテーブルで有効になっている場合、インデックスとプロジェクションは同一でなければなりません。それ以外の場合、目的のテーブルは源のテーブルのインデックスとプロジェクションのスーパーセットを持つことができます。
MOVE PARTITION TO TABLE
このクエリは、table_source
からtable_dest
にデータパーティションを移動します。table_source
からデータを削除します。
クエリが正常に実行されるためには、以下の条件を満たす必要があります:
- 両方のテーブルは同じ構造を持っている必要があります。
- 両方のテーブルは同じパーティションキー、同じORDER BYキーおよび同じ主キーを持っている必要があります。
- 両方のテーブルは同じストレージポリシーを持っている必要があります。
- 両方のテーブルは同じエンジンファミリー(レプリケートまたは非レプリケート)である必要があります。
- 目的のテーブルは源のテーブルに含まれるすべてのインデックスとプロジェクションを含む必要があります。もし
enforce_index_structure_match_on_partition_manipulation
設定が目的のテーブルで有効になっている場合、インデックスとプロジェクションは同一でなければなりません。それ以外の場合、目的のテーブルは源のテーブルのインデックスとプロジェクションのスーパーセットを持つことができます。
CLEAR COLUMN IN PARTITION
指定されたパーティション内の指定したカラムのすべての値をリセットします。テーブル作成時にDEFAULT
句が設定されている場合、このクエリはカラムの値を指定したデフォルト値に設定します。
例:
FREEZE PARTITION
このクエリは、指定されたパーティションのローカルバックアップを作成します。PARTITION
句が省略された場合、クエリはすべてのパーティションのバックアップを一度に作成します。
バックアッププロセス全体はサーバーを停止することなく実行されます。
古いスタイルのテーブルに対しては、パーティション名のプレフィックス(例えば2019
)を指定することができます。この場合、クエリは対応するすべてのパーティションのバックアップを作成します。パーティション式の設定については、How to set the partition expressionのセクションを参照してください。
実行時に、データスナップショットのために、クエリはテーブルデータへのハードリンクを作成します。ハードリンクは、/var/lib/clickhouse/shadow/N/...
ディレクトリに配置されます。ここで:
/var/lib/clickhouse/
は、コンフィグで指定された作業ClickHouseディレクトリです。N
はバックアップのインクリメンタル番号です。WITH NAME
パラメータが指定されている場合、'backup_name'
パラメータの値が使用され、インクリメンタル番号の代わりになります。
テーブル内のデータストレージのために一連のディスクを使用する場合、shadow/N
ディレクトリはすべてのディスクに存在し、PARTITION
式によって一致するデータパーツが格納されます。
バックアップ内の同じディレクトリ構造は、/var/lib/clickhouse/
内と同様に作成されます。クエリは、すべてのファイルに対してchmod
を実行し、それらへの書き込みを禁止します。
バックアップを作成した後は、/var/lib/clickhouse/shadow/
からリモートサーバーにデータをコピーし、その後ローカルサーバーから削除できます。なお、ALTER t FREEZE PARTITION
クエリはレプリケーションされないため、ローカルサーバーでのバックアップのみを作成します。
クエリはほぼ瞬時にバックアップを作成します(ただし、最初に、関連するテーブルに対する現在のクエリが完了するのを待ちます)。
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
指定した名前のfrozen
パーティションをディスクから削除します。PARTITION
句が省略された場合、クエリはすべてのパーティションのバックアップを一度に削除します。
CLEAR INDEX IN PARTITION
このクエリは、CLEAR COLUMN
と同様に動作しますが、カラムデータの代わりにインデックスをリセットします。
FETCH PARTITION|PART
別のサーバーからパーティションをダウンロードします。このクエリはレプリケートテーブルでのみ動作します。
このクエリは次のことを行います:
- 指定されたシャードからパーティション|パートをダウンロードします。
path-in-zookeeper
では、ZooKeeper内のシャードのパスを指定する必要があります。 - 次に、クエリはダウンロードしたデータを
table_name
テーブルのdetached
ディレクトリに配置します。データをテーブルに追加するには、ATTACH PARTITION|PARTクエリを使用します。
例:
- FETCH PARTITION
- FETCH PART
注意点:
ALTER ... FETCH PARTITION|PART
クエリはレプリケートされません。パートまたはパーティションは、ローカルサーバーのdetached
ディレクトリにのみ配置されます。ALTER TABLE ... ATTACH
クエリはレプリケートされます。データはすべてのレプリカに追加されます。データはdetached
ディレクトリから一つのレプリカに追加され、他のレプリカには隣接するレプリカから追加されます。
ダウンロード前に、システムはパーティションの存在とテーブル構造の一致を確認します。最も適切なレプリカが自動的に健全なレプリカの中から選択されます。
クエリはALTER TABLE
と呼ばれますが、テーブル構造は変更せず、テーブル内のデータも即座には変更しません。
MOVE PARTITION|PART
MergeTree
エンジンテーブル用の別のボリュームまたはディスクにパーティションまたはデータパーツを移動します。データストレージのために複数のブロックデバイスを使用するを参照してください。
ALTER TABLE t MOVE
クエリは:
- レプリケートされず、異なるレプリカが異なるストレージポリシーを持つ可能性があるためです。
- 指定されたディスクまたはボリュームが設定されていない場合、エラーを返します。また、ストレージポリシーで指定されたデータ移動の条件が適用できない場合もエラーを返します。
- データがすでにバックグラウンドプロセス、同時
ALTER TABLE t MOVE
クエリ、またはバックグラウンドデータマージの結果によって移動されている場合、エラーを返す可能性があります。この場合、ユーザーは追加の操作を行うことを避けるべきです。
例:
UPDATE IN PARTITION
指定されたフィルタリング式と一致する指定のパーティション内のデータを操作します。これはミューテーションとして実装されています。
文法:
例
参照
DELETE IN PARTITION
指定されたフィルタリング式と一致する指定のパーティション内のデータを削除します。これはミューテーションとして実装されています。
文法:
例
参照
How to Set Partition Expression
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'
。 - ATTACH PARTITIONおよびDROP DETACHED PARTクエリでは、
system.detached_parts
テーブルのname
カラムからの値を持つ文字列リテラルを使用してパートの名前を指定します。例えば、ALTER TABLE visits ATTACH PART '201901_1_1_0'
。
パーティションを指定したときの引用符の使用は、パーティション式のタイプによって異なります。例えば、String
型の場合は、その名前を引用符('
)で指定する必要があります。Date
およびInt*
型の場合は、引用符を使用する必要はありません。
上記のすべての規則は、OPTIMIZEクエリにも当てはまります。非パーティションテーブルを最適化する際に唯一のパーティションを指定する必要がある場合、式をPARTITION tuple()
に設定します。例えば:
IN PARTITION
は、UPDATEまたはDELETE式がALTER TABLE
クエリの結果として適用されるパーティションを指定します。新しいパーツは指定されたパーティションからのみ作成されます。このようにして、IN PARTITION
は、テーブルが多くのパーティションに分割されているときに負担を軽減し、データを一点ずつ更新する必要があるときに役立ちます。
ALTER ... PARTITION
クエリの例は、テスト00502_custom_partitioning_local
および00502_custom_partitioning_replicated_zookeeper
で示されています。